PageSourceSearch

https://coeliac.ie/wp-content/plugins/elementor-pro/assets/js/preloaded-elements-handlers.js?ver=3.7.5

js coeliac.ie collected 2026-10-01 14:48:15 UTC 270,190 bytes, 8,205 lines download raw bytes

1/*! elementor-pro - v3.7.5 - 31-08-2022 */
2"use strict";
3(self["webpackChunkelementor_pro"] = self["webpackChunkelementor_pro"] || []).push([["preloaded-elements-handlers"],{
4
5/***/ "../assets/dev/js/frontend/preloaded-elements-handlers.js":
6/*!****************************************************************!*\
7  !*** ../assets/dev/js/frontend/preloaded-elements-handlers.js ***!
8  \****************************************************************/
9/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
10
11
12
13var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
14
15var _frontendLegacy = _interopRequireDefault(__webpack_require__(/*! modules/animated-headline/assets/js/frontend/frontend-legacy */ "../modules/animated-headline/assets/js/frontend/frontend-legacy.js"));
16
17var _frontendLegacy2 = _interopRequireDefault(__webpack_require__(/*! modules/carousel/assets/js/frontend/frontend-legacy */ "../modules/carousel/assets/js/frontend/frontend-legacy.js"));
18
19var _frontendLegacy3 = _interopRequireDefault(__webpack_require__(/*! modules/countdown/assets/js/frontend/frontend-legacy */ "../modules/countdown/assets/js/frontend/frontend-legacy.js"));
20
21var _frontendLegacy4 = _interopRequireDefault(__webpack_require__(/*! modules/forms/assets/js/frontend/frontend-legacy */ "../modules/forms/assets/js/frontend/frontend-legacy.js"));
22
23var _frontendLegacy5 = _interopRequireDefault(__webpack_require__(/*! modules/gallery/assets/js/frontend/frontend-legacy */ "../modules/gallery/assets/js/frontend/frontend-legacy.js"));
24
25var _frontendLegacy6 = _interopRequireDefault(__webpack_require__(/*! modules/hotspot/assets/js/frontend/frontend-legacy */ "../modules/hotspot/assets/js/frontend/frontend-legacy.js"));
26
27var _frontendLegacy7 = _interopRequireDefault(__webpack_require__(/*! modules/lottie/assets/js/frontend/frontend-legacy */ "../modules/lottie/assets/js/frontend/frontend-legacy.js"));
28
29var _frontendLegacy8 = _interopRequireDefault(__webpack_require__(/*! modules/nav-menu/assets/js/frontend/frontend-legacy */ "../modules/nav-menu/assets/js/frontend/frontend-legacy.js"));
30
31var _frontendLegacy9 = _interopRequireDefault(__webpack_require__(/*! modules/popup/assets/js/frontend/frontend-legacy */ "../modules/popup/assets/js/frontend/frontend-legacy.js"));
32
33var _frontendLegacy10 = _interopRequireDefault(__webpack_require__(/*! modules/posts/assets/js/frontend/frontend-legacy */ "../modules/posts/assets/js/frontend/frontend-legacy.js"));
34
35var _frontendLegacy11 = _interopRequireDefault(__webpack_require__(/*! modules/share-buttons/assets/js/frontend/frontend-legacy */ "../modules/share-buttons/assets/js/frontend/frontend-legacy.js"));
36
37var _frontendLegacy12 = _interopRequireDefault(__webpack_require__(/*! modules/slides/assets/js/frontend/frontend-legacy */ "../modules/slides/assets/js/frontend/frontend-legacy.js"));
38
39var _frontendLegacy13 = _interopRequireDefault(__webpack_require__(/*! modules/social/assets/js/frontend/frontend-legacy */ "../modules/social/assets/js/frontend/frontend-legacy.js"));
40
41var _frontendLegacy14 = _interopRequireDefault(__webpack_require__(/*! modules/table-of-contents/assets/js/frontend/frontend-legacy */ "../modules/table-of-contents/assets/js/frontend/frontend-legacy.js"));
42
43var _frontendLegacy15 = _interopRequireDefault(__webpack_require__(/*! modules/theme-builder/assets/js/frontend/frontend-legacy */ "../modules/theme-builder/assets/js/frontend/frontend-legacy.js"));
44
45var _frontendLegacy16 = _interopRequireDefault(__webpack_require__(/*! modules/theme-elements/assets/js/frontend/frontend-legacy */ "../modules/theme-elements/assets/js/frontend/frontend-legacy.js"));
46
47var _frontendLegacy17 = _interopRequireDefault(__webpack_require__(/*! modules/woocommerce/assets/js/frontend/frontend-legacy */ "../modules/woocommerce/assets/js/frontend/frontend-legacy.js"));
48
49const extendDefaultHandlers = defaultHandlers => {
50  const handlers = {
51    animatedText: _frontendLegacy.default,
52    carousel: _frontendLegacy2.default,
53    countdown: _frontendLegacy3.default,
54    form: _frontendLegacy4.default,
55    gallery: _frontendLegacy5.default,
56    hotspot: _frontendLegacy6.default,
57    lottie: _frontendLegacy7.default,
58    nav_menu: _frontendLegacy8.default,
59    popup: _frontendLegacy9.default,
60    posts: _frontendLegacy10.default,
61    share_buttons: _frontendLegacy11.default,
62    slides: _frontendLegacy12.default,
63    social: _frontendLegacy13.default,
64    themeBuilder: _frontendLegacy15.default,
65    themeElements: _frontendLegacy16.default,
66    woocommerce: _frontendLegacy17.default,
67    tableOfContents: _frontendLegacy14.default
68  };
69  return { ...defaultHandlers,
70    ...handlers
71  };
72};
73
74elementorProFrontend.on('elementor-pro/modules/init:before', () => {
75  elementorFrontend.hooks.addFilter('elementor-pro/frontend/handlers', extendDefaultHandlers);
76});
77
78/***/ }),
79
80/***/ "../assets/dev/js/frontend/utils/icons/e-icons.js":
81/*!********************************************************!*\
82  !*** ../assets/dev/js/frontend/utils/icons/e-icons.js ***!
83  \********************************************************/
84/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
85
86
87
88var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
89
90Object.defineProperty(exports, "__esModule", ({
91  value: true
92}));
93exports.close = void 0;
94
95var _manager = _interopRequireDefault(__webpack_require__(/*! ./manager */ "../assets/dev/js/frontend/utils/icons/manager.js"));
96
97// This file is automatically generated, please don't change anything in this file.
98const iconsManager = new _manager.default('eicon');
99const close = {
100  get element() {
101    const svgData = {
102      path: 'M742 167L500 408 258 167C246 154 233 150 217 150 196 150 179 158 167 167 154 179 150 196 150 212 150 229 154 242 171 254L408 500 167 742C138 771 138 800 167 829 196 858 225 858 254 829L496 587 738 829C750 842 767 846 783 846 800 846 817 842 829 829 842 817 846 804 846 783 846 767 842 750 829 737L588 500 833 258C863 229 863 200 833 171 804 137 775 137 742 167Z',
103      width: 1000,
104      height: 1000
105    };
106    return iconsManager.createSvgElement('close', svgData);
107  }
108
109};
110exports.close = close;
111
112/***/ }),
113
114/***/ "../assets/dev/js/frontend/utils/icons/manager.js":
115/*!********************************************************!*\
116  !*** ../assets/dev/js/frontend/utils/icons/manager.js ***!
117  \********************************************************/
118/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
119
120
121
122var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
123
124Object.defineProperty(exports, "__esModule", ({
125  value: true
126}));
127exports["default"] = void 0;
128
129var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../node_modules/@babel/runtime/helpers/defineProperty.js"));
130
131class IconsManager {
132  constructor(elementsPrefix) {
133    this.prefix = `${elementsPrefix}-`;
134
135    if (!IconsManager.symbolsContainer) {
136      const symbolsContainerId = 'e-font-icon-svg-symbols';
137      IconsManager.symbolsContainer = document.getElementById(symbolsContainerId);
138
139      if (!IconsManager.symbolsContainer) {
140        IconsManager.symbolsContainer = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
141        IconsManager.symbolsContainer.setAttributeNS(null, 'style', 'display: none;');
142        IconsManager.symbolsContainer.setAttributeNS(null, 'class', symbolsContainerId);
143        document.body.appendChild(IconsManager.symbolsContainer);
144      }
145    }
146  }
147
148  createSvgElement(name, _ref) {
149    let {
150      path,
151      width,
152      height
153    } = _ref;
154    const elementName = this.prefix + name,
155          elementSelector = '#' + this.prefix + name; // Create symbol if not exist yet.
156
157    if (!IconsManager.iconsUsageList.includes(elementName)) {
158      if (!IconsManager.symbolsContainer.querySelector(elementSelector)) {
159        const symbol = document.createElementNS('http://www.w3.org/2000/svg', 'symbol');
160        symbol.id = elementName;
161        symbol.innerHTML = '<path d="' + path + '"></path>';
162        symbol.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);
163        IconsManager.symbolsContainer.appendChild(symbol);
164      }
165
166      IconsManager.iconsUsageList.push(elementName);
167    }
168
169    const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
170    svg.innerHTML = '<use xlink:href="' + elementSelector + '" />';
171    svg.setAttributeNS(null, 'class', 'e-font-icon-svg e-' + elementName);
172    return svg;
173  }
174
175}
176
177exports["default"] = IconsManager;
178(0, _defineProperty2.default)(IconsManager, "symbolsContainer", void 0);
179(0, _defineProperty2.default)(IconsManager, "iconsUsageList", []);
180
181/***/ }),
182
183/***/ "../assets/dev/js/frontend/utils/scroll.js":
184/*!*************************************************!*\
185  !*** ../assets/dev/js/frontend/utils/scroll.js ***!
186  \*************************************************/
187/***/ ((__unused_webpack_module, exports) => {
188
189
190
191Object.defineProperty(exports, "__esModule", ({
192  value: true
193}));
194exports["default"] = void 0;
195
196if (window.elementorCommon) {
197  window.elementorCommon.helpers.softDeprecated('Scroll util from "/dev/js/frontend/utils/scroll"', '3.1.0', 'elementorModules.utils.Scroll');
198}
199
200var _default = elementorModules.utils.Scroll;
201exports["default"] = _default;
202
203/***/ }),
204
205/***/ "../modules/animated-headline/assets/js/frontend/frontend-legacy.js":
206/*!**************************************************************************!*\
207  !*** ../modules/animated-headline/assets/js/frontend/frontend-legacy.js ***!
208  \**************************************************************************/
209/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
210
211
212
213var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
214
215Object.defineProperty(exports, "__esModule", ({
216  value: true
217}));
218exports["default"] = void 0;
219
220var _animatedHeadlines = _interopRequireDefault(__webpack_require__(/*! ./handlers/animated-headlines */ "../modules/animated-headline/assets/js/frontend/handlers/animated-headlines.js"));
221
222class _default extends elementorModules.Module {
223  constructor() {
224    super();
225    elementorFrontend.elementsHandler.attachHandler('animated-headline', _animatedHeadlines.default);
226  }
227
228}
229
230exports["default"] = _default;
231
232/***/ }),
233
234/***/ "../modules/animated-headline/assets/js/frontend/handlers/animated-headlines.js":
235/*!**************************************************************************************!*\
236  !*** ../modules/animated-headline/assets/js/frontend/handlers/animated-headlines.js ***!
237  \**************************************************************************************/
238/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
239
240
241
242var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
243
244Object.defineProperty(exports, "__esModule", ({
245  value: true
246}));
247exports["default"] = void 0;
248
249var _scroll = _interopRequireDefault(__webpack_require__(/*! elementor-pro/frontend/utils/scroll */ "../assets/dev/js/frontend/utils/scroll.js"));
250
251var _default = elementorModules.frontend.handlers.Base.extend({
252  svgPaths: {
253    circle: ['M325,18C228.7-8.3,118.5,8.3,78,21C22.4,38.4,4.6,54.6,5.6,77.6c1.4,32.4,52.2,54,142.6,63.7 c66.2,7.1,212.2,7.5,273.5-8.3c64.4-16.6,104.3-57.6,33.8-98.2C386.7-4.9,179.4-1.4,126.3,20.7'],
254    underline_zigzag: ['M9.3,127.3c49.3-3,150.7-7.6,199.7-7.4c121.9,0.4,189.9,0.4,282.3,7.2C380.1,129.6,181.2,130.6,70,139 c82.6-2.9,254.2-1,335.9,1.3c-56,1.4-137.2-0.3-197.1,9'],
255    x: ['M497.4,23.9C301.6,40,155.9,80.6,4,144.4', 'M14.1,27.6c204.5,20.3,393.8,74,467.3,111.7'],
256    strikethrough: ['M3,75h493.5'],
257    curly: ['M3,146.1c17.1-8.8,33.5-17.8,51.4-17.8c15.6,0,17.1,18.1,30.2,18.1c22.9,0,36-18.6,53.9-18.6 c17.1,0,21.3,18.5,37.5,18.5c21.3,0,31.8-18.6,49-18.6c22.1,0,18.8,18.8,36.8,18.8c18.8,0,37.5-18.6,49-18.6c20.4,0,17.1,19,36.8,19 c22.9,0,36.8-20.6,54.7-18.6c17.7,1.4,7.1,19.5,33.5,18.8c17.1,0,47.2-6.5,61.1-15.6'],
258    diagonal: ['M13.5,15.5c131,13.7,289.3,55.5,475,125.5'],
259    double: ['M8.4,143.1c14.2-8,97.6-8.8,200.6-9.2c122.3-0.4,287.5,7.2,287.5,7.2', 'M8,19.4c72.3-5.3,162-7.8,216-7.8c54,0,136.2,0,267,7.8'],
260    double_underline: ['M5,125.4c30.5-3.8,137.9-7.6,177.3-7.6c117.2,0,252.2,4.7,312.7,7.6', 'M26.9,143.8c55.1-6.1,126-6.3,162.2-6.1c46.5,0.2,203.9,3.2,268.9,6.4'],
261    underline: ['M7.7,145.6C109,125,299.9,116.2,401,121.3c42.1,2.2,87.6,11.8,87.3,25.7']
262  },
263
264  getDefaultSettings() {
265    const iterationDelay = this.getElementSettings('rotate_iteration_delay'),
266          settings = {
267      animationDelay: iterationDelay || 2500,
268      //letters effect
269      lettersDelay: iterationDelay * 0.02 || 50,
270      //typing effect
271      typeLettersDelay: iterationDelay * 0.06 || 150,
272      selectionDuration: iterationDelay * 0.2 || 500,
273      //clip effect
274      revealDuration: iterationDelay * 0.24 || 600,
275      revealAnimationDelay: iterationDelay * 0.6 || 1500,
276      // Highlighted headline
277      highlightAnimationDuration: this.getElementSettings('highlight_animation_duration') || 1200,
278      highlightAnimationDelay: this.getElementSettings('highlight_iteration_delay') || 8000
279    };
280    settings.typeAnimationDelay = settings.selectionDuration + 800;
281    settings.selectors = {
282      headline: '.elementor-headline',
283      dynamicWrapper: '.elementor-headline-dynamic-wrapper',
284      dynamicText: '.elementor-headline-dynamic-text'
285    };
286    settings.classes = {
287      dynamicText: 'elementor-headline-dynamic-text',
288      dynamicLetter: 'elementor-headline-dynamic-letter',
289      textActive: 'elementor-headline-text-active',
290      textInactive: 'elementor-headline-text-inactive',
291      letters: 'elementor-headline-letters',
292      animationIn: 'elementor-headline-animation-in',
293      typeSelected: 'elementor-headline-typing-selected',
294      activateHighlight: 'e-animated',
295      hideHighlight: 'e-hide-highlight'
296    };
297    return settings;
298  },
299
300  getDefaultElements() {
301    var selectors = this.getSettings('selectors');
302    return {
303      $headline: this.$element.find(selectors.headline),
304      $dynamicWrapper: this.$element.find(selectors.dynamicWrapper),
305      $dynamicText: this.$element.find(selectors.dynamicText)
306    };
307  },
308
309  getNextWord($word) {
310    return $word.is(':last-child') ? $word.parent().children().eq(0) : $word.next();
311  },
312
313  switchWord($oldWord, $newWord) {
314    $oldWord.removeClass('elementor-headline-text-active').addClass('elementor-headline-text-inactive');
315    $newWord.removeClass('elementor-headline-text-inactive').addClass('elementor-headline-text-active');
316    this.setDynamicWrapperWidth($newWord);
317  },
318
319  singleLetters() {
320    var classes = this.getSettings('classes');
321    this.elements.$dynamicText.each(function () {
322      var $word = jQuery(this),
323          letters = $word.text().split(''),
324          isActive = $word.hasClass(classes.textActive);
325      $word.empty();
326      letters.forEach(function (letter) {
327        var $letter = jQuery('<span>', {
328          class: classes.dynamicLetter
329        }).text(letter);
330
331        if (isActive) {
332          $letter.addClass(classes.animationIn);
333        }
334
335        $word.append($letter);
336      });
337      $word.css('opacity', 1);
338    });
339  },
340
341  showLetter($letter, $word, bool, duration) {
342    var self = this,
343        classes = this.getSettings('classes');
344    $letter.addClass(classes.animationIn);
345
346    if (!$letter.is(':last-child')) {
347      setTimeout(function () {
348        self.showLetter($letter.next(), $word, bool, duration);
349      }, duration);
350    } else if (!bool) {
351      setTimeout(function () {
352        self.hideWord($word);
353      }, self.getSettings('animationDelay'));
354    }
355  },
356
357  hideLetter($letter, $word, bool, duration) {
358    var self = this,
359        settings = this.getSettings();
360    $letter.removeClass(settings.classes.animationIn);
361
362    if (!$letter.is(':last-child')) {
363      setTimeout(function () {
364        self.hideLetter($letter.next(), $word, bool, duration);
365      }, duration);
366    } else if (bool) {
367      setTimeout(function () {
368        self.hideWord(self.getNextWord($word));
369      }, self.getSettings('animationDelay'));
370    }
371  },
372
373  showWord($word, $duration) {
374    var self = this,
375        settings = self.getSettings(),
376        animationType = self.getElementSettings('animation_type');
377
378    if ('typing' === animationType) {
379      self.showLetter($word.find('.' + settings.classes.dynamicLetter).eq(0), $word, false, $duration);
380      $word.addClass(settings.classes.textActive).removeClass(settings.classes.textInactive);
381    } else if ('clip' === animationType) {
382      self.elements.$dynamicWrapper.animate({
383        width: $word.width() + 10
384      }, settings.revealDuration, function () {
385        setTimeout(function () {
386          self.hideWord($word);
387        }, settings.revealAnimationDelay);
388      });
389    }
390  },
391
392  hideWord($word) {
393    var self = this,
394        settings = self.getSettings(),
395        classes = settings.classes,
396        letterSelector = '.' + classes.dynamicLetter;
397
398    if (!this.isLoopMode && $word.is(':last-child')) {
399      return;
400    }
401
402    var animationType = self.getElementSettings('animation_type'),
403        nextWord = self.getNextWord($word);
404
405    if ('typing' === animationType) {
406      self.elements.$dynamicWrapper.addClass(classes.typeSelected);
407      setTimeout(function () {
408        self.elements.$dynamicWrapper.removeClass(classes.typeSelected);
409        $word.addClass(settings.classes.textInactive).removeClass(classes.textActive).children(letterSelector).removeClass(classes.animationIn);
410      }, settings.selectionDuration);
411      setTimeout(function () {
412        self.showWord(nextWord, settings.typeLettersDelay);
413      }, settings.typeAnimationDelay);
414    } else if (self.elements.$headline.hasClass(classes.letters)) {
415      var bool = $word.children(letterSelector).length >= nextWord.children(letterSelector).length;
416      self.hideLetter($word.find(letterSelector).eq(0), $word, bool, settings.lettersDelay);
417      self.showLetter(nextWord.find(letterSelector).eq(0), nextWord, bool, settings.lettersDelay);
418      self.setDynamicWrapperWidth(nextWord);
419    } else if ('clip' === animationType) {
420      self.elements.$dynamicWrapper.animate({
421        width: '2px'
422      }, settings.revealDuration, function () {
423        self.switchWord($word, nextWord);
424        self.showWord(nextWord);
425      });
426    } else {
427      self.switchWord($word, nextWord);
428      setTimeout(function () {
429        self.hideWord(nextWord);
430      }, settings.animationDelay);
431    }
432  },
433
434  setDynamicWrapperWidth($word) {
435    const animationType = this.getElementSettings('animation_type');
436
437    if ('clip' !== animationType && 'typing' !== animationType) {
438      this.elements.$dynamicWrapper.css('width', $word.width());
439    }
440  },
441
442  animateHeadline() {
443    var self = this,
444        animationType = self.getElementSettings('animation_type'),
445        $dynamicWrapper = self.elements.$dynamicWrapper;
446
447    if ('clip' === animationType) {
448      $dynamicWrapper.width($dynamicWrapper.width() + 10);
449    } else if ('typing' !== animationType) {
450      self.setDynamicWrapperWidth(self.elements.$dynamicText);
451    } //trigger animation
452
453
454    setTimeout(function () {
455      self.hideWord(self.elements.$dynamicText.eq(0));
456    }, self.getSettings('animationDelay'));
457  },
458
459  getSvgPaths(pathName) {
460    var pathsInfo = this.svgPaths[pathName],
461        $paths = jQuery();
462    pathsInfo.forEach(function (pathInfo) {
463      $paths = $paths.add(jQuery('<path>', {
464        d: pathInfo
465      }));
466    });
467    return $paths;
468  },
469
470  addHighlight() {
471    const elementSettings = this.getElementSettings(),
472          $svg = jQuery('<svg>', {
473      xmlns: 'http://www.w3.org/2000/svg',
474      viewBox: '0 0 500 150',
475      preserveAspectRatio: 'none'
476    }).html(this.getSvgPaths(elementSettings.marker));
477    this.elements.$dynamicWrapper.append($svg[0].outerHTML);
478  },
479
480  rotateHeadline() {
481    var settings = this.getSettings(); //insert <span> for each letter of a changing word
482
483    if (this.elements.$headline.hasClass(settings.classes.letters)) {
484      this.singleLetters();
485    } //initialise headline animation
486
487
488    this.animateHeadline();
489  },
490
491  initHeadline() {
492    const headlineStyle = this.getElementSettings('headline_style');
493
494    if ('rotate' === headlineStyle) {
495      this.rotateHeadline();
496    } else if ('highlight' === headlineStyle) {
497      this.addHighlight();
498      this.activateHighlightAnimation();
499    }
500
501    this.deactivateScrollListener();
502  },
503
504  activateHighlightAnimation() {
505    const settings = this.getSettings(),
506          classes = settings.classes,
507          $headline = this.elements.$headline;
508    $headline.removeClass(classes.hideHighlight).addClass(classe
508s.activateHighlight);
509
510    if (!this.isLoopMode) {
511      return;
512    }
513
514    setTimeout(() => {
515      $headline.removeClass(classes.activateHighligh).addClass(classes.hideHighlight);
516    }, settings.highlightAnimationDuration + settings.highlightAnimationDelay * .8);
517    setTimeout(() => {
518      this.activateHighlightAnimation(false);
519    }, settings.highlightAnimationDuration + settings.highlightAnimationDelay);
520  },
521
522  activateScrollListener() {
523    const scrollBuffer = -100;
524    this.intersectionObservers.startAnimation.observer = _scroll.default.scrollObserver({
525      offset: `0px 0px ${scrollBuffer}px`,
526      callback: event => {
527        if (event.isInViewport) {
528          this.initHeadline();
529        }
530      }
531    });
532    this.intersectionObservers.startAnimation.element = this.elements.$headline[0];
533    this.intersectionObservers.startAnimation.observer.observe(this.intersectionObservers.startAnimation.element);
534  },
535
536  deactivateScrollListener() {
537    this.intersectionObservers.startAnimation.observer.unobserve(this.intersectionObservers.startAnimation.element);
538  },
539
540  onInit() {
541    elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
542    this.intersectionObservers = {
543      startAnimation: {
544        observer: null,
545        element: null
546      }
547    };
548    this.isLoopMode = 'yes' === this.getElementSettings('loop');
549    this.activateScrollListener();
550  }
551
552});
553
554exports["default"] = _default;
555
556/***/ }),
557
558/***/ "../modules/carousel/assets/js/frontend/frontend-legacy.js":
559/*!*****************************************************************!*\
560  !*** ../modules/carousel/assets/js/frontend/frontend-legacy.js ***!
561  \*****************************************************************/
562/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
563
564
565
566var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
567
568Object.defineProperty(exports, "__esModule", ({
569  value: true
570}));
571exports["default"] = void 0;
572
573var _mediaCarousel = _interopRequireDefault(__webpack_require__(/*! ./handlers/media-carousel */ "../modules/carousel/assets/js/frontend/handlers/media-carousel.js"));
574
575var _testimonialCarousel = _interopRequireDefault(__webpack_require__(/*! ./handlers/testimonial-carousel */ "../modules/carousel/assets/js/frontend/handlers/testimonial-carousel.js"));
576
577class _default extends elementorModules.Module {
578  constructor() {
579    super();
580    elementorFrontend.elementsHandler.attachHandler('media-carousel', _mediaCarousel.default);
581    elementorFrontend.elementsHandler.attachHandler('testimonial-carousel', _testimonialCarousel.default);
582    elementorFrontend.elementsHandler.attachHandler('reviews', _testimonialCarousel.default);
583  }
584
585}
586
587exports["default"] = _default;
588
589/***/ }),
590
591/***/ "../modules/carousel/assets/js/frontend/handlers/base.js":
592/*!***************************************************************!*\
593  !*** ../modules/carousel/assets/js/frontend/handlers/base.js ***!
594  \***************************************************************/
595/***/ ((__unused_webpack_module, exports) => {
596
597
598
599Object.defineProperty(exports, "__esModule", ({
600  value: true
601}));
602exports["default"] = void 0;
603
604class CarouselBase extends elementorModules.frontend.handlers.SwiperBase {
605  getDefaultSettings() {
606    return {
607      selectors: {
608        swiperContainer: '.elementor-main-swiper',
609        swiperSlide: '.swiper-slide'
610      },
611      slidesPerView: {
612        widescreen: 3,
613        desktop: 3,
614        laptop: 3,
615        tablet_extra: 3,
616        tablet: 2,
617        mobile_extra: 2,
618        mobile: 1
619      }
620    };
621  }
622
623  getDefaultElements() {
624    const selectors = this.getSettings('selectors'),
625          elements = {
626      $swiperContainer: this.$element.find(selectors.swiperContainer)
627    };
628    elements.$slides = elements.$swiperContainer.find(selectors.swiperSlide);
629    return elements;
630  }
631
632  getEffect() {
633    return this.getElementSettings('effect');
634  }
635
636  getDeviceSlidesPerView(device) {
637    const slidesPerViewKey = 'slides_per_view' + ('desktop' === device ? '' : '_' + device);
638    return Math.min(this.getSlidesCount(), +this.getElementSettings(slidesPerViewKey) || this.get
638Settings('slidesPerView')[device]);
639  }
640
641  getSlidesPerView(device) {
642    if ('slide' === this.getEffect()) {
643      return this.getDeviceSlidesPerView(device);
644    }
645
646    return 1;
647  }
648
649  getDeviceSlidesToScroll(device) {
650    const slidesToScrollKey = 'slides_to_scroll' + ('desktop' === device ? '' : '_' + device);
651    return Math.min(this.getSlidesCount(), +this.getElementSettings(slidesToScrollKey) || 1);
652  }
653
654  getSlidesToScroll(device) {
655    if ('slide' === this.getEffect()) {
656      return this.getDeviceSlidesToScroll(device);
657    }
658
659    return 1;
660  }
661
662  getSpaceBetween(device) {
663    let propertyName = 'space_between';
664
665    if (device && 'desktop' !== device) {
666      propertyName += '_' + device;
667    }
668
669    return this.getElementSettings(propertyName).size || 0;
670  }
671
672  getSwiperOptions() {
673    const elementSettings = this.getElementSettings();
674    const swiperOptions = {
675      grabCursor: true,
676      initialSlide: this.getInitialSlide(),
677      slidesPerView: this.getSlidesPerView('desktop'),
678      slidesPerGroup: this.getSlidesToScroll('desktop'),
679      spaceBetween: this.getSpaceBetween(),
680      loop: 'yes' === elementSettings.loop,
681      speed: elementSettings.speed,
682      effect: this.getEffect(),
683      preventClicksPropagation: false,
684      slideToClickedSlide: true,
685      handleElementorBreakpoints: true
686    };
687
688    if ('yes' === elementSettings.lazyload) {
689      swiperOptions.lazy = {
690        loadPrevNext: true,
691        loadPrevNextAmount: 1
692      };
693    }
694
695    if (elementSettings.show_arrows) {
696      swiperOptions.navigation = {
697        prevEl: '.elementor-swiper-button-prev',
698        nextEl: '.elementor-swiper-button-next'
699      };
700    }
701
702    if (elementSettings.pagination) {
703      swiperOptions.pagination = {
704        el: '.swiper-pagination',
705        type: elementSettings.pagination,
706        clickable: true
707      };
708    }
709
710    if ('cube' !== this.getEffect()) {
711      const breakpointsSettings = {},
712            breakpoints = elementorFrontend.config.responsive.activeBreakpoints;
713      Object.keys(breakpoints).forEach(breakpointName => {
714        breakpointsSettings[breakpoints[breakpointName].value] = {
715          slidesPerView: this.getSlidesPerView(breakpointName),
716          slidesPerGroup: this.getSlidesToScroll(breakpointName),
717          spaceBetween: this.getSpaceBetween(breakpointName)
718        };
719      });
720      swiperOptions.breakpoints = breakpointsSettings;
721    }
722
723    if (!this.isEdit && elementSettings.autoplay) {
724      swiperOptions.autoplay = {
725        delay: elementSettings.autoplay_speed,
726        disableOnInteraction: !!elementSettings.pause_on_interaction
727      };
728    }
729
730    return swiperOptions;
731  }
732
733  getDeviceBreakpointValue(device) {
734    if (!this.breakpointsDictionary) {
735      const breakpoints = elementorFrontend.config.responsive.activeBreakpoints;
736      this.breakpointsDictionary = {};
737      Object.keys(breakpoints).forEach(breakpointName => {
738        this.breakpointsDictionary[breakpointName] = breakpoints[breakpointName].value;
739      });
740    }
741
742    return this.breakpointsDictionary[device];
743  }
744
745  updateSpaceBetween(propertyName) {
746    const deviceMatch = propertyName.match('space_between_(.*)'),
747          device = deviceMatch ? deviceMatch[1] : 'desktop',
748          newSpaceBetween = this.getSpaceBetween(device);
749
750    if ('desktop' !== device) {
751      this.swiper.params.breakpoints[this.getDeviceBreakpointValue(device)].spaceBetween = newSpaceBetween;
752    } else {
753      this.swiper.params.spaceBetween = newSpaceBetween;
754    }
755
756    this.swiper.params.spaceBetween = newSpaceBetween;
757    this.swiper.update();
758  }
759
760  async onInit() {
761    elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
762
763    if (1 >= this.getSlidesCount()) {
764      return;
765    }
766
767    const Swiper = elementorFrontend.utils.swiper;
768    this.swiper = await new Swiper(this.elements.$swiperContainer, this.getSwiperOptions());
769    const elementSettings = this.getElementSettings();
770
771    if ('yes' === elementSettings.pause_on_hover) {
772      this.togglePauseOnHover(true);
773    } // Expose the swiper instance in the frontend
774
775
776    this.elements.$swiperContainer.data('swiper', this.swiper);
777  }
778
779  getChangeableProperties() {
780    return {
781      autoplay: 'autoplay',
782      pause_on_hover: 'pauseOnHover',
783      pause_on_interaction: 'disableOnInteraction',
784      autoplay_speed: 'delay',
785      speed: 'speed',
786      width: 'width'
787    };
788  }
789
790  updateSwiperOption(propertyName) {
791    if (0 === propertyName.indexOf('width')) {
792      this.swiper.update();
793      return;
794    }
795
796    const elementSettings = this.getElementSettings(),
797          newSettingValue = elementSettings[propertyName],
798          changeableProperties = this.getChangeableProperties();
799    let propertyToUpdate = changeableProperties[propertyName],
800        valueToUpdate = newSettingValue; // Handle special cases where the value to update is not the value that the Swiper library accepts
801
802    switch (propertyName) {
803      case 'autoplay':
804        if (newSettingValue) {
805          valueToUpdate = {
806            delay: elementSettings.autoplay_speed,
807            disableOnInteraction: 'yes' === elementSettings.pause_on_interaction
808          };
809        } else {
810          valueToUpdate = false;
811        }
812
813        break;
814
815      case 'autoplay_speed':
816        propertyToUpdate = 'autoplay';
817        valueToUpdate = {
818          delay: newSettingValue,
819          disableOnInteraction: 'yes' === elementSettings.pause_on_interaction
820        };
821        break;
822
823      case 'pause_on_hover':
824        this.togglePauseOnHover('yes' === newSettingValue);
825        break;
826
827      case 'pause_on_interaction':
828        valueToUpdate = 'yes' === newSettingValue;
829        break;
830    } // 'pause_on_hover' is implemented by the handler with event listeners, not the Swiper library
831
832
833    if ('pause_on_hover' !== propertyName) {
834      this.swiper.params[propertyToUpdate] = valueToUpdate;
835    }
836
837    this.swiper.update();
838  }
839
840  onElementChange(propertyName) {
841    if (1 >= this.getSlidesCount()) {
842      return;
843    }
844
845    if (0 === propertyName.indexOf('width')) {
846      this.swiper.update(); // If there is another thumbs slider, like in the Media Carousel widget.
847
848      if (this.thumbsSwiper) {
849        this.thumbsSwiper.update();
850      }
851
852      return;
853    } // This is for handling the responsive control 'space_between'.
854    // Responsive controls require a separate way of handling, and some currently don't work
855    // (Swiper bug, currently exists in v5.3.6) TODO: update Swiper when bug is fixed and handle responsive controls
856
857
858    if (0 === propertyName.indexOf('space_between')) {
859      this.updateSpaceBetween(propertyName);
860      return;
861    }
862
863    const changeableProperties = this.getChangeableProperties();
864
865    if (changeableProperties.hasOwnProperty(propertyName)) {
866      this.updateSwiperOption(propertyName);
867    }
868  }
869
870  onEditSettingsChange(propertyName) {
871    if (1 >= this.getSlidesCount()) {
872      return;
873    }
874
875    if ('activeItemIndex' === propertyName) {
876      this.swiper.slideToLoop(this.getEditSettings('activeItemIndex') - 1);
877    }
878  }
879
880}
881
882exports["default"] = CarouselBase;
883
884/***/ }),
885
886/***/ "../modules/carousel/assets/js/frontend/handlers/media-carousel.js":
887/*!*************************************************************************!*\
888  !*** ../modules/carousel/assets/js/frontend/handlers/media-carousel.js ***!
889  \*************************************************************************/
890/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
891
892
893
894var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
895
896Object.defineProperty(exports, "__esModule", ({
897  value: true
898}));
899exports["default"] = void 0;
900
901var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/carousel/assets/js/frontend/handlers/base.js"));
902
903class MediaCarousel extends _base.default {
904  isSlideshow() {
905    return 'slideshow' === this.getElementSettings('skin');
906  }
907
908  getDefaultSettings() {
909    const defaultSettings = super.getDefaultSettings(...arguments);
910
911    if (this.isSlideshow()) {
912      defaultSettings.selectors.thumbsSwiper = '.elementor-thumbnails-swiper';
913      defaultSettings.slidesPerView = {
914        widescreen: 5,
915        desktop: 5,
916        laptop: 5,
917        tablet_extra: 5,
918        tablet: 4,
919        mobile_extra: 4,
920        mobile: 3
921      };
922    }
923
924    return defaultSettings;
925  }
926
927  getSlidesPerViewSettingNames() {
928    if (!this.slideshowElementSettings) {
929      this.slideshowElementSettings = ['slides_per_view'];
930      const activeBreakpoints = elementorFrontend.config.responsive.activeBreakpoints;
931      Object.keys(activeBreakpoints).forEach(breakpointName => {
932        this.slideshowElementSettings.push('slides_per_view_' + breakpointName);
933      });
934    }
935
936    return this.slideshowElementSettings;
937  }
938
939  getElementSettings(setting) {
940    if (-1 !== this.getSlidesPerViewSettingNames().indexOf(setting) && this.isSlideshow()) {
941      setting = 'slideshow_' + setting;
942    }
943
944    return super.getElementSettings(setting);
945  }
946
947  getDefaultElements() {
948    const selectors = this.getSettings('selectors'),
949          defaultElements = super.getDefaultElements(...arguments);
950
951    if (this.isSlideshow()) {
952      defaultElements.$thumbsSwiper = this.$element.find(selectors.thumbsSwiper);
953    }
954
955    return defaultElements;
956  }
957
958  getEffect() {
959    if ('coverflow' === this.getElementSettings('skin')) {
960      return 'coverflow';
961    }
962
963    return super.getEffect();
964  }
965
966  getSlidesPerView(device) {
967    if (this.isSlideshow()) {
968      return 1;
969    }
970
971    if ('coverflow' === this.getElementSettings('skin')) {
972      return this.getDeviceSlidesPerView(device);
973    }
974
975    return super.getSlidesPerView(device);
976  }
977
978  getSwiperOptions() {
979    const options = super.getSwiperOptions();
980
981    if (this.isSlideshow()) {
982      options.loopedSlides = this.getSlidesCount();
983      delete options.pagination;
984      delete options.breakpoints;
985    }
986
987    return options;
988  }
989
990  async onInit() {
991    await super.onInit();
992    const slidesCount = this.getSlidesCount();
993
994    if (!this.isSlideshow() || 1 >= slidesCount) {
995      return;
996    }
997
998    const elementSettings = this.getElementSettings(),
999          loop = 'yes' === elementSettings.loop,
1000          breakpointsSettings = {},
1001          breakpoints = elementorFrontend.config.responsive.activeBreakpoints,
1002          desktopSlidesPerView = this.getDeviceSlidesPerView('desktop');
1003    Object.keys(breakpoints).forEach(breakpointName => {
1004      breakpointsSettings[breakpoints[breakpointName].value] = {
1005        slidesPerView: this.getDeviceSlidesPerView(breakpointName),
1006        spaceBetween: this.getSpaceBetween(breakpointName)
1007      };
1008    });
1009    const thumbsSliderOptions = {
1010      slidesPerView: desktopSlidesPerView,
1011      initialSlide: this.getInitialSlide(),
1012      centeredSlides: elementSettings.centered_slides,
1013      slideToClickedSlide: true,
1014      spaceBetween: this.getSpaceBetween(),
1015      loopedSlides: slidesCount,
1016      loop,
1017      breakpoints: breakpointsSettings,
1018      handleElementorBreakpoints: true
1019    };
1020
1021    if ('yes' === elementSettings.lazyload) {
1022      thumbsSliderOptions.lazy = {
1023        loadPrevNext: true,
1024        loadPrevNextAmount: 1
1025      };
1026    }
1027
1028    const Swiper = elementorFrontend.utils.swiper;
1029    this.swiper.controller.control = this.thumbsSwiper = await new Swiper(this.elements.$thumbsSwiper, thumbsSliderOptions); // Expose the swiper instance in the frontend
1030
1031    this.elements.$thumbsSwiper.data('swiper', this.thumbsSwiper);
1032    this.thumbsSwiper.controller.control = this.swiper;
1033  }
1034
1035}
1036
1037exports["default"] = MediaCarousel;
1038
1039/***/ }),
1040
1041/***/ "../modules/carousel/assets/js/frontend/handlers/testimonial-carousel.js":
1042/*!*******************************************************************************!*\
1043  !*** ../modules/carousel/assets/js/frontend/handlers/testimonial-carousel.js ***!
1044  \*******************************************************************************/
1045/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1046
1047
1048
1049var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
1050
1051Object.defineProperty(exports, "__esModule", ({
1052  value: true
1053}));
1054exports["default"] = void 0;
1055
1056var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/carousel/assets/js/frontend/handlers/base.js"));
1057
1058class TestimonialCarousel extends _base.default {
1059  getDefaultSettings() {
1060    const defaultSettings = super.getDefaultSettings();
1061    defaultSettings.slidesPerView = {
1062      desktop: 1
1063    };
1064    Object.keys(elementorFrontend.config.responsive.activeBreakpoints).forEach(breakpointName => {
1065      defaultSettings.slidesPerView[breakpointName] = 1;
1066    });
1067
1068    if (defaultSettings.loop) {
1069      defaultSettings.loopedSlides = this.getSlidesCount();
1070    }
1071
1072    return defaultSettings;
1073  }
1074
1075  getEffect() {
1076    return 'slide';
1077  }
1078
1079}
1080
1081exports["default"] = TestimonialCarousel;
1082
1083/***/ }),
1084
1085/***/ "../modules/countdown/assets/js/frontend/frontend-legacy.js":
1086/*!******************************************************************!*\
1087  !*** ../modules/countdown/assets/js/frontend/frontend-legacy.js ***!
1088  \******************************************************************/
1089/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1090
1091
1092
1093var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
1094
1095Object.defineProperty(exports, "__esModule", ({
1096  value: true
1097}));
1098exports["default"] = void 0;
1099
1100var _countdown = _interopRequireDefault(__webpack_require__(/*! ./handlers/countdown */ "../modules/countdown/assets/js/frontend/handlers/countdown.js"));
1101
1102class _default extends elementorModules.Module {
1103  constructor() {
1104    super();
1105    elementorFrontend.elementsHandler.attachHandler('countdown', _countdown.default);
1106  }
1107
1108}
1109
1110exports["default"] = _default;
1111
1112/***/ }),
1113
1114/***/ "../modules/countdown/assets/js/frontend/handlers/countdown.js":
1115/*!*********************************************************************!*\
1116  !*** ../modules/countdown/assets/js/frontend/handlers/countdown.js ***!
1117  \*********************************************************************/
1118/***/ ((__unused_webpack_module, exports) => {
1119
1120
1121
1122Object.defineProperty(exports, "__esModule", ({
1123  value: true
1124}));
1125exports["default"] = void 0;
1126
1127var _default = elementorModules.frontend.handlers.Base.extend({
1128  cache: null,
1129
1130  cacheElements() {
1131    const $countDown = this.$element.find('.elementor-countdown-wrapper');
1132    this.cache = {
1133      $countDown,
1134      timeInterval: null,
1135      elements: {
1136        $countdown: $countDown.find('.elementor-countdown-wrapper'),
1137        $daysSpan: $countDown.find('.elementor-countdown-days'),
1138        $hoursSpan: $countDown.find('.elementor-countdown-hours'),
1139        $minutesSpan: $countDown.find('.elementor-countdown-minutes'),
1140        $secondsSpan: $countDown.find('.elementor-countdown-seconds'),
1141        $expireMessage: $countDown.parent().find('.elementor-countdown-expire--message')
1142      },
1143      data: {
1144        id: this.$element.data('id'),
1145        endTime: new Date($countDown.data('date') * 1000),
1146        actions: $countDown.data('expire-actions'),
1147        evergreenInterval: $countDown.data('evergreen-interval')
1148      }
1149    };
1150  },
1151
1152  onInit() {
1153    elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
1154    this.cacheElements();
1155
1156    if (0 < this.cache.data.evergreenInterval) {
1157      this.cache.data.endTime = this.getEvergreenDate();
1158    }
1159
1160    this.initializeClock();
1161  },
1162
1163  updateClock() {
1164    const self = this,
1165          timeRemaining = this.getTimeRemaining(this.cache.data.endTime);
1166    jQuery.each(timeRemaining.parts, function (timePart) {
1167      const $element = self.cache.elements['$' + timePart + 'Span'];
1168      let partValue = this.toString();
1169
1170      if (1 === partValue.length) {
1171        partValue = 0 + partValue;
1172      }
1173
1174      if ($element.length) {
1175        $element.text(partValue);
1176      }
1177    });
1178
1179    if (timeRemaining.total <= 0) {
1180      clearInterval(this.cache.timeInterval);
1181      this.runActions();
1182    }
1183  },
1184
1185  initializeClock() {
1186    const self = this;
1187    this.updateClock();
1188    this.cache.timeInterval = setInterval(function () {
1189      self.updateClock();
1190    }, 1000);
1191  },
1192
1193  runActions() {
1194    const self = this; // Trigger general event for 3rd patry actions
1195
1196    self.$element.trigger('countdown_expire', self.$element);
1197
1198    if (!this.cache.data.actions) {
1199      return;
1200    }
1201
1202    this.cache.data.actions.forEach(function (action) {
1203      switch (action.type) {
1204        case 'hide':
1205          self.cache.$countDown.hide();
1206          break;
1207
1208        case 'redirect':
1209          if (action.redirect_url) {
1210            window.location.href = action.redirect_url;
1211          }
1212
1213          break;
1214
1215        case 'message':
1216          self.cache.elements.$expireMessage.show();
1217          break;
1218      }
1219    });
1220  },
1221
1222  getTimeRemaining(endTime) {
1223    const timeRemaining = endTime - new Date();
1224    let seconds = Math.floor(timeRemaining / 1000 % 60),
1225        minutes = Math.floor(timeRemaining / 1000 / 60 % 60),
1226        hours = Math.floor(timeRemaining / (1000 * 60 * 60) % 24),
1227        days = Math.floor(timeRemaining / (1000 * 60 * 60 * 24));
1228
1229    if (days < 0 || hours < 0 || minutes < 0) {
1230      seconds = minutes = hours = days = 0;
1231    }
1232
1233    return {
1234      total: timeRemaining,
1235      parts: {
1236        days,
1237        hours,
1238        minutes,
1239        seconds
1240      }
1241    };
1242  },
1243
1244  getEvergreenDate() {
1245    const self = this,
1246          id = this.cache.data.id,
1247          interval = this.cache.data.evergreenInterval,
1248          dueDateKey = id + '-evergreen_due_date',
1249          intervalKey = id + '-evergreen_interval',
1250          localData = {
1251      dueDate: localStorage.getItem(dueDateKey),
1252      interval: localStorage.getItem(intervalKey)
1253    },
1254          initEvergreen = function () {
1255      var evergreenDueDate = new Date();
1256      self.cache.data.endTime = evergreenDueDate.setSeconds(evergreenDueDate.getSeconds() + interval);
1257      localStorage.setItem(dueDateKey, self.cache.data.endTime);
1258      localStorage.setItem(intervalKey, interval);
1259      return self.cache.data.endTime;
1260    };
1261
1262    if (null === localData.dueDate && null === localData.interval) {
1263      return initEvergreen();
1264    }
1265
1266    if (null !== localData.dueDate && interval !== parseInt(localData.interval, 10)) {
1267      return initEvergreen();
1268    }
1269
1270    if (localData.dueDate > 0 && parseInt(localData.interval, 10) === interval) {
1271      return localData.dueDate;
1272    }
1273  }
1274
1275});
1276
1277exports["default"] = _default;
1278
1279/***/ }),
1280
1281/***/ "../modules/forms/assets/js/frontend/frontend-legacy.js":
1282/*!**************************************************************!*\
1283  !*** ../modules/forms/assets/js/frontend/frontend-legacy.js ***!
1284  \**************************************************************/
1285/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1286
1287
1288
1289var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
1290
1291Object.defineProperty(exports, "__esModule", ({
1292  value: true
1293}));
1294exports["default"] = void 0;
1295
1296var _formSteps = _interopRequireDefault(__webpack_require__(/*! ./handlers/form-steps */ "../modules/forms/assets/js/frontend/handlers/form-steps.js"));
1297
1298var _formSender = _interopRequireDefault(__webpack_require__(/*! ./handlers/form-sender */ "../modules/forms/assets/js/frontend/handlers/form-sender.js"));
1299
1300var _formRedirect = _interopRequireDefault(__webpack_require__(/*! ./handlers/form-redirect */ "../modules/forms/assets/js/frontend/handlers/form-redirect.js"));
1301
1302var _recaptcha = _interopRequireDefault(__webpack_require__(/*! ./handlers/recaptcha */ "../modules/forms/assets/js/frontend/handlers/recaptcha.js"));
1303
1304var _date = _interopRequireDefault(__webpack_require__(/*! ./handlers/fields/date */ "../modules/forms/assets/js/frontend/handlers/fields/date.js"));
1305
1306var _time = _interopRequireDefault(__webpack_require__(/*! ./handlers/fields/time */ "../modules/forms/assets/js/frontend/handlers/fields/time.js"));
1307
1308class _default extends elementorModules.Module {
1309  constructor() {
1310    super();
1311    const formHandlers = [_formSteps.default, _formSender.default, _formRedirect.default];
1312    elementorFrontend.elementsHandler.attachHandler('form', [...formHandlers, _recaptcha.default, _date.default, _time.default]);
1313    elementorFrontend.elementsHandler.attachHandler('subscribe', formHandlers);
1314  }
1315
1316}
1317
1318exports["default"] = _default;
1319
1320/***/ }),
1321
1322/***/ "../modules/forms/assets/js/frontend/handlers/fields/data-time-field-base.js":
1323/*!***********************************************************************************!*\
1324  !*** ../modules/forms/assets/js/frontend/handlers/fields/data-time-field-base.js ***!
1325  \***********************************************************************************/
1326/***/ ((__unused_webpack_module, exports) => {
1327
1328
1329
1330Object.defineProperty(exports, "__esModule", ({
1331  value: true
1332}));
1333exports["default"] = void 0;
1334
1335class DataTimeFieldBase extends elementorModules.frontend.handlers.Base {
1336  getDefaultSettings() {
1337    return {
1338      selectors: {
1339        fields: this.getFieldsSelector()
1340      },
1341      classes: {
1342        useNative: 'elementor-use-native'
1343      }
1344    };
1345  }
1346
1347  getDefaultElements() {
1348    const {
1349      selectors
1350    } = this.getDefaultSettings();
1351    return {
1352      $fields: this.$element.find(selectors.fields)
1353    };
1354  }
1355
1356  addPicker(element) {
1357    const {
1358      classes
1359    } = this.getDefaultSettings(),
1360          $element = jQuery(element);
1361
1362    if ($element.hasClass(classes.useNative)) {
1363      return;
1364    }
1365
1366    element.flatpickr(this.getPickerOptions(element));
1367  }
1368
1369  onInit() {
1370    super.onInit(...arguments);
1371    this.elements.$fields.each((index, element) => this.addPicker(element));
1372  }
1373
1374}
1375
1376exports["default"] = DataTimeFieldBase;
1377
1378/***/ }),
1379
1380/***/ "../modules/forms/assets/js/frontend/handlers/fields/date.js":
1381/*!*******************************************************************!*\
1382  !*** ../modules/forms/assets/js/frontend/handlers/fields/date.js ***!
1383  \*******************************************************************/
1384/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1385
1386
1387
1388var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
1389
1390Object.defineProperty(exports, "__esModule", ({
1391  value: true
1392}));
1393exports["default"] = void 0;
1394
1395var _dataTimeFieldBase = _interopRequireDefault(__webpack_require__(/*! ./data-time-field-base */ "../modules/forms/assets/js/frontend/handlers/fields/data-time-field-base.js"));
1396
1397class DateField extends _dataTimeFieldBase.default {
1398  getFieldsSelector() {
1399    return '.elementor-date-field';
1400  }
1401
1402  getPickerOptions(element) {
1403    const $element = jQuery(element);
1404    return {
1405      minDate: $element.attr('min') || null,
1406      maxDate: $element.attr('max') || null,
1407      allowInput: true
1408    };
1409  }
1410
1411}
1412
1413exports["default"] = DateField;
1414
1415/***/ }),
1416
1417/***/ "../modules/forms/assets/js/frontend/handlers/fields/time.js":
1418/*!*******************************************************************!*\
1419  !*** ../modules/forms/assets/js/frontend/handlers/fields/time.js ***!
1420  \*******************************************************************/
1421/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1422
1423
1424
1425var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
1426
1427Object.defineProperty(exports, "__esModule", ({
1428  value: true
1429}));
1430exports["default"] = void 0;
1431
1432var _dataTimeFieldBase = _interopRequireDefault(__webpack_require__(/*! ./data-time-field-base */ "../modules/forms/assets/js/frontend/handlers/fields/data-time-field-base.js"));
1433
1434class TimeField extends _dataTimeFieldBase.default {
1435  getFieldsSelector() {
1436    return '.elementor-time-field';
1437  }
1438
1439  getPickerOptions() {
1440    return {
1441      noCalendar: true,
1442      enableTime: true,
1443      allowInput: true
1444    };
1445  }
1446
1447}
1448
1449exports["default"] = TimeField;
1450
1451/***/ }),
1452
1453/***/ "../modules/forms/assets/js/frontend/handlers/form-redirect.js":
1454/*!*********************************************************************!*\
1455  !*** ../modules/forms/assets/js/frontend/handlers/form-redirect.js ***!
1456  \*********************************************************************/
1457/***/ ((__unused_webpack_module, exports) => {
1458
1459
1460
1461Object.defineProperty(exports, "__esModule", ({
1462  value: true
1463}));
1464exports["default"] = void 0;
1465
1466var _default = elementorModules.frontend.handlers.Base.extend({
1467  getDefaultSettings() {
1468    return {
1469      selectors: {
1470        form: '.elementor-form'
1471      }
1472    };
1473  },
1474
1475  getDefaultElements() {
1476    var selectors = this.getSettings('selectors'),
1477        elements = {};
1478    elements.$form = this.$element.find(selectors.form);
1479    return elements;
1480  },
1481
1482  bindEvents() {
1483    this.elements.$form.on('form_destruct', this.handleSubmit);
1484  },
1485
1486  handleSubmit(event, response) {
1487    if ('undefined' !== typeof response.data.redirect_url) {
1488      location.href = response.data.redirect_url;
1489    }
1490  }
1491
1492});
1493
1494exports["default"] = _default;
1495
1496/***/ }),
1497
1498/***/ "../modules/forms/assets/js/frontend/handlers/form-sender.js":
1499/*!*******************************************************************!*\
1500  !*** ../modules/forms/assets/js/frontend/handlers/form-sender.js ***!
1501  \*******************************************************************/
1502/***/ ((__unused_webpack_module, exports) => {
1503
1504
1505
1506Object.defineProperty(exports, "__esModule", ({
1507  value: true
1508}));
1509exports["default"] = void 0;
1510
1511var _default = elementorModules.frontend.handlers.Base.extend({
1512  getDefaultSettings() {
1513    return {
1514      selectors: {
1515        form: '.elementor-form',
1516        submitButton: '[type="submit"]'
1517      },
1518      action: 'elementor_pro_forms_send_form',
1519      ajaxUrl: elementorProFrontend.config.ajaxurl
1520    };
1521  },
1522
1523  getDefaultElements() {
1524    const selectors = this.getSettings('selectors'),
1525          elements = {};
1526    elements.$form = this.$element.find(selectors.form);
1527    elements.$submitButton = elements.$form.find(selectors.submitButton);
1528    return elements;
1529  },
1530
1531  bindEvents() {
1532    this.elements.$form.on('submit', this.handleSubmit);
1533    const $fileInput = this.elements.$form.find('input[type=file]');
1534
1535    if ($fileInput.length) {
1536      $fileInput.on('change', this.validateFileSize);
1537    }
1538  },
1539
1540  validateFileSize(event) {
1541    const $field = jQuery(event.currentTarget),
1542          files = $field[0].files;
1543
1544    if (!files.length) {
1545      return;
1546    }
1547
1548    const maxSize = parseInt($field.attr('data-maxsize')) * 1024 * 1024,
1549          maxSizeMessage = $field.attr('data-maxsize-message');
1550    const filesArray = Array.prototype.slice.call(files);
1551    filesArray.forEach(file => {
1552      if (maxSize < file.size) {
1553        $field.parent().addClass('elementor-error').append('<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">' + maxSizeMessage + '</span>').find(':input').attr('aria-invalid', 'true');
1554        this.elements.$form.trigger('error');
1555      }
1556    });
1557  },
1558
1559  beforeSend() {
1560    const $form = this.elements.$form;
1561    $form.animate({
1562      opacity: '0.45'
1563    }, 500).addClass('elementor-form-waiting');
1564    $form.find('.elementor-message').remove();
1565    $form.find('.elementor-error').removeClass('elementor-error');
1566    $form.find('div.elementor-field-group').removeClass('error').find('span.elementor-form-help-inline').remove().end().find(':input').attr('aria-invalid', 'false');
1567    this.elements.$submitButton.attr('disabled', 'disabled').find('> span').prepend('<span class="elementor-button-text elementor-form-spinner"><i class="fa fa-spinner fa-spin"></i>&nbsp;</span>');
1568  },
1569
1570  getFormData() {
1571    const formData = new FormData(this.elements.$form[0]);
1572    formData.append('action', this.getSettings('action'));
1573    formData.append('referrer', location.toString());
1574    return formData;
1575  },
1576
1577  onSuccess(response) {
1578    const $form = this.elements.$form;
1579    this.elements.$submitButton.removeAttr('disabled').find('.elementor-form-spinner').remove();
1580    $form.animate({
1581      opacity: '1'
1582    }, 100).removeClass('elementor-form-waiting');
1583
1584    if (!response.success) {
1585      if (response.data.errors) {
1586        jQuery.each(response.data.errors, function (key, title) {
1587          $form.find('#form-field-' + key).parent().addClass('elementor-error').append('<span class="elementor-message elementor-message-danger elementor-help-inline elementor-form-help-inline" role="alert">' + title + '</span>').find(':input').attr('aria-invalid', 'true');
1588        });
1589        $form.trigger('error');
1590      }
1591
1592      $form.append('<div class="elementor-message elementor-message-danger" role="alert">' + response.data.message + '</div>');
1593    } else {
1594      $form.trigger('submit_success', response.data); // For actions like redirect page
1595
1596      $form.trigger('form_destruct', response.data);
1597      $form.trigger('reset');
1598
1599      if ('undefined' !== typeof response.data.message && '' !== response.data.message) {
1600        $form.append('<div class="elementor-message elementor-message-success" role="alert">' + response.data.message + '</div>');
1601      }
1602    }
1603  },
1604
1605  onError(xhr, desc) {
1606    const $form = this.elements.$form;
1607    $form.append('<div class="elementor-message elementor-message-danger" role="alert">
1607' + desc + '</div>');
1608    this.elements.$submitButton.html(this.elements.$submitButton.text()).removeAttr('disabled');
1609    $form.animate({
1610      opacity: '1'
1611    }, 100).removeClass('elementor-form-waiting');
1612    $form.trigger('error');
1613  },
1614
1615  handleSubmit(event) {
1616    const self = this,
1617          $form = this.elements.$form;
1618    event.preventDefault();
1619
1620    if ($form.hasClass('elementor-form-waiting')) {
1621      return false;
1622    }
1623
1624    this.beforeSend();
1625    jQuery.ajax({
1626      url: self.getSettings('ajaxUrl'),
1627      type: 'POST',
1628      dataType: 'json',
1629      data: self.getFormData(),
1630      processData: false,
1631      contentType: false,
1632      success: self.onSuccess,
1633      error: self.onError
1634    });
1635  }
1636
1637});
1638
1639exports["default"] = _default;
1640
1641/***/ }),
1642
1643/***/ "../modules/forms/assets/js/frontend/handlers/form-steps.js":
1644/*!******************************************************************!*\
1645  !*** ../modules/forms/assets/js/frontend/handlers/form-steps.js ***!
1646  \******************************************************************/
1647/***/ ((__unused_webpack_module, exports) => {
1648
1649
1650
1651Object.defineProperty(exports, "__esModule", ({
1652  value: true
1653}));
1654exports["default"] = void 0;
1655
1656class FormSteps extends elementorModules.frontend.handlers.Base {
1657  getDefaultSettings() {
1658    return {
1659      selectors: {
1660        form: '.elementor-form',
1661        fieldsWrapper: '.elementor-form-fields-wrapper',
1662        fieldGroup: '.elementor-field-group',
1663        stepWrapper: '.elementor-field-type-step',
1664        stepField: '.e-field-step',
1665        submitWrapper: '.elementor-field-type-submit',
1666        submitButton: '[type="submit"]',
1667        buttons: '.e-form__buttons',
1668        buttonWrapper: '.e-form__buttons__wrapper',
1669        button: '.e-form__buttons__wrapper__button',
1670        indicator: '.e-form__indicators__indicator',
1671        indicatorProgress: '.e-form__indicators__indicator__progress',
1672        indicatorProgressMeter: '.e-form__indicators__indicator__progress__meter',
1673        formHelpInline: '.elementor-form-help-inline'
1674      },
1675      classes: {
1676        hidden: 'elementor-hidden',
1677        column: 'elementor-column',
1678        fieldGroup: 'elementor-field-group',
1679        elementorButton: 'elementor-button',
1680        step: 'e-form__step',
1681        buttons: 'e-form__buttons',
1682        buttonWrapper: 'e-form__buttons__wrapper',
1683        button: 'e-form__buttons__wrapper__button',
1684        indicators: 'e-form__indicators',
1685        indicator: 'e-form__indicators__indicator',
1686        indicatorIcon: 'e-form__indicators__indicator__icon',
1687        indicatorNumber: 'e-form__indicators__indicator__number',
1688        indicatorLabel: 'e-form__indicators__indicator__label',
1689        indicatorProgress: 'e-form__indicators__indicator__progress',
1690        indicatorProgressMeter: 'e-form__indicators__indicator__progress__meter',
1691        indicatorSeparator: 'e-form__indicators__indicator__separator',
1692        indicatorInactive: 'e-form__indicators__indicator--state-inactive',
1693        indicatorActive: 'e-form__indicators__indicator--state-active',
1694        indicatorCompleted: 'e-form__indicators__indicator--state-completed',
1695        indicatorShapeCircle: 'e-form__indicators__indicator--shape-circle',
1696        indicatorShapeSquare: 'e-form__indicators__indicator--shape-square',
1697        indicatorShapeRounded: 'e-form__indicators__indicator--shape-rounded',
1698        indicatorShapeNone: 'e-form__indicators__indicator--shape-none'
1699      }
1700    };
1701  }
1702
1703  getDefaultElements() {
1704    const {
1705      selectors
1706    } = this.getSettings(),
1707          elements = {
1708      $form: this.$element.find(selectors.form)
1709    };
1710    elements.$fieldsWrapper = elements.$form.children(selectors.fieldsWrapper);
1711    elements.$stepWrapper = elements.$fieldsWrapper.children(selectors.stepWrapper);
1712    elements.$stepField = elements.$stepWrapper.children(selectors.stepField);
1713    elements.$fieldGroup = elements.$fieldsWrapper.children(selectors.fieldGroup);
1714    elements.$submitWrapper = elements.$fieldsWrapper.children(selectors.submitWrapper);
1715    elements.$submitButton = elements.$submitWrapper.children(selectors.submitButton);
1716    return elements;
1717  }
1718
1719  onInit() {
1720    super.onInit(...arguments);
1721
1722    if (!this.isStepsExist()) {
1723      return;
1724    }
1725
1726    this.data = {
1727      steps: [],
1728      indicatorsWithObjectTags: []
1729    };
1730    this.state = {
1731      currentStep: 0,
1732      stepsType: '',
1733      stepsShape: ''
1734    };
1735    this.buildSteps();
1736    this.elements = { ...this.elements,
1737      ...this.createStepsIndicators(),
1738      ...this.createStepsButtons()
1739    };
1740    this.initProgressBar();
1741    this.extractResponsiveSizeFromSubmitWrapper();
1742  }
1743
1744  bindEvents() {
1745    if (!this.isStepsExist()) {
1746      return;
1747    }
1748
1749    this.elements.$form.on({
1750      submit: () => this.resetForm(),
1751      keydown: e => {
1752        if (13 === e.keyCode && !this.isLastStep() && 'textarea' !== e.target.localName) {
1753          e.preventDefault();
1754          this.applyStep('next');
1755        }
1756      },
1757      error: () => this.onFormError()
1758    });
1759  }
1760
1761  isStepsExist() {
1762    return this.elements.$stepWrapper.length;
1763  }
1764
1765  initProgressBar() {
1766    const stepsSettings = this.getElementSettings();
1767
1768    if ('progress_bar' === stepsSettings.step_type) {
1769      this.setProgressBar();
1770    }
1771  }
1772
1773  buildSteps() {
1774    this.elements.$stepWrapper.each((index, el) => {
1775      const {
1776        selectors,
1777        classes
1778      }
1778 = this.getSettings(),
1779            $currentStep = jQuery(el);
1780      $currentStep.addClass(classes.step).removeClass(classes.fieldGroup, classes.column);
1781
1782      if (index) {
1783        $currentStep.addClass(classes.hidden);
1784      }
1785
1786      this.setStepData($currentStep.children(selectors.stepField));
1787      $currentStep.append($currentStep.nextUntil(this.elements.$stepWrapper).not(this.elements.$submitWrapper));
1788    });
1789  }
1790
1791  setStepData($stepElement) {
1792    const dataAttributes = ['label', 'previousButton', 'nextButton', 'iconUrl', 'iconLibrary', 'icon'],
1793          stepData = {};
1794    dataAttributes.forEach(attr => {
1795      const attrValue = $stepElement.attr('data-' + attr);
1796
1797      if (attrValue) {
1798        stepData[attr] = attrValue;
1799      }
1800    });
1801    this.data.steps.push(stepData);
1802  }
1803
1804  createStepsIndicators() {
1805    const stepsSettings = this.getElementSettings(),
1806          stepsElements = {};
1807
1808    if ('none' !== stepsSettings.step_type) {
1809      const {
1810        selectors,
1811        classes
1812      } = this.getSettings(),
1813            indicatorsTypeClass = classes.indicators + '--type-' + stepsSettings.step_type,
1814            indicatorsClasses = [classes.indicators, indicatorsTypeClass];
1815      stepsElements.$indicatorsWrapper = jQuery('<div>', {
1816        class: indicatorsClasses.join(' ')
1817      });
1818      stepsElements.$indicatorsWrapper.append(this.buildIndicators());
1819      this.elements.$fieldsWrapper.before(stepsElements.$indicatorsWrapper);
1820
1821      if ('progress_bar' === stepsSettings.step_type) {
1822        stepsElements.$progressBar = stepsElements.$indicatorsWrapper.find(selectors.indicatorProgress);
1823        stepsElements.$progressBarMeter = stepsElements.$indicatorsWrapper.find(selectors.indicatorProgressMeter);
1824      } else {
1825        stepsElements.$indicators = stepsElements.$indicatorsWrapper.find(selectors.indicator);
1826        stepsElements.$currentIndicator = stepsElements.$indicators.eq(this.state.currentStep);
1827      }
1828    }
1829
1830    this.saveIndicatorsState();
1831    return stepsElements;
1832  }
1833
1834  buildIndicators() {
1835    const stepsSettings = this.getElementSettings();
1836    return 'progress_bar' === stepsSettings.step_type ? this.buildProgressBar() : this.buildIndicatorsFromStepsData();
1837  }
1838
1839  buildProgressBar() {
1840    const {
1841      classes
1842    } = this.getSettings(),
1843          $progressBar = jQuery('<div>', {
1844      class: classes.indicatorProgress
1845    }),
1846          $progressBarMeter = jQuery('<div>', {
1847      class: classes.indicatorProgressMeter
1848    });
1849    $progressBar.append($progressBarMeter);
1850    return $progressBar;
1851  }
1852
1853  getProgressBarValue() {
1854    const totalSteps = this.data.steps.length,
1855          currentStep = this.state.currentStep,
1856          percentage = currentStep ? (currentStep + 1) / totalSteps * 100 : 100 / totalSteps;
1857    return Math.floor(percentage) + '%';
1858  }
1859
1860  setProgressBar() {
1861    const progressBarValue = this.getProgressBarValue();
1862    this.updateProgressMeterCSSVariable(progressBarValue);
1863    this.elements.$progressBarMeter.text(progressBarValue);
1864  }
1865
1866  updateProgressMeterCSSVariable(value) {
1867    this.$element[0].style.setProperty('--e-form-steps-indicator-progress-meter-width', value);
1868  }
1869
1870  saveIndicatorsState() {
1871    const stepsSettings = this.getElementSettings();
1872    this.state.stepsType = stepsSettings.step_type;
1873
1874    if (!['none', 'text', 'progress_bar'].includes(stepsSettings.step_type)) {
1875      this.state.stepsShape = stepsSettings.step_icon_shape;
1876    }
1877  }
1878
1879  buildIndicatorsFromStepsData() {
1880    const indicators = [];
1881    this.data.steps.forEach((stepObj, index) => {
1882      if (index) {
1883        indicators.push(this.getStepSeparator());
1884      }
1885
1886      indicators.push(this.getStepIndicatorElement(stepObj, index));
1887    });
1888    return indicators;
1889  }
1890
1891  getStepIndicatorElement(stepObj, index) {
1892    const {
1893      classes
1894    } = this.getSettings(),
1895          stepsSettings = this.getElementSettings(),
1896          indicatorStateClass = this.getIndicatorStateClass(index),
1897          indicatorClasses = [classes.indicator, indicatorStateClass],
1898          $stepIndicator = jQuery('<div>', {
1899      class: indicatorClasses.join(' ')
1900    });
1901
1902    if (stepsSettings.step_type.includes('icon')) {
1903      $stepIndicator.append(this.getStepIconElement(stepObj));
1904    }
1905
1906    if (stepsSettings.step_type.includes('number')) {
1907      $stepIndicator.append(this.getStepNumberElement(index));
1908    }
1909
1910    if (stepsSettings.step_type.includes('text')) {
1911      $stepIndicator.append(this.getStepLabelElement(stepObj.label));
1912    }
1913
1914    return $stepIndicator;
1915  }
1916
1917  getIndicatorStateClass(index) {
1918    const {
1919      classes
1920    }
1920 = this.getSettings();
1921
1922    if (index < this.state.currentStep) {
1923      return classes.indicatorCompleted;
1924    } else if (index > this.state.currentStep) {
1925      return classes.indicatorInactive;
1926    }
1927
1928    return classes.indicatorActive;
1929  }
1930
1931  getIndicatorShapeClass() {
1932    const stepsSettings = this.getElementSettings(),
1933          {
1934      classes
1935    } = this.getSettings();
1936    return classes['indicatorShape' + this.firstLetterToUppercase(stepsSettings.step_icon_shape)];
1937  }
1938
1939  firstLetterToUppercase(str) {
1940    return str.charAt(0).toUpperCase() + str.slice(1);
1941  }
1942
1943  getStepNumberElement(index) {
1944    const {
1945      classes
1946    } = this.getSettings(),
1947          numberClasses = [classes.indicatorNumber, this.getIndicatorShapeClass()];
1948    return jQuery('<div>', {
1949      class: numberClasses.join(' '),
1950      text: index + 1
1951    });
1952  }
1953
1954  getStepIconElement(stepObj) {
1955    const {
1956      classes
1957    } = this.getSettings(),
1958          iconClasses = [classes.indicatorIcon, this.getIndicatorShapeClass()],
1959          $icon = jQuery('<div>', {
1960      class: iconClasses.join(' ')
1961    });
1962
1963    if (stepObj.icon) {
1964      $icon.html(stepObj.icon);
1965    } else {
1966      let $iconElement;
1967
1968      if (stepObj.iconLibrary) {
1969        $iconElement = jQuery('<i>', {
1970          class: stepObj.iconLibrary
1971        });
1972      } else {
1973        // Using the attributes inline when creating the object, otherwise the data attribute will not work.
1974        $iconElement = jQuery(`<object type="image/svg+xml" data="${stepObj.iconUrl}"></object>`); // Updating an indicator svg fill color, when loaded inside an object tag with a separated scope.
1975
1976        $iconElement.on('load', event => {
1977          event.target.contentDocument.querySelector('svg').style.fill = $iconElement.css('fill');
1978        }); // Storing the indicators elements that contain object tags in order to change their fill color on steps change.
1979
1980        this.data.indicatorsWithObjectTags.push($iconElement);
1981      }
1982
1983      $icon.append($iconElement);
1984    }
1985
1986    return $icon;
1987  }
1988
1989  getStepLabelElement(label) {
1990    const {
1991      classes
1992    } = this.getSettings();
1993    return jQuery('<label>', {
1994      class: classes.indicatorLabel,
1995      text: label
1996    });
1997  }
1998
1999  getStepSeparator() {
2000    const {
2001      classes
2002    } = this.getSettings();
2003    return jQuery('<div>', {
2004      class: classes.indicatorSeparator
2005    });
2006  }
2007
2008  createStepsButtons() {
2009    const {
2010      selectors
2011    } = this.getSettings(),
2012          stepsElements = {};
2013    this.injectButtonsToSteps(stepsElements);
2014    stepsElements.$buttonsContainer = this.elements.$stepWrapper.find(selectors.buttons);
2015    stepsElements.$buttonsWrappers = stepsElements.$buttonsContainer.children(selectors.buttonWrapper);
2016    return stepsElements;
2017  }
2018
2019  injectButtonsToSteps() {
2020    const totalSteps = this.elements.$stepWrapper.length;
2021    this.elements.$stepWrapper.each((index, el) => {
2022      const $el = jQuery(el),
2023            $container = this.getButtonsContainer();
2024      let $nextButton;
2025
2026      if (index) {
2027        $container.append(this.getStepButton('previous', index));
2028        $nextButton = index === totalSteps - 1 ? this.getSubmitButton() : this.getStepButton('next', index);
2029      } else {
2030        $nextButton = this.getStepButton('next', index);
2031      }
2032
2033      $container.append($nextButton);
2034      $el.append($container);
2035    });
2036  }
2037
2038  getButtonsContainer() {
2039    const {
2040      classes
2041    } = this.getSettings(),
2042          stepsSettings = this.getElementSettings(),
2043          buttonColumnWidthClasses = [classes.buttons, classes.column, 'elementor-col-' + stepsSettings.button_width];
2044    return jQuery('<div>', {
2045      class: buttonColumnWidthClasses.join(' ')
2046    });
2047  }
2048
2049  extractResponsiveSizeFromSubmitWrapper() {
2050    let sizeClasses = [];
2051    this.elements.$submitWrapper.removeClass((index, className) => {
2052      sizeClasses = className.match(/elementor-(sm|md)-[0-9]+/g)?.join(' ');
2053      return sizeClasses;
2054    });
2055    this.elements.$buttonsContainer.addClass(sizeClasses);
2056  }
2057
2058  getStepButton(buttonType, index) {
2059    const {
2060      classes
2061    }
2061 = this.getSettings(),
2062          $button = this.getButton(buttonType, index).on('click', () => this.applyStep(buttonType)),
2063          buttonWrapperClasses = [classes.fieldGroup, classes.buttonWrapper, 'elementor-field-type-' + buttonType];
2064    return jQuery('<div>', {
2065      class: buttonWrapperClasses.join(' ')
2066    }).append($button);
2067  }
2068
2069  getSubmitButton() {
2070    const {
2071      classes
2072    } = this.getSettings();
2073    this.elements.$submitButton.addClass(classes.button); // TODO: When a solution for the conditions will be found, check if can remove the elementor-col-x manipulation.
2074
2075    return this.elements.$submitWrapper.attr('class', (index, className) => {
2076      return this.replaceClassNameColSize(className, '');
2077    }).removeClass(classes.column).removeClass(classes.buttons).addClass(classes.buttonWrapper);
2078  }
2079
2080  replaceClassNameColSize(className, value) {
2081    return className.replace(/elementor-col-([0-9]+)/g, value);
2082  }
2083
2084  getButton(buttonType, index) {
2085    const {
2086      classes
2087    } = this.getSettings(),
2088          submitSizeClass = this.elements.$submitButton.attr('class').match(/elementor-size-([^\W\d]+)/g),
2089          buttonClasses = [classes.elementorButton, submitSizeClass, classes.button, classes.button + '-' + buttonType];
2090    return jQuery('<button>', {
2091      type: 'button',
2092      text: this.getButtonLabel(buttonType, index),
2093      class: buttonClasses.join(' ')
2094    });
2095  }
2096
2097  getButtonLabel(buttonType, index) {
2098    const stepsSettings = this.getElementSettings(),
2099          stepData = this.data.steps[index],
2100          buttonName = buttonType + 'Button',
2101          buttonSettingsProp = `step_${buttonType}_label`;
2102    return stepData[buttonName] || stepsSettings[buttonSettingsProp];
2103  }
2104
2105  applyStep(direction) {
2106    const nextIndex = 'next' === direction ? this.state.currentStep + 1 : this.state.currentStep - 1;
2107
2108    if ('next' === direction && !this.isFieldsValid(this.elements.$stepWrapper)) {
2109      return false;
2110    }
2111
2112    this.goToStep(nextIndex);
2113    this.state.currentStep = nextIndex;
2114
2115    if ('progress_bar' === this.state.stepsType) {
2116      this.setProgressBar();
2117    } else if ('none' !== this.state.stepsType) {
2118      this.updateIndicatorsState(direction);
2119    }
2120  }
2121
2122  goToStep(index) {
2123    const {
2124      classes
2125    } = this.getSettings();
2126    this.elements.$stepWrapper.eq(this.state.currentStep).addClass(classe
2126s.hidden);
2127    this.elements.$stepWrapper.eq(index).removeClass(classes.hidden).children(this.getSettings('selectors.fieldGroup')).first().find(':input').first().trigger('focus');
2128  }
2129
2130  isFieldsValid($stepWrapper) {
2131    let isValid = true;
2132    $stepWrapper.eq(this.state.currentStep).find('.elementor-field-group :input').each((index, el) => {
2133      if (!el.checkValidity()) {
2134        el.reportValidity();
2135        return isValid = false;
2136      }
2137    });
2138    return isValid;
2139  }
2140
2141  isLastStep() {
2142    return this.state.currentStep === this.data.steps.length - 1;
2143  }
2144
2145  resetForm() {
2146    this.state.currentStep = 0;
2147    this.resetSteps();
2148
2149    if ('progress_bar' === this.state.stepsType) {
2150      this.setProgressBar();
2151    } else if ('none' !== this.state.stepsType) {
2152      this.elements.$currentIndicator = this.elements.$indicators.eq(this.state.currentStep);
2153      this.resetIndicators();
2154    }
2155  }
2156
2157  resetSteps() {
2158    const {
2159      classes
2160    } = this.getSettings();
2161    this.elements.$stepWrapper.addClass(classes.hidden).eq(0).removeClass(classes.hidden);
2162  }
2163
2164  resetIndicators() {
2165    const {
2166      classes
2167    } = this.getSettings(),
2168          stateTypes = ['inactive', 'active', 'completed'],
2169          stateClasses = stateTypes.map(state => classes.indicator + '--state-' + state);
2170    this.elements.$indicators.removeClass(stateClasses.join(' ')).not(this.elements.$indicators.eq(0)).addClass(classe
2170s.indicatorInactive);
2171    this.elements.$indicators.eq(0).addClass(classes.indicatorActive);
2172  }
2173
2174  updateIndicatorsState(direction) {
2175    const {
2176      classes
2177    } = this.getSettings(),
2178          indicatorsClasses = {
2179      current: {
2180        remove: classes.indicatorActive,
2181        add: 'next' === direction ? classes.indicatorCompleted : classes.indicatorInactive
2182      },
2183      next: {
2184        remove: 'next' === direction ? classes.indicatorInactive : classes.indicatorCompleted,
2185        add: classes.indicatorActive
2186      }
2187    };
2188    this.elements.$currentIndicator.removeClass(indicatorsClasses.current.remove).addClass(indicatorsClasses.current.add);
2189    this.elements.$currentIndicator = this.elements.$indicators.eq(this.state.currentStep);
2190    this.elements.$currentIndicator.removeClass(indicatorsClasses.next.remove).addClass(indicatorsClasses.next.add); // Updating an indicator svg fill color, if loaded inside an object tag.
2191
2192    this.data.indicatorsWithObjectTags.forEach($element => {
2193      $element.contents().children('svg').css('fill', $element.css('fill'));
2194    });
2195  }
2196
2197  updateValue(updatedValue) {
2198    const actionsMap = {
2199      step_type: () => this.updateStepsType(),
2200      step_icon_shape: () => this.updateStepsShape(),
2201      step_next_label: () => this.updateStepButtonsLabel('next'),
2202      step_previous_label: () => this.updateStepButtonsLabel('previous')
2203    };
2204
2205    if (actionsMap[updatedValue]) {
2206      actionsMap[updatedValue]();
2207    }
2208  }
2209
2210  updateStepsType() {
2211    const stepsSettings = this.getElementSettings();
2212
2213    if (this.elements.$indicatorsWrapper) {
2214      this.elements.$indicatorsWrapper.remove();
2215    }
2216
2217    if ('none' !== stepsSettings.step_type) {
2218      this.rebuildIndicators();
2219    }
2220
2221    this.state.stepsType = stepsSettings.step_type;
2222  }
2223
2224  rebuildIndicators() {
2225    this.elements = { ...this.elements,
2226      ...this.createStepsIndicators()
2227    };
2228    this.initProgressBar();
2229  }
2230
2231  updateStepsShape() {
2232    const stepsSettings = this.getElementSettings(),
2233          {
2234      selectors,
2235      classes
2236    } = this.getSettings(),
2237          shapeClassStart = classes.indicator + '--shape-',
2238          currentShapeClass = shapeClassStart + this.state.stepsShape,
2239          newShapeClass = shapeClassStart + stepsSettings.step_icon_shape;
2240    let elementsTargetType = '';
2241
2242    if (stepsSettings.step_type.includes('icon')) {
2243      elementsTargetType = 'icon';
2244    } else if (stepsSettings.step_type.includes('number')) {
2245      elementsTargetType = 'number';
2246    }
2247
2248    this.elements.$indicators.children(selectors.indicator + '__' + elementsTargetType).removeClass(currentShapeClass).addClass(newShapeClass);
2249    this.state.stepsShape = stepsSettings.step_icon_shape;
2250  }
2251
2252  updateStepButtonsLabel(buttonType) {
2253    const {
2254      selectors
2255    } = this.getSettings(),
2256          buttonSelector = {
2257      previous: selectors.button + '-previous',
2258      next: selectors.button + '-next'
2259    };
2260    this.elements.$stepWrapper.each((index, el) => {
2261      jQuery(el).find(buttonSelector[buttonType]).text(this.getButtonLabel(buttonType, index));
2262    });
2263  }
2264
2265  onFormError() {
2266    const {
2267      selectors
2268    } = this.getSettings(),
2269          $errorStepElement = this.elements.$form.find(selectors.formHelpInline).closest(selectors.stepWrapper);
2270
2271    if ($errorStepElement.length) {
2272      this.goToStep($errorStepElement.index());
2273    }
2274  }
2275
2276  onElementChange(updatedValue) {
2277    if (!this.isStepsExist()) {
2278      return;
2279    }
2280
2281    this.updateValue(updatedValue);
2282  }
2283
2284}
2285
2286exports["default"] = FormSteps;
2287
2288/***/ }),
2289
2290/***/ "../modules/forms/assets/js/frontend/handlers/recaptcha.js":
2291/*!*****************************************************************!*\
2292  !*** ../modules/forms/assets/js/frontend/handlers/recaptcha.js ***!
2293  \*****************************************************************/
2294/***/ ((__unused_webpack_module, exports) => {
2295
2296
2297
2298Object.defineProperty(exports, "__esModule", ({
2299  value: true
2300}));
2301exports["default"] = void 0;
2302
2303class Recaptcha extends elementorModules.frontend.handlers.Base {
2304  getDefaultSettings() {
2305    return {
2306      selectors: {
2307        recaptcha: '.elementor-g-recaptcha:last',
2308        submit: 'button[type="submit"]',
2309        recaptchaResponse: '[name="g-recaptcha-response"]'
2310      }
2311    };
2312  }
2313
2314  getDefaultElements() {
2315    const {
2316      selectors
2317    } = this.getDefaultSettings(),
2318          elements = {
2319      $recaptcha: this.$element.find(selectors.recaptcha)
2320    };
2321    elements.$form = elements.$recaptcha.parents('form');
2322    elements.$submit = elements.$form.find(selectors.submit);
2323    return elements;
2324  }
2325
2326  bindEvents() {
2327    this.onRecaptchaApiReady();
2328  }
2329
2330  isActive(settings) {
2331    const {
2332      selectors
2333    } = this.getDefaultSettings();
2334    return settings.$element.find(selectors.recaptcha).length;
2335  }
2336
2337  addRecaptcha() {
2338    const settings = this.elements.$recaptcha.data(),
2339          isV2 = 'v3' !== settings.type,
2340          captchaIds = [];
2341    captchaIds.forEach(id => window.grecaptcha.reset(id));
2342    const widgetId = window.grecaptcha.render(this.elements.$recaptcha[0], settings);
2343    this.elements.$form.on('reset error', () => {
2344      window.grecaptcha.reset(widgetId);
2345    });
2346
2347    if (isV2) {
2348      this.elements.$recaptcha.data('widgetId', widgetId);
2349    } else {
2350      captchaIds.push(widgetId);
2351      this.elements.$submit.on('click', e => this.onV3FormSubmit(e, widgetId));
2352    }
2353  }
2354
2355  onV3FormSubmit(e, widgetId) {
2356    e.preventDefault();
2357    window.grecaptcha.ready(() => {
2358      const $form = this.elements.$form;
2359      grecaptcha.execute(widgetId, {
2360        action: this.elements.$recaptcha.data('action')
2361      }).then(token => {
2362        if (this.elements.$recaptchaResponse) {
2363          this.elements.$recaptchaResponse.val(token);
2364        } else {
2365          this.elements.$recaptchaResponse = jQuery('<input>', {
2366            type: 'hidden',
2367            value: token,
2368            name: 'g-recaptcha-response'
2369          });
2370          $form.append(this.elements.$recaptchaResponse);
2371        } // Support old browsers.
2372
2373
2374        const bcSupport = !$form[0].reportValidity || 'function' !== typeof $form[0].reportValidity;
2375
2376        if (bcSupport || $form[0].reportValidity()) {
2377          $form.trigger('submit');
2378        }
2379      });
2380    });
2381  }
2382
2383  onRecaptchaApiReady() {
2384    if (window.grecaptcha && window.grecaptcha.render) {
2385      this.addRecaptcha();
2386    } else {
2387      // If not ready check again by timeout..
2388      setTimeout(() => this.onRecaptchaApiReady(), 350);
2389    }
2390  }
2391
2392}
2393
2394exports["default"] = Recaptcha;
2395
2396/***/ }),
2397
2398/***/ "../modules/gallery/assets/js/frontend/frontend-legacy.js":
2399/*!****************************************************************!*\
2400  !*** ../modules/gallery/assets/js/frontend/frontend-legacy.js ***!
2401  \****************************************************************/
2402/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2403
2404
2405
2406var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
2407
2408Object.defineProperty(exports, "__esModule", ({
2409  value: true
2410}));
2411exports["default"] = void 0;
2412
2413var _handler = _interopRequireDefault(__webpack_require__(/*! ./handler */ "../modules/gallery/assets/js/frontend/handler.js"));
2414
2415class _default extends elementorModules.Module {
2416  constructor() {
2417    super();
2418    elementorFrontend.elementsHandler.attachHandler('gallery', _handler.default);
2419  }
2420
2421}
2422
2423exports["default"] = _default;
2424
2425/***/ }),
2426
2427/***/ "../modules/gallery/assets/js/frontend/handler.js":
2428/*!********************************************************!*\
2429  !*** ../modules/gallery/assets/js/frontend/handler.js ***!
2430  \********************************************************/
2431/***/ ((__unused_webpack_module, exports) => {
2432
2433
2434
2435Object.defineProperty(exports, "__esModule", ({
2436  value: true
2437}));
2438exports["default"] = void 0;
2439
2440class galleryHandler extends elementorModules.frontend.handlers.Base {
2441  getDefaultSettings() {
2442    return {
2443      selectors: {
2444        container: '.elementor-gallery__container',
2445        galleryTitles: '.elementor-gallery-title',
2446        galleryImages: '.e-gallery-image',
2447        galleryItemOverlay: '.elementor-gallery-item__overlay',
2448        galleryItemContent: '.elementor-gallery-item__content'
2449      },
2450      classes: {
2451        activeTitle: 'elementor-item-active'
2452      }
2453    };
2454  }
2455
2456  getDefaultElements() {
2457    const {
2458      selectors
2459    } = this.getSettings(),
2460          elements = {
2461      $container: this.$element.find(selectors.container),
2462      $titles: this.$element.find(selectors.galleryTitles)
2463    };
2464    elements.$items = elements.$container.children();
2465    elements.$images = elements.$items.children(selectors.galleryImages);
2466    elements.$itemsOverlay = elements.$items.children(selectors.galleryItemOverlay);
2467    elements.$itemsContent = elements.$items.children(selectors.galleryItemContent);
2468    elements.$itemsContentElements = elements.$itemsContent.children();
2469    return elements;
2470  }
2471
2472  getGallerySettings() {
2473    const settings = this.getElementSettings(),
2474          activeBreakpoints = elementorFrontend.config.responsive.activeBreakpoints,
2475          activeBreakpointsKeys = Object.keys(activeBreakpoints),
2476          breakPointSettings = {},
2477          desktopIdealRowHeight = elementorFrontend.getDeviceSetting('desktop', settings, 'ideal_row_height');
2478    activeBreakpointsKeys.forEach(breakpoint => {
2479      // The Gallery widget currently does not support widescreen.
2480      if ('widescreen' !== breakpoint) {
2481        const idealRowHeight = elementorFrontend.getDeviceSetting(breakpoint, settings, 'ideal_row_height');
2482        breakPointSettings[activeBreakpoints[breakpoint].value] = {
2483          horizontalGap: elementorFrontend.getDeviceSetting(breakpoint, settings, 'gap').size,
2484          verticalGap: elementorFrontend.getDeviceSetting(breakpoint, settings, 'gap').size,
2485          columns: elementorFrontend.getDeviceSetting(breakpoint, settings, 'columns'),
2486          idealRowHeight: idealRowHeight?.size
2487        };
2488      }
2489    });
2490    return {
2491      type: settings.gallery_layout,
2492      idealRowHeight: desktopIdealRowHeight?.size,
2493      container: this.elements.$container,
2494      columns: settings.columns,
2495      aspectRatio: settings.aspect_ratio,
2496      lastRow: 'normal',
2497      horizontalGap: elementorFrontend.getDeviceSetting('desktop', settings, 'gap').size,
2498      verticalGap: elementorFrontend.getDeviceSetting('desktop', settings, 'gap').size,
2499      animationDuration: settings.content_animation_duration,
2500      breakpoints: breakPointSettings,
2501      rtl: elementorFrontend.config.is_rtl,
2502      lazyLoad: 'yes' === settings.lazyload
2503    };
2504  }
2505
2506  initGallery() {
2507    this.gallery = new EGallery(this.getGallerySettings());
2508    this.toggleAllAnimationsClasses();
2509  }
2510
2511  removeAnimationClasses($element) {
2512    $element.removeClass((index, className) => (className.match(/elementor-animated-item-\S+/g) || []).join(' '));
2513  }
2514
2515  toggleOverlayHoverAnimation() {
2516    this.removeAnimationClasses(this.elements.$itemsOverlay);
2517    const hoverAnimation = this.getElementSettings('background_overlay_hover_animation');
2518
2519    if (hoverAnimation) {
2520      this.elements.$itemsOverlay.addClass('elementor-animated-item--' + hoverAnimation);
2521    }
2522  }
2523
2524  toggleOverlayContentAnimation() {
2525    this.removeAnimationClasses(this.elements.$itemsContentElements);
2526    const contentHoverAnimation = this.getElementSettings('content_hover_animation');
2527
2528    if (contentHoverAnimation) {
2529      this.elements.$itemsContentElements.addClass('elementor-animated-item--' + contentHoverAnimation);
2530    }
2531  }
2532
2533  toggleOverlayContentSequencedAnimation() {
2534    this.elements.$itemsContent.toggleClass('elementor-gallery--sequenced-animation', 'yes' === this.getElementSettings('content_sequenced_animation'));
2535  }
2536
2537  toggleImageHoverAnimation() {
2538    const imageHoverAnimation = this.getElementSettings('image_hover_animation');
2539    this.removeAnimationClasses(this.elements.$images);
2540
2541    if (imageHoverAnimation) {
2542      this.elements.$images.addClass('elementor-animated-item--' + imageHoverAnimation);
2543    }
2544  }
2545
2546  toggleAllAnimationsClasses() {
2547    const elementSettings = this.getElementSettings(),
2548          animation = elementSettings.background_overlay_hover_animation || elementSettings.content_hover_animation || elementSettings.image_hover_animation;
2549    this.elements.$items.toggleClass('elementor-animated-content', !!animation);
2550    this.toggleImageHoverAnimation();
2551    this.toggleOverlayHoverAnimation();
2552    this.toggleOverlayContentAnimation();
2553    this.toggleOverlayContentSequencedAnimation();
2554  }
2555
2556  toggleAnimationClasses(settingKey) {
2557    if ('content_sequenced_animation' === settingKey) {
2558      this.toggleOverlayContentSequencedAnimation();
2559    }
2560
2561    if ('background_overlay_hover_animation' === settingKey) {
2562      this.toggleOverlayHoverAnimation();
2563    }
2564
2565    if ('content_hover_animation' === settingKey) {
2566      this.toggleOverlayContentAnimation();
2567    }
2568
2569    if ('image_hover_animation' === settingKey) {
2570      this.toggleImageHoverAnimation();
2571    }
2572  }
2573
2574  setGalleryTags(id) {
2575    this.gallery.setSettings('tags', 'all' === id ? [] : ['' + id]);
2576  }
2577
2578  bindEvents() {
2579    this.elements.$titles.on('click', this.galleriesNavigationListener.bind(this));
2580  }
2581
2582  galleriesNavigationListener(event) {
2583    const classes = this.getSettings('classes'),
2584          clickedElement = jQuery(event.target); // Make sure no other gallery title has an active class
2585
2586    this.elements.$titles.removeClass(classes.activeTitle); // Give the gallery being activated the active class
2587
2588    clickedElement.addClass(classes.activeTitle);
2589    this.setGalleryTags(clickedElement.data('gallery-index'));
2590
2591    const updateLightboxGroup = () => this.setLightboxGalleryIndex(clickedElement.data('gallery-index')); // Wait for the gallery to filter before grouping items for the Light-box
2592
2593
2594    setTimeout(updateLightboxGroup, 1000);
2595  }
2596
2597  setLightboxGalleryIndex() {
2598    let index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'all';
2599
2600    if ('all' === index) {
2601      return this.elements.$items.attr('data-elementor-lightbox-slideshow', 'all_' + this.getID());
2602    }
2603
2604    this.elements.$items.not('.e-gallery-item--hidden').attr('data-elementor-lightbox-slideshow', index + '_' + this.getID());
2605  }
2606
2607  onInit() {
2608    super.onInit(...arguments);
2609
2610    if (elementorFrontend.isEditMode() && 1 <= this.$element.find('.elementor-widget-empty-icon').length) {
2611      this.$element.addClass('elementor-widget-empty');
2612    }
2613
2614    if (!this.elements.$container.length) {
2615      return;
2616    }
2617
2618    this.initGallery();
2619    this.elements.$titles.first().trigger('click');
2620  }
2621
2622  getSettingsDictionary() {
2623    if (this.settingsDictionary) {
2624      return this.settingsDictionary;
2625    }
2626
2627    const activeBreakpoints = elementorFrontend.config.responsive.activeBreakpoints,
2628          activeBreakpointsKeys = Object.keys(activeBreakpoints);
2629    const settingsDictionary = {
2630      columns: ['columns'],
2631      gap: ['horizontalGap', 'verticalGap'],
2632      ideal_row_height: ['idealRowHeight']
2633    };
2634    activeBreakpointsKeys.forEach(breakpoint => {
2635      // The Gallery widget currently does not support widescreen.
2636      if ('widescreen' === breakpoint) {
2637        return;
2638      }
2639
2640      settingsDictionary['columns_' + breakpoint] = ['breakpoints.' + activeBreakpoints[breakpoint].value + '.columns'];
2641      settingsDictionary['gap_' + breakpoint] = ['breakpoints.' + activeBreakpoints[breakpoint].value + '.horizontalGap', 'breakpoints.' + activeBreakpoints[breakpoint].value + '.verticalGap'];
2642      settingsDictionary['ideal_row_height_' + breakpoint] = ['breakpoints.' + activeBreakpoints[breakpoint].value + '.idealRowHeight'];
2643    });
2644    settingsDictionary.aspect_ratio = ['aspectRatio'];
2645    this.settingsDictionary = settingsDictionary;
2646    return this.settingsDictionary;
2647  }
2648
2649  onElementChange(settingKey) {
2650    if (-1 !== ['background_overlay_hover_animation', 'content_hover_animation', 'image_hover_animation', 'content_sequenced_animation'].indexOf(settingKey)) {
2651      this.toggleAnimationClasses(settingKey);
2652      return;
2653    }
2654
2655    const settingsDictionary = this.getSettingsDictionary();
2656    const settingsToUpdate = settingsDictionary[settingKey];
2657
2658    if (settingsToUpdate) {
2659      const gallerySettings = this.getGallerySettings();
2660      settingsToUpdate.forEach(settingToUpdate => {
2661        this.gallery.setSettings(settingToUpdate, this.getItems(gallerySettings, settingToUpdate));
2662      });
2663    }
2664  }
2665
2666  onDestroy() {
2667    super.onDestroy();
2668
2669    if (this.gallery) {
2670      this.gallery.destroy();
2671    }
2672  }
2673
2674}
2675
2676exports["default"] = galleryHandler;
2677
2678/***/ }),
2679
2680/***/ "../modules/hotspot/assets/js/frontend/frontend-legacy.js":
2681/*!****************************************************************!*\
2682  !*** ../modules/hotspot/assets/js/frontend/frontend-legacy.js ***!
2683  \****************************************************************/
2684/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2685
2686
2687
2688var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
2689
2690Object.defineProperty(exports, "__esModule", ({
2691  value: true
2692}));
2693exports["default"] = void 0;
2694
2695var _hotspot = _interopRequireDefault(__webpack_require__(/*! ./handlers/hotspot */ "../modules/hotspot/assets/js/frontend/handlers/hotspot.js"));
2696
2697class _default extends elementorModules.Module {
2698  constructor() {
2699    super();
2700    elementorFrontend.elementsHandler.attachHandler('hotspot', _hotspot.default);
2701  }
2702
2703}
2704
2705exports["default"] = _default;
2706
2707/***/ }),
2708
2709/***/ "../modules/hotspot/assets/js/frontend/handlers/hotspot.js":
2710/*!*****************************************************************!*\
2711  !*** ../modules/hotspot/assets/js/frontend/handlers/hotspot.js ***!
2712  \*****************************************************************/
2713/***/ ((__unused_webpack_module, exports) => {
2714
2715
2716
2717Object.defineProperty(exports, "__esModule", ({
2718  value: true
2719}));
2720exports["default"] = void 0;
2721
2722class Hotspot extends elementorModules.frontend.handlers.Base {
2723  getDefaultSettings() {
2724    return {
2725      selectors: {
2726        hotspot: '.e-hotspot',
2727        tooltip: '.e-hotspot__tooltip'
2728      }
2729    };
2730  }
2731
2732  getDefaultElements() {
2733    const selectors = this.getSettings('selectors');
2734    return {
2735      $hotspot: this.$element.find(selectors.hotspot),
2736      $hotspotsExcludesLinks: this.$element.find(selectors.hotspot).filter(':not(.e-hotspot--no-tooltip)'),
2737      $tooltip: this.$element.find(selectors.tooltip)
2738    };
2739  }
2740
2741  bindEvents() {
2742    const tooltipTrigger = this.getCurrentDeviceSetting('tooltip_trigger'),
2743          tooltipTriggerEvent = 'mouseenter' === tooltipTrigger ? 'mouseleave mouseenter' : tooltipTrigger;
2744
2745    if (tooltipTriggerEvent !== 'none') {
2746      this.elements.$hotspotsExcludesLinks.on(tooltipTriggerEvent, event => this.onHotspotTriggerEvent(event));
2747    }
2748  }
2749
2750  onDeviceModeChange() {
2751    this.elements.$hotspotsExcludesLinks.off();
2752    this.bindEvents();
2753  }
2754
2755  onHotspotTriggerEvent(event) {
2756    const elementTarget = jQuery(event.target),
2757          isHotspotButtonEvent = elementTarget.closest('.e-hotspot__button').length,
2758          isTooltipMouseLeave = 'mouseleave' === event.type && (elementTarget.is('.e-hotspot--tooltip-position') || elementTarget.parents('.e-hotspot--tooltip-position').length),
2759          isMobile = 'mobile' === elementorFrontend.getCurrentDeviceMode(),
2760          isHotspotLink = elementTarget.closest('.e-hotspot--link').length,
2761          triggerTooltip = !(isHotspotLink && isMobile && ('mouseleave' === event.type || 'mouseenter' === event.type));
2762
2763    if (triggerTooltip && (isHotspotButtonEvent || isTooltipMouseLeave)) {
2764      const currentHotspot = jQuery(event.currentTarget);
2765      this.elements.$hotspot.not(currentHotspot).removeClass('e-hotspot--active');
2766      currentHotspot.toggleClass('e-hotspot--active');
2767    }
2768  } // Fix bad UX of "Sequenced Animation" when editing other controls
2769
2770
2771  editorAddSequencedAnimation() {
2772    this.elements.$hotspot.toggleClass('e-hotspot--sequenced', 'yes' === this.getElementSettings('hotspot_sequenced_animation'));
2773  }
2774
2775  hotspotSequencedAnimation() {
2776    const elementSettings = this.getElementSettings(),
2777          isSequencedAnimation = elementSettings.hotspot_sequenced_animation;
2778
2779    if ('no' === isSequencedAnimation) {
2780      return;
2781    } //start sequenced animation when element on viewport
2782
2783
2784    const hotspotObserver = elementorModules.utils.Scroll.scrollObserver({
2785      callback: event => {
2786        if (event.isInViewport) {
2787          hotspotObserver.unobserve(this.$element[0]); //add delay for each hotspot
2788
2789          this.elements.$hotspot.each((index, element) => {
2790            if (0 === index) {
2791              return;
2792            }
2793
2794            const sequencedAnimation = elementSettings.hotspot_sequenced_animation_duration,
2795                  sequencedAnimationDuration = sequencedAnimation ? sequencedAnimation.size : 1000,
2796                  animationDelay = index * (sequencedAnimationDuration / this.elements.$hotspot.length);
2797            element.style.animationDelay = animationDelay + 'ms';
2798          });
2799        }
2800      }
2801    });
2802    hotspotObserver.observe(this.$element[0]);
2803  }
2804
2805  setTooltipPositionControl() {
2806    const elementSettings = this.getElementSettings(),
2807          isDirectionAnimation = 'undefined' !== typeof elementSettings.tooltip_animation && elementSettings.tooltip_animation.match(/^e-hotspot--(slide|fade)-direction/);
2808
2809    if (isDirectionAnimation) {
2810      this.elements.$tooltip.removeClass('e-hotspot--tooltip-animation-from-left e-hotspot--tooltip-animation-from-top e-hotspot--tooltip-animation-from-right e-hotspot--tooltip-animation-from-bottom');
2811      this.elements.$tooltip.addClass('e-hotspot--tooltip-animation-from-' + elementSettings.tooltip_position);
2812    }
2813  }
2814
2815  onInit() {
2816    super.onInit(...arguments);
2817    this.hotspotSequencedAnimation();
2818    this.setTooltipPositionControl();
2819
2820    if (window.elementor) {
2821      elementor.listenTo(elementor.channels.deviceMode, 'change', () => this.onDeviceModeChange());
2822    }
2823  }
2824
2825  onElementChange(propertyName) {
2826    if (propertyName.startsWith('tooltip_position')) {
2827      this.setTooltipPositionControl();
2828    }
2829
2830    if (propertyName.startsWith('hotspot_sequenced_animation')) {
2831      this.editorAddSequencedAnimation();
2832    }
2833  }
2834
2835}
2836
2837exports["default"] = Hotspot;
2838
2839/***/ }),
2840
2841/***/ "../modules/lottie/assets/js/frontend/frontend-legacy.js":
2842/*!***************************************************************!*\
2843  !*** ../modules/lottie/assets/js/frontend/frontend-legacy.js ***!
2844  \***************************************************************/
2845/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2846
2847
2848
2849var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
2850
2851Object.defineProperty(exports, "__esModule", ({
2852  value: true
2853}));
2854exports["default"] = void 0;
2855
2856var _handler = _interopRequireDefault(__webpack_require__(/*! ./handler */ "../modules/lottie/assets/js/frontend/handler.js"));
2857
2858class _default extends elementorModules.Module {
2859  constructor() {
2860    super();
2861    elementorFrontend.elementsHandler.attachHandler('lottie', _handler.default);
2862  }
2863
2864}
2865
2866exports["default"] = _default;
2867
2868/***/ }),
2869
2870/***/ "../modules/lottie/assets/js/frontend/handler.js":
2871/*!*******************************************************!*\
2872  !*** ../modules/lottie/assets/js/frontend/handler.js ***!
2873  \*******************************************************/
2874/***/ ((__unused_webpack_module, exports) => {
2875
2876
2877
2878Object.defineProperty(exports, "__esModule", ({
2879  value: true
2880}));
2881exports["default"] = void 0;
2882
2883class lottieHandler extends elementorModules.frontend.handlers.Base {
2884  getDefaultSettings() {
2885    return {
2886      selectors: {
2887        container: '.e-lottie__container',
2888        containerLink: '.e-lottie__container__link',
2889        animation: '.e-lottie__animation',
2890        caption: '.e-lottie__caption'
2891      },
2892      classes: {
2893        caption: 'e-lottie__caption'
2894      }
2895    };
2896  }
2897
2898  getDefaultElements() {
2899    const {
2900      selectors
2901    } = this.getSettings();
2902    return {
2903      $widgetWrapper: this.$element,
2904      $container: this.$element.find(selectors.container),
2905      $containerLink: this.$element.find(selectors.containerLink),
2906      $animation: this.$element.find(selectors.animation),
2907      $caption: this.$element.find(selectors.caption),
2908      $sectionParent: this.$element.closest('.elementor-section'),
2909      $columnParent: this.$element.closest('.elementor-column')
2910    };
2911  }
2912
2913  onInit() {
2914    super.onInit(...arguments);
2915    this.lottie = null;
2916    this.state = {
2917      isAnimationScrollUpdateNeededOnFirstLoad: true,
2918      isNewLoopCycle: false,
2919      isInViewport: false,
2920      loop: false,
2921      animationDirection: 'forward',
2922      currentAnimationTrigger: '',
2923      effectsRelativeTo: '',
2924      hoverOutMode: '',
2925      hoverArea: '',
2926      caption: '',
2927      playAnimationCount: 0,
2928      animationSpeed: 0,
2929      linkTimeout: 0,
2930      viewportOffset: {
2931        start: 0,
2932        end: 100
2933      }
2934    };
2935    this.intersectionObservers = {
2936      animation: {
2937        observer: null,
2938        element: null
2939      },
2940      lazyload: {
2941        observer: null,
2942        element: null
2943      }
2944    };
2945    this.animationFrameRequest = {
2946      timer: null,
2947      lastScrollY: 0
2948    };
2949    this.listeners = {
2950      collection: [],
2951      elements: {
2952        $widgetArea: {
2953          triggerAnimationHoverIn: null,
2954          triggerAnimationHoverOut: null
2955        },
2956        $container: {
2957          triggerAnimationClick: null
2958        }
2959      }
2960    };
2961    this.initLottie();
2962  }
2963
2964  initLottie() {
2965    const lottieSettings = this.getLottieSettings();
2966
2967    if (lottieSettings.lazyload) {
2968      this.lazyloadLottie();
2969    } else {
2970      this.generateLottie();
2971    }
2972  }
2973
2974  lazyloadLottie() {
2975    const bufferHeightBeforeTriggerLottie = 200;
2976    this.intersectionObservers.lazyload.observer = elementorModules.utils.Scroll.scrollObserver({
2977      offset: `0px 0px ${bufferHeightBeforeTriggerLottie}px`,
2978      callback: event => {
2979        if (event.isInViewport) {
2980          this.generateLottie();
2981          this.intersectionObservers.lazyload.observer.unobserve(this.intersectionObservers.lazyload.element);
2982        }
2983      }
2984    });
2985    this.intersectionObservers.lazyload.element = this.elements.$container[0];
2986    this.intersectionObservers.lazyload.observer.observe(this.intersectionObservers.lazyload.element);
2987  }
2988
2989  generateLottie() {
2990    this.createLottieInstance();
2991    this.setLottieEvents();
2992  }
2993
2994  createLottieInstance() {
2995    const lottieSettings = this.getLottieSettings();
2996    this.lottie = bodymovin.loadAnimation({
2997      container: this.elements.$animation[0],
2998      path: this.getAnimationPath(),
2999      renderer: lottieSettings.renderer,
3000      autoplay: false,
3001      // We always want to trigger the animation manually for considering start/end frame.
3002      name: 'lottie-widget'
3003    }); // Expose the lottie instance in the frontend.
3004
3005    this.elements.$animation.data('lottie', this.lottie);
3006  }
3007
3008  getAnimationPath() {
3009    const lottieSettings = this.getLottieSettings();
3010
3011    if (lottieSettings.source_json?.url && 'json' === lottieSettings.source_json.url.toLowerCase().substr(-4)) {
3012      return lottieSettings.source_json.url;
3013    } else if (lottieSettings.source_external_url?.url) {
3014      return lottieSettings.source_external_url.url;
3015    } // Default animation path.
3016
3017
3018    return elementorProFrontend.config.lottie.defaultAnimationUrl;
3019  }
3020
3021  setCaption() {
3022    const lottieSettings = this.getLottieSettings();
3023
3024    if ('external_url' === lottieSettings.source || 'media_file' === lottieSettings.source && 'custom' === lottieSettings.caption_source) {
3025      const $captionElement = this.getCaptionElement();
3026      $captionElement.text(lottieSettings.caption);
3027    }
3028  }
3029
3030  getCaptionElement() {
3031    if (!this.elements.$caption.length) {
3032      const {
3033        classes
3034      }
3034 = this.getSettings();
3035      this.elements.$caption = jQuery('<p>', {
3036        class: classes.caption
3037      });
3038      this.elements.$container.append(this.elements.$caption);
3039      return this.elements.$caption;
3040    }
3041
3042    return this.elements.$caption;
3043  }
3044
3045  setLottieEvents() {
3046    this.lottie.addEventListener('DOMLoaded', () => this.onLottieDomLoaded());
3047    this.lottie.addEventListener('complete', () => this.onComplete());
3048  }
3049
3050  saveInitialValues() {
3051    const lottieSettings = this.getLottieSettings();
3052    /*
3053    These values of the animation are being changed during the animation runtime
3054    and saved in the lottie instance (and not in the state) for the instance expose in the frontend.
3055     */
3056
3057    this.lottie.__initialTotalFrames = this.lottie.totalFrames;
3058    this.lottie.__initialFirstFrame = this.lottie.firstFrame;
3059    this.state.currentAnimationTrigger = lottieSettings.trigger;
3060    this.state.effectsRelativeTo = lottieSettings.effects_relative_to;
3061    this.state.viewportOffset.start = lottieSettings.viewport ? lottieSettings.viewport.sizes.start : 0;
3062    this.state.viewportOffset.end = lottieSettings.viewport ? lottieSettings.viewport.sizes.end : 100;
3063    this.state.animationSpeed = lottieSettings.play_speed?.size;
3064    this.state.linkTimeout = lottieSettings.link_timeout;
3065    this.state.caption = lottieSettings.caption;
3066    this.state.loop = lottieSettings.loop;
3067  }
3068
3069  setAnimationFirstFrame() {
3070    const frame = this.getAnimationFrames();
3071    /*
3072    We need to subtract the initial first frame from the first frame for handling scenarios
3073    when the animation first frame is not 0, this way we always get the relevant first frame.
3074    example: when start point is 70 and initial first frame is 60, the animation should start at 10.
3075     */
3076
3077    frame.first = frame.first - this.lottie.__initialFirstFrame;
3078    this.lottie.goToAndStop(frame.first, true);
3079  }
3080
3081  initAnimationTrigger() {
3082    const lottieSettings = this.getLottieSettings();
3083
3084    switch (lottieSettings.trigger) {
3085      case 'none':
3086        this.playLottie();
3087        break;
3088
3089      case 'arriving_to_viewport':
3090        this.playAnimationWhenArrivingToViewport();
3091        break;
3092
3093      case 'bind_to_scroll':
3094        this.playAnimationWhenBindToScroll();
3095        break;
3096
3097      case 'on_click':
3098        this.bindAnimationClickEvents();
3099        break;
3100
3101      case 'on_hover':
3102        this.bindAnimationHoverEvents();
3103        break;
3104    }
3105  }
3106
3107  playAnimationWhenArrivingToViewport() {
3108    const offset = this.getOffset();
3109    this.intersectionObservers.animation.observer = elementorModules.utils.Scroll.scrollObserver({
3110      offset: `${offset.end}% 0% ${offset.start}%`,
3111      callback: event => {
3112        if (event.isInViewport) {
3113          this.state.isInViewport = true;
3114          this.playLottie();
3115        } else {
3116          this.state.isInViewport = false;
3117          this.lottie.pause();
3118        }
3119      }
3120    });
3121    this.intersectionObservers.animation.element = this.elements.$widgetWrapper[0];
3122    this.intersectionObservers.animation.observer.observe(this.intersectionObservers.animation.element);
3123  }
3124
3125  getOffset() {
3126    const lottieSettings = this.getLottieSettings(),
3127          start = -lottieSettings.viewport.sizes.start || 0,
3128          end = -(100 - lottieSettings.viewport.sizes.end) || 0;
3129    return {
3130      start,
3131      end
3132    };
3133  }
3134
3135  playAnimationWhenBindToScroll() {
3136    const lottieSettings = this.getLottieSettings(),
3137          offset = this.getOffset(); // Generate scroll detection by Intersection Observer API
3138
3139    this.intersectionObservers.animation.observer = elementorModules.utils.Scroll.scrollObserver({
3140      offset: `${offset.end}% 0% ${offset.start}%`,
3141      callback: event => this.onLottieIntersection(event)
3142    });
3143    this.intersectionObservers.animation.element = 'viewport' === lottieSettings.effects_relative_to ? this.elements.$widgetWrapper[0] : document.documentElement;
3144    this.intersectionObservers.animation.observer.observe(this.intersectionObservers.animation.element);
3145  }
3146
3147  updateAnimationByScrollPosition() {
3148    const lottieSettings = this.getLottieSettings();
3149    let percentage;
3150
3151    if ('page' === lottieSettings.effects_relative_to) {
3152      percentage = this.getLottiePagePercentage();
3153    } else if ('fixed' === this.getCurrentDeviceSetting('_position')) {
3154      percentage = this.getLottieViewportHeightPercentage();
3155    } else {
3156      percentage = this.getLottieViewportPercentage();
3157    }
3158
3159    let nextFrameToPlay = this.getFrameNumberByPercent(percentage);
3160    nextFrameToPlay = nextFrameToPlay - this.lottie.__initialFirstFrame;
3161    this.lottie.goToAndStop(nextFrameToPlay, true);
3162  }
3163
3164  getLottieViewportPercentage() {
3165    return elementorModules.utils.Scroll.getElementViewportPercentage(this.elements.$widgetWrapper, this.getOffset());
3166  }
3167
3168  getLottiePagePercentage() {
3169    return elementorModules.utils.Scroll.getPageScrollPercentage(this.getOffset());
3170  }
3171
3172  getLottieViewportHeightPercentage() {
3173    return elementorModules.utils.Scroll.getPageScrollPercentage(this.getOffset(), window.innerHeight);
3174  }
3175  /**
3176   * @param {number} percent - Percent value between 0-100
3177   */
3178
3179
3180  getFrameNumberByPercent(percent) {
3181    const frame = this.getAnimationFrames();
3182    /*
3183    In mobile devices the document height can be 'stretched' at the top and bottom points of the document,
3184    this 'stretched' will make percent to be either negative or larger than 100, therefore we need to limit percent between 0-100.
3185    */
3186
3187    percent = Math.min(100, Math.max(0, percent)); // Getting frame number by percent of range, considering start/end frame values if exist.
3188
3189    return frame.first + (frame.last - frame.first) * percent / 100;
3190  }
3191
3192  getAnimationFrames() {
3193    const lottieSettings = this.getLottieSettings(),
3194          currentFrame = this.getAnimationCurrentFrame(),
3195          startPoint = this.getAnimationRange().start,
3196          endPoint = this.getAnimationRange().end;
3197    let firstFrame = this.lottie.__initialFirstFrame,
3198        lastFrame = 0 === this.lottie.__initialFirstFrame ? this.lottie.__initialTotalFrames : this.lottie.__initialFirstFrame + this.lottie.__initialTotalFrames; // Limiting min start point to animation first frame.
3199
3200    if (startPoint && startPoint > firstFrame) {
3201      firstFrame = startPoint;
3202    } // limiting max end point to animation last frame.
3203
3204
3205    if (endPoint && endPoint < lastFrame) {
3206      lastFrame = endPoint;
3207    }
3208    /*
3209    Getting the relevant first frame after loop complete and when not bind to scroll.
3210    when the animation is in progress (no when a new loop start), the first frame should be the current frame.
3211    when the trigger is bind_to_scroll we DON'T need to get this functionality.
3212    */
3213
3214
3215    if (!this.state.isNewLoopCycle && 'bind_to_scroll' !== lottieSettings.trigger) {
3216      // When we have a custom start point, we need to check if the start point is larger than the last pause stop of the animation.
3217      firstFrame = startPoint && startPoint > currentFrame ? startPoint : currentFrame;
3218    } // Reverse Mode.
3219
3220
3221    if ('backward' === this.state.animationDirection && this.isReverseMode()) {
3222      firstFrame = currentFrame;
3223      lastFrame = startPoint && startPoint > this.lottie.__initialFirstFrame ? startPoint : this.lottie.__initialFirstFrame;
3224    }
3225
3226    return {
3227      first: firstFrame,
3228      last: lastFrame,
3229      current: currentFrame,
3230      total: this.lottie.__initialTotalFrames
3231    };
3232  }
3233
3234  getAnimationRange() {
3235    const lottieSettings = this.getLottieSettings();
3236    return {
3237      start: this.getInitialFrameNumberByPercent(lottieSettings.start_point.size),
3238      end: this.getInitialFrameNumberByPercent(lottieSettings.end_point.size)
3239    };
3240  }
3241
3242  getInitialFrameNumberByPercent(percent) {
3243    percent = Math.min(100, Math.max(0, percent));
3244    return this.lottie.__initialFirstFrame + (this.lottie.__initialTotalFrames - this.lottie.__initialFirstFrame) * percent / 100;
3245  }
3246
3247  getAnimationCurrentFrame() {
3248    // When pausing the animation (when out of viewport) the first frame of the animation changes.
3249    return 0 === this.lottie.firstFrame ? this.lottie.currentFrame : this.lottie.firstFrame + this.lottie.currentFrame;
3250  }
3251
3252  setLinkTimeout() {
3253    const lottieSettings = this.getLottieSettings();
3254
3255    if ('on_click' === lottieSettings.trigger && lottieSettings.custom_link?.url && lottieSettings.link_timeout) {
3256      this.elements.$containerLink.on('click', event => {
3257        event.preventDefault();
3258
3259        if (!this.isEdit) {
3260          setTimeout(() => {
3261            const tabTarget = 'on' === lottieSettings.custom_link.is_external ? '_blank' : '_self';
3262            window.open(lottieSettings.custom_link.url, tabTarget);
3263          }, lottieSettings.link_timeout);
3264        }
3265      });
3266    }
3267  }
3268
3269  bindAnimationClickEvents() {
3270    this.listeners.elements.$container.triggerAnimationClick = () => {
3271      this.playLottie();
3272    };
3273
3274    this.addSessionEventListener(this.elements.$container, 'click', this.listeners.elements.$container.triggerAnimationClick);
3275  }
3276
3277  getLottieSettings() {
3278    const lottieSettings = this.getElementSettings();
3279    return { ...lottieSettings,
3280      lazyload: 'yes' === lottieSettings.lazyload,
3281      loop: 'yes' === lottieSettings.loop
3282    };
3283  }
3284
3285  playLottie() {
3286    const frame = this.getAnimationFrames();
3287    this.lottie.stop();
3288    this.lottie.playSegments([frame.first, frame.last], true); // We reset the loop cycle state after playing the animation.
3289
3290    this.state.isNewLoopCycle = false;
3291  }
3292
3293  bindAnimationHoverEvents() {
3294    this.createAnimationHoverInEvents();
3295    this.createAnimationHoverOutEvents();
3296  }
3297
3298  createAnimationHoverInEvents() {
3299    const lottieSettings = this.getLottieSettings(),
3300          $widgetArea = this.getHoverAreaElement();
3301    this.state.hoverArea = lottieSettings.hover_area;
3302
3303    this.listeners.elements.$widgetArea.triggerAnimationHoverIn = () => {
3304      this.state.animationDirection = 'forward';
3305      this.playLottie();
3306    };
3307
3308    this.addSessionEventListener($widgetArea, 'mouseenter', this.listeners.elements.$widgetArea.triggerAnimationHoverIn);
3309  }
3310  /**
3311   * @param {jQuery}   $el
3312   * @param {string}   event    - event type
3313   * @param {Function} callback
3314   */
3315
3316
3317  addSessionEventListener($el, event, callback) {
3318    $el.on(event, callback);
3319    this.listeners.collection.push({
3320      $el,
3321      event,
3322      callback
3323    });
3324  }
3325
3326  createAnimationHoverOutEvents() {
3327    const lottieSettings = this.getLottieSettings(),
3328          $widgetArea = this.getHoverAreaElement();
3329
3330    if ('pause' === lottieSettings.on_hover_out || 'reverse' === lottieSettings.on_hover_out) {
3331      this.state.hoverOutMode = lottieSettings.on_hover_out;
3332
3333      this.listeners.elements.$widgetArea.triggerAnimationHoverOut = () => {
3334        if ('pause' === lottieSettings.on_hover_out) {
3335          this.lottie.pause();
3336        } else {
3337          this.state.animationDirection = 'backward';
3338          this.playLottie();
3339        }
3340      };
3341
3342      this.addSessionEventListener($widgetArea, 'mouseleave', this.listeners.elements.$widgetArea.triggerAnimationHoverOut);
3343    }
3344  }
3345
3346  getHoverAreaElement() {
3347    const lottieSettings = this.getLottieSettings();
3348
3349    if ('section' === lottieSettings.hover_area) {
3350      return this.elements.$sectionParent;
3351    } else if ('column' === lottieSettings.hover_area) {
3352      return this.elements.$columnParent;
3353    }
3354
3355    return this.elements.$container;
3356  }
3357
3358  setLoopOnAnimationComplete() {
3359    const lottieSettings = this.getLottieSettings();
3360    this.state.isNewLoopCycle = true;
3361
3362    if (lottieSettings.loop && !this.isReverseMode()) {
3363      this.setLoopWhenNotReverse();
3364    } else if (lottieSettings.loop && this.isReverseMode()) {
3365      this.setReverseAnimationOnLoop();
3366    } else if (!lottieSettings.loop && this.isReverseMode()) {
3367      this.setReverseAnimationOnSingleTrigger();
3368    }
3369  }
3370
3371  isReverseMode() {
3372    const lottieSettings = this.getLottieSettings();
3373    return 'yes' === lottieSettings.reverse_animation || 'reverse' === lottieSettings.on_hover_out && 'backward' === this.state.animationDirection;
3374  }
3375
3376  setLoopWhenNotReverse() {
3377    const lottieSettings = this.getLottieSettings();
3378
3379    if (lottieSettings.number_of_times > 0) {
3380      this.state.playAnimationCount++;
3381
3382      if (this.state.playAnimationCount < lottieSettings.number_of_times) {
3383        this.playLottie();
3384      } else {
3385        this.state.playAnimationCount = 0;
3386      }
3387    } else {
3388      this.playLottie();
3389    }
3390  }
3391
3392  setReverseAnimationOnLoop() {
3393    const lottieSettings = this.getLottieSettings();
3394    /*
3395    We trigger the reverse animation:
3396    either when we don't have any value in the 'Number of Times" field, and then it will be an infinite forward/backward loop,
3397    or, when we have a value in the 'Number of Times" field and then we need to limit the number of times of the loop cycles.
3398     */
3399
3400    if (!lottieSettings.number_of_times || this.state.playAnimationCount < lottieSettings.number_of_times) {
3401      this.state.animationDirection = 'forward' === this.state.animationDirection ? 'backward' : 'forward';
3402      this.playLottie();
3403      /*
3404      We need to increment the count only on the backward movements,
3405      because forward movement + backward movement are equal together to one full movement count.
3406      */
3407
3408      if ('backward' === this.state.animationDirection) {
3409        this.state.playAnimationCount++;
3410      }
3411    } else {
3412      // Reset the values for the loop counting for the next trigger.
3413      this.state.playAnimationCount = 0;
3414      this.state.animationDirection = 'forward';
3415    }
3416  }
3417
3418  setReverseAnimationOnSingleTrigger() {
3419    if (this.state.playAnimationCount < 1) {
3420      this.state.playAnimationCount++;
3421      this.state.animationDirection = 'backward';
3422      this.playLottie();
3423    } else if (this.state.playAnimationCount >= 1 && 'forward' === this.state.animationDirection) {
3424      this.state.animationDirection = 'backward';
3425      this.playLottie();
3426    } else {
3427      this.state.playAnimationCount = 0;
3428      this.state.animationDirection = 'forward';
3429    }
3430  }
3431
3432  setAnimationSpeed() {
3433    const lottieSettings = this.getLottieSettings();
3434
3435    if (lottieSettings.play_speed) {
3436      this.lottie.setSpeed(lottieSettings.play_speed.size);
3437    }
3438  }
3439
3440  onElementChange() {
3441    this.updateLottieValues();
3442    this.resetAnimationTrigger();
3443  }
3444
3445  updateLottieValues() {
3446    const lottieSettings = this.getLottieSettings(),
3447          valuesComparison = [{
3448      sourceVal: lottieSettings.play_speed?.size,
3449      stateProp: 'animationSpeed',
3450      callback: () => this.setAnimationSpeed()
3451    }, {
3452      sourceVal: lottieSettings.link_timeout,
3453      stateProp: 'linkTimeout',
3454      callback: () => this.setLinkTimeout()
3455    }, {
3456      sourceVal: lottieSettings.caption,
3457      stateProp: 'caption',
3458      callback: () => this.setCaption()
3459    }, {
3460      sourceVal: lottieSettings.effects_relative_to,
3461      stateProp: 'effectsRelativeTo',
3462      callback: () => this.updateAnimationByScrollPosition()
3463    }, {
3464      sourceVal: lottieSettings.loop,
3465      stateProp: 'loop',
3466      callback: () => this.onLoopStateChange()
3467    }];
3468    valuesComparison.forEach(item => {
3469      if ('undefined' !== typeof item.sourceVal && item.sourceVal !== this.state[item.stateProp]) {
3470        this.state[item.stateProp] = item.sourceVal;
3471        item.callback();
3472      }
3473    });
3474  }
3475
3476  onLoopStateChange() {
3477    const isInActiveViewportMode = 'arriving_to_viewport' === this.state.currentAnimationTrigger && this.state.isInViewport;
3478
3479    if (this.state.loop && (isInActiveViewportMode || 'none' === this.state.currentAnimationTrigger)) {
3480      this.playLottie();
3481    }
3482  }
3483
3484  resetAnimationTrigger() {
3485    const lottieSettings = this.getLottieSettings(),
3486          isTriggerChange = lottieSettings.trigger !== this.state.currentAnimationTrigger,
3487          isViewportOffsetChange = lottieSettings.viewport ? this.isViewportOffsetChange() : false,
3488          isHoverOutModeChange = lottieSettings.on_hover_out ? this.isHoverOutModeChange() : false,
3489          isHoverAreaChange = lottieSettings.hover_area ? this.isHoverAreaChange() : false;
3490
3491    if (isTriggerChange || isViewportOffsetChange || isHoverOutModeChange || isHoverAreaChange) {
3492      this.removeAnimationFrameRequests();
3493      this.removeObservers();
3494      this.removeEventListeners();
3495      this.initAnimationTrigger();
3496    }
3497  }
3498
3499  isViewportOffsetChange() {
3500    const lottieSettings = this.getLottieSettings(),
3501          isStartOffsetChange = lottieSettings.viewport.sizes.start !== this.state.viewportOffset.start,
3502          isEndOffsetChange = lottieSettings.viewport.sizes.end !== this.state.viewportOffset.end;
3503    return isStartOffsetChange || isEndOffsetChange;
3504  }
3505
3506  isHoverOutModeChange() {
3507    const lottieSettings = this.getLottieSettings();
3508    return lottieSettings.on_hover_out !== this.state.hoverOutMode;
3509  }
3510
3511  isHoverAreaChange() {
3512    const lottieSettings = this.getLottieSettings();
3513    return lottieSettings.hover_area !== this.state.hoverArea;
3514  }
3515
3516  removeEventListeners() {
3517    this.listeners.collection.forEach(listener => {
3518      listener.$el.off(listener.event, null, listener.callback);
3519    });
3520  }
3521
3522  removeObservers() {
3523    // Removing all observers.
3524    for (const type in this.intersectionObservers) {
3525      if (this.intersectionObservers[type].observer && this.intersectionObservers[type].element) {
3526        this.intersectionObservers[type].observer.unobserve(this.intersectionObservers[type].element);
3527      }
3528    }
3529  }
3530
3531  removeAnimationFrameRequests() {
3532    cancelAnimationFrame(this.animationFrameRequest.timer);
3533  }
3534
3535  onDestroy() {
3536    super.onDestroy();
3537    this.destroyLottie();
3538  }
3539
3540  destroyLottie() {
3541    this.removeAnimationFrameRequests();
3542    this.removeObservers();
3543    this.removeEventListeners();
3544    this.elements.$animation.removeData('lottie');
3545
3546    if (this.lottie) {
3547      this.lottie.destroy();
3548    }
3549  }
3550
3551  onLottieDomLoaded() {
3552    this.saveInitialValues();
3553    this.setAnimationSpeed();
3554    this.setLinkTimeout();
3555    this.setCaption();
3556    this.setAnimationFirstFrame();
3557    this.initAnimationTrigger();
3558  }
3559
3560  onComplete() {
3561    this.setLoopOnAnimationComplete();
3562  }
3563
3564  onLottieIntersection(event) {
3565    if (event.isInViewport) {
3566      /*
3567      It's required to update the animation progress on first load when lottie is inside the viewport on load
3568      but, there is a problem when the browser is refreshed when the scroll bar is not in 0 position,
3569      in this scenario, after the refresh the browser will trigger 2 scroll events
3570      one trigger on immediate load and second after a f ew ms to move the scroll bar to previous position (before refresh)
3571      therefore, we use the this.state.isAnimationScrollUpdateNeededOnFirstLoad flag
3572      to make sure that this.updateAnimationByScrollPosition() function will be triggered only once.
3573       */
3574      if (this.state.isAnimationScrollUpdateNeededOnFirstLoad) {
3575        this.state.isAnimationScrollUpdateNeededOnFirstLoad = false;
3576        this.updateAnimationByScrollPosition();
3577      }
3578
3579      this.animationFrameRequest.timer = requestAnimationFrame(() => this.onAnimationFrameRequest());
3580    } else {
3581      const frame = this.getAnimationFrames(),
3582            finalFrame = 'up' === event.intersectionScrollDirection ? frame.first : frame.last;
3583      this.state.isAnimationScrollUpdateNeededOnFirstLoad = false;
3584      cancelAnimationFrame(this.animationFrameRequest.timer); // Set the animation values to min/max when out of viewport.
3585
3586      this.lottie.goToAndStop(finalFrame, true);
3587    }
3588  }
3589
3590  onAnimationFrameRequest() {
3591    // Making calculation only when there is a change with the scroll position.
3592    if (window.scrollY !== this.animationFrameRequest.lastScrollY) {
3593      this.updateAnimationByScrollPosition();
3594      this.animationFrameRequest.lastScrollY = window.scrollY;
3595    }
3596
3597    this.animationFrameRequest.timer = requestAnimationFrame(() => this.onAnimationFrameRequest());
3598  }
3599
3600}
3601
3602exports["default"] = lottieHandler;
3603
3604/***/ }),
3605
3606/***/ "../modules/nav-menu/assets/js/frontend/frontend-legacy.js":
3607/*!*****************************************************************!*\
3608  !*** ../modules/nav-menu/assets/js/frontend/frontend-legacy.js ***!
3609  \*****************************************************************/
3610/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
3611
3612
3613
3614var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
3615
3616Object.defineProperty(exports, "__esModule", ({
3617  value: true
3618}));
3619exports["default"] = void 0;
3620
3621var _navMenu = _interopRequireDefault(__webpack_require__(/*! ./handlers/nav-menu */ "../modules/nav-menu/assets/js/frontend/handlers/nav-menu.js"));
3622
3623class _default extends elementorModules.Module {
3624  constructor() {
3625    super();
3626
3627    if (jQuery.fn.smartmenus) {
3628      // Override the default stupid detection
3629      jQuery.SmartMenus.prototype.isCSSOn = function () {
3630        return true;
3631      };
3632
3633      if (elementorFrontend.config.is_rtl) {
3634        jQuery.fn.smartmenus.defaults.rightToLeftSubMenus = true;
3635      }
3636    }
3637
3638    elementorFrontend.elementsHandler.attachHandler('nav-menu', _navMenu.default);
3639  }
3640
3641}
3642
3643exports["default"] = _default;
3644
3645/***/ }),
3646
3647/***/ "../modules/nav-menu/assets/js/frontend/handlers/nav-menu.js":
3648/*!*******************************************************************!*\
3649  !*** ../modules/nav-menu/assets/js/frontend/handlers/nav-menu.js ***!
3650  \*******************************************************************/
3651/***/ ((__unused_webpack_module, exports) => {
3652
3653
3654
3655Object.defineProperty(exports, "__esModule", ({
3656  value: true
3657}));
3658exports["default"] = void 0;
3659
3660var _default = elementorModules.frontend.handlers.Base.extend({
3661  stretchElement: null,
3662
3663  getDefaultSettings() {
3664    return {
3665      selectors: {
3666        menu: '.elementor-nav-menu',
3667        anchorLink: '.elementor-nav-menu--main .elementor-item-anchor',
3668        dropdownMenu: '.elementor-nav-menu__container.elementor-nav-menu--dropdown',
3669        menuToggle: '.elementor-menu-toggle'
3670      }
3671    };
3672  },
3673
3674  getDefaultElements() {
3675    var selectors = this.getSettings('selectors'),
3676        elements = {};
3677    elements.$menu = this.$element.find(selectors.menu);
3678    elements.$anchorLink = this.$element.find(selectors.anchorLink);
3679    elements.$dropdownMenu = this.$element.find(selectors.dropdownMenu);
3680    elements.$dropdownMenuFinalItems = elements.$dropdownMenu.find('.menu-item:not(.menu-item-has-children) > a');
3681    elements.$menuToggle = this.$element.find(selectors.menuToggle);
3682    elements.$links = elements.$dropdownMenu.find('a.elementor-item');
3683    return elements;
3684  },
3685
3686  bindEvents() {
3687    if (!this.elements.$menu.length) {
3688      return;
3689    }
3690
3691    this.elements.$menuToggle.on('click', this.toggleMenu.bind(this));
3692
3693    if (this.getElementSettings('full_width')) {
3694      this.elements.$dropdownMenuFinalItems.on('click', this.toggleMenu.bind(this, false));
3695    }
3696
3697    elementorFrontend.addListenerOnce(this.$element.data('model-cid'), 'resize', this.stretchMenu);
3698  },
3699
3700  initStretchElement() {
3701    this.stretchElement = new elementorModules.frontend.tools.StretchElement({
3702      element: this.elements.$dropdownMenu
3703    });
3704  },
3705
3706  toggleNavLinksTabIndex() {
3707    let enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
3708    this.elements.$links.attr('tabindex', enabled ? 0 : -1);
3709  },
3710
3711  toggleMenu(show) {
3712    var isDropdownVisible = this.elements.$menuToggle.hasClass('elementor-active');
3713
3714    if ('boolean' !== typeof show) {
3715      show = !isDropdownVisible;
3716    }
3717
3718    this.elements.$menuToggle.attr('aria-expanded', show);
3719    this.elements.$dropdownMenu.attr('aria-hidden', !show);
3720    this.elements.$menuToggle.toggleClass('elementor-active', show);
3721    this.toggleNavLinksTabIndex(show);
3722
3723    if (show && this.getElementSettings('full_width')) {
3724      this.stretchElement.stretch();
3725    }
3726  },
3727
3728  followMenuAnchors() {
3729    var self = this;
3730    self.elements.$anchorLink.each(function () {
3731      if (location.pathname === this.pathname && '' !== this.hash) {
3732        self.followMenuAnchor(jQuery(this));
3733      }
3734    });
3735  },
3736
3737  followMenuAnchor($element) {
3738    const anchorSelector = $element[0].hash;
3739    let offset = -300,
3740        $anchor;
3741
3742    try {
3743      // `decodeURIComponent` for UTF8 characters in the hash.
3744      $anchor = jQuery(decodeURIComponent(anchorSelector));
3745    } catch (e) {
3746      return;
3747    }
3748
3749    if (!$anchor.length) {
3750      return;
3751    }
3752
3753    if (!$anchor.hasClass('elementor-menu-anchor')) {
3754      var halfViewport = jQuery(window).height() / 2;
3755      offset = -$anchor.outerHeight() + halfViewport;
3756    }
3757
3758    elementorFrontend.waypoint($anchor, function (direction) {
3759      if ('down' === direction) {
3760        $element.addClass('elementor-item-active');
3761      } else {
3762        $element.removeClass('elementor-item-active');
3763      }
3764    }, {
3765      offset: '50%',
3766      triggerOnce: false
3767    });
3768    elementorFrontend.waypoint($anchor, function (direction) {
3769      if ('down' === direction) {
3770        $element.removeClass('elementor-item-active');
3771      } else {
3772        $element.addClass('elementor-item-active');
3773      }
3774    }, {
3775      offset,
3776      triggerOnce: false
3777    });
3778  },
3779
3780  stretchMenu() {
3781    if (this.getElementSettings('full_width')) {
3782      this.stretchElement.stretch();
3783      this.elements.$dropdownMenu.css('top', this.elements.$menuToggle.outerHeight());
3784    } else {
3785      this.stretchElement.reset();
3786    }
3787  },
3788
3789  onInit() {
3790    elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
3791
3792    if (!this.elements.$menu.length) {
3793      return;
3794    }
3795
3796    const elementSettings = this.getElementSettings(),
3797          iconValue = elementSettings.submenu_icon.value;
3798    let subIndicatorsContent = '';
3799
3800    if (iconValue) {
3801      // The value of iconValue can be either className inside the editor or a markup in the frontend.
3802      subIndicatorsContent = iconValue.indexOf('<') > -1 ? iconValue : `<i class="${iconValue}"></i>`;
3803    } // subIndicators param - Added for backwards compatibility:
3804    // If the old 'indicator' control value = 'none', the <span class="sub-arrow"> wrapper element is removed
3805
3806
3807    this.elements.$menu.smartmenus({
3808      subIndicators: '' !== subIndicatorsContent,
3809      subIndicatorsText: subIndicatorsContent,
3810      subIndicatorsPos: 'append',
3811      subMenusMaxWidth: '1000px'
3812    });
3813    this.initStretchElement();
3814    this.stretchMenu();
3815
3816    if (!elementorFrontend.isEditMode()) {
3817      this.followMenuAnchors();
3818    }
3819  },
3820
3821  onElementChange(propertyName) {
3822    if ('full_width' === propertyName) {
3823      this.stretchMenu();
3824    }
3825  }
3826
3827});
3828
3829exports["default"] = _default;
3830
3831/***/ }),
3832
3833/***/ "../modules/popup/assets/js/frontend/document.js":
3834/*!*******************************************************!*\
3835  !*** ../modules/popup/assets/js/frontend/document.js ***!
3836  \*******************************************************/
3837/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
3838
3839
3840
3841var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
3842
3843Object.defineProperty(exports, "__esModule", ({
3844  value: true
3845}));
3846exports["default"] = void 0;
3847
3848var _triggers = _interopRequireDefault(__webpack_require__(/*! ./triggers */ "../modules/popup/assets/js/frontend/triggers.js"));
3849
3850var _timing = _interopRequireDefault(__webpack_require__(/*! ./timing */ "../modules/popup/assets/js/frontend/timing.js"));
3851
3852var _eIcons = __webpack_require__(/*! @elementor-pro/e-icons */ "../assets/dev/js/frontend/utils/icons/e-icons.js");
3853
3854// Temporary solution, when core 3.5.0 will be the minimum version, is should be replaced with @elementor/e-icons.
3855class _default extends elementorModules.frontend.Document {
3856  bindEvents() {
3857    const openSelector = this.getDocumentSettings('open_selector');
3858
3859    if (openSelector) {
3860      elementorFrontend.elements.$body.on('click', openSelector, this.showModal.bind(this));
3861    }
3862  }
3863
3864  startTiming() {
3865    const timing = new _timing.default(this.getDocumentSettings('timing'), this);
3866
3867    if (timing.check()) {
3868      this.initTriggers();
3869    }
3870  }
3871
3872  initTriggers() {
3873    this.triggers = new _triggers.default(this.getDocumentSettings('triggers'), this);
3874  }
3875
3876  showModal(avoidMultiple) {
3877    // eslint-disable-next-line @wordpress/no-unused-vars-before-return
3878    const settings = this.getDocumentSettings();
3879
3880    if (!this.isEdit) {
3881      if (!elementorFrontend.isWPPreviewMode()) {
3882        if (this.getStorage('disable')) {
3883          return;
3884        }
3885
3886        if (avoidMultiple && elementorProFrontend.modules.popup.popupPopped && settings.avoid_multiple_popups) {
3887          return;
3888        }
3889      } // A clean copy of the element without previous initializations and events
3890
3891
3892      this.$element = jQuery(this.elementHTML);
3893      this.elements.$elements = this.$element.find(this.getSettings('selectors.elements'));
3894    }
3895
3896    const modal = this.getModal(),
3897          $closeButton = modal.getElements('closeButton');
3898    modal.setMessage(this.$element).show();
3899
3900    if (!this.isEdit) {
3901      if (settings.close_button_delay) {
3902        $closeButton.hide();
3903        clearTimeout(this.closeButtonTimeout);
3904        this.closeButtonTimeout = setTimeout(() => $closeButton.show(), settings.close_button_delay * 1000);
3905      }
3906
3907      super.runElementsHandlers();
3908    }
3909
3910    this.setEntranceAnimation();
3911
3912    if (!settings.timing || !settings.timing.times_count) {
3913      this.countTimes();
3914    }
3915
3916    elementorProFrontend.modules.popup.popupPopped = true;
3917  }
3918
3919  setEntranceAnimation() {
3920    const $widgetContent = this.getModal().getElements('widgetContent'),
3921          settings = this.getDocumentSettings(),
3922          newAnimation = elementorFrontend.getCurrentDeviceSetting(settings, 'entrance_animation');
3923
3924    if (this.currentAnimation) {
3925      $widgetContent.removeClass(this.currentAnimation);
3926    }
3927
3928    this.currentAnimation = newAnimation;
3929
3930    if (!newAnimation) {
3931      return;
3932    }
3933
3934    const animationDuration = settings.entrance_animation_duration.size;
3935    $widgetContent.addClass(newAnimation);
3936    setTimeout(() => $widgetContent.removeClass(newAnimation), animationDuration * 1000);
3937  }
3938
3939  setExitAnimation() {
3940    const modal = this.getModal(),
3941          settings = this.getDocumentSettings(),
3942          $widgetContent = modal.getElements('widgetContent'),
3943          newAnimation = elementorFrontend.getCurrentDeviceSetting(settings, 'exit_animation'),
3944          animationDuration = newAnimation ? settings.entrance_animation_duration.size : 0;
3945    setTimeout(() => {
3946      if (newAnimation) {
3947        $widgetContent.removeClass(newAnimation + ' reverse');
3948      }
3949
3950      if (!this.isEdit) {
3951        this.$element.remove();
3952        modal.getElements('widget').hide();
3953      }
3954    }, animationDuration * 1000);
3955
3956    if (newAnimation) {
3957      $widgetContent.addClass(newAnimation + ' reverse');
3958    }
3959  }
3960
3961  initModal() {
3962    let modal;
3963
3964    this.getModal = () => {
3965      if (!modal) {
3966        const settings = this.getDocumentSettings(),
3967              id = this.getSettings('id'),
3968              triggerPopupEvent = eventType => {
3969          const event = 'elementor/popup/' + eventType;
3970          elementorFrontend.elements.$document.trigger(event, [id, this]); // TODO: Use `elementorFrontend.utils.events.dispatch` when it's in master.
3971
3972          window.dispatchEvent(new CustomEvent(event, {
3973            detail: {
3974              id,
3975              instance: this
3976            }
3977          }));
3978        };
3979
3980        let classes = 'elementor-popup-modal';
3981
3982        if (settings.classes) {
3983          classes += ' ' + settings.classes;
3984        }
3985
3986        const modalProperties = {
3987          id: 'elementor-popup-modal-' + id,
3988          className: classes,
3989          closeButton: true,
3990          preventScroll: settings.prevent_scroll,
3991          onShow: () => triggerPopupEvent('show'),
3992          onHide: () => triggerPopupEvent('hide'),
3993          effects: {
3994            hide: () => {
3995              if (settings.timing && settings.timing.times_count) {
3996                this.countTimes();
3997              }
3998
3999              this.setExitAnimation();
4000            },
4001            show: 'show'
4002          },
4003          hide: {
4004            auto: !!settings.close_automatically,
4005            autoDelay: settings.close_automatically * 1000,
4006            onBackgroundClick: !settings.prevent_close_on_background_click,
4007            onOutsideClick: !settings.prevent_close_on_background_click,
4008            onEscKeyPress: !settings.prevent_close_on_esc_key,
4009            ignore: '.flatpickr-calendar'
4010          },
4011          position: {
4012            enable: false
4013          }
4014        };
4015
4016        if (elementorFrontend.config.experimentalFeatures.e_font_icon_svg) {
4017          modalProperties.closeButtonOptions = {
4018            iconElement: _eIcons.close.element
4019          };
4020        } // This line should be moved to the condition above, as an 'else' case, once the core minimum version is 3.5.0.
4021
4022
4023        modalProperties.closeButtonClass = 'eicon-close';
4024        modal = elementorFrontend.getDialogsManager().createWidget('lightbox', modalProperties);
4025        modal.getElements('widgetContent').addClass('animated');
4026        const $closeButton = modal.getElements('closeButton');
4027
4028        if (this.isEdit) {
4029          $closeButton.off('click');
4030
4031          modal.hide = () => {};
4032        }
4033
4034        this.setCloseButtonPosition();
4035      }
4036
4037      return modal;
4038    };
4039  }
4040
4041  setCloseButtonPosition() {
4042    const modal = this.getModal(),
4043          closeButtonPosition = this.getDocumentSettings('close_button_position'),
4044          $closeButton = modal.getElements('closeButton');
4045    $closeButton.appendTo(modal.getElements('outside' === closeButtonPosition ? 'widget' : 'widgetContent'));
4046  }
4047
4048  disable() {
4049    this.setStorage('disable', true);
4050  }
4051
4052  setStorage(key, value, options) {
4053    elementorFrontend.storage.set(`popup_${this.getSettings('id')}_${key}`, value, options);
4054  }
4055
4056  getStorage(key, options) {
4057    return elementorFrontend.storage.get(`popup_${this.getSettings('id')}_${key}`, options);
4058  }
4059
4060  countTimes() {
4061    const displayTimes = this.getStorage('times') || 0;
4062    this.setStorage('times', displayTimes + 1);
4063  }
4064
4065  runElementsHandlers() {}
4066
4067  async onInit() {
4068    super.onInit(); // In case that the library was not loaded, it indicates a Core version that enables dynamic loading.
4069
4070    if (!window.DialogsManager) {
4071      await elementorFrontend.utils.assetsLoader.load('script', 'dialog');
4072    }
4073
4074    this.initModal();
4075
4076    if (this.isEdit) {
4077      this.showModal();
4078      return;
4079    }
4080
4081    this.$element.show().remove();
4082    this.elementHTML = this.$element[0].outerHTML;
4083
4084    if (elementorFrontend.isEditMode()) {
4085      return;
4086    }
4087
4088    if (elementorFrontend.isWPPreviewMode() && elementorFrontend.config.post.id === this.getSettings('id')) {
4089      this.showModal();
4090      return;
4091    }
4092
4093    this.startTiming();
4094  }
4095
4096  onSettingsChange(model) {
4097    const changedKey = Object.keys(model.changed)[0];
4098
4099    if (-1 !== changedKey.indexOf('entrance_animation')) {
4100      this.setEntranceAnimation();
4101    }
4102
4103    if ('exit_animation' === changedKey) {
4104      this.setExitAnimation();
4105    }
4106
4107    if ('close_button_position' === changedKey) {
4108      this.setCloseButtonPosition();
4109    }
4110  }
4111
4112}
4113
4114exports["default"] = _default;
4115
4116/***/ }),
4117
4118/***/ "../modules/popup/assets/js/frontend/frontend-legacy.js":
4119/*!**************************************************************!*\
4120  !*** ../modules/popup/assets/js/frontend/frontend-legacy.js ***!
4121  \**************************************************************/
4122/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4123
4124
4125
4126var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4127
4128Object.defineProperty(exports, "__esModule", ({
4129  value: true
4130}));
4131exports["default"] = void 0;
4132
4133var _document = _interopRequireDefault(__webpack_require__(/*! ./document */ "../modules/popup/assets/js/frontend/document.js"));
4134
4135var _formsAction = _interopRequireDefault(__webpack_require__(/*! ./handlers/forms-action */ "../modules/popup/assets/js/frontend/handlers/forms-action.js"));
4136
4137class _default extends elementorModules.Module {
4138  constructor() {
4139    super();
4140    elementorFrontend.hooks.addAction('elementor/frontend/documents-manager/init-classes', this.addDocumentClass);
4141    elementorFrontend.elementsHandler.attachHandler('form', _formsAction.default);
4142    elementorFrontend.on('components:init', () => this.onFrontendComponentsInit());
4143
4144    if (!elementorFrontend.isEditMode() && !elementorFrontend.isWPPreviewMode()) {
4145      this.setViewsAndSessions();
4146    }
4147  }
4148
4149  addDocumentClass(documentsManager) {
4150    documentsManager.addDocumentClass('popup', _document.default);
4151  }
4152
4153  setViewsAndSessions() {
4154    const pageViews = elementorFrontend.storage.get('pageViews') || 0;
4155    elementorFrontend.storage.set('pageViews', pageViews + 1);
4156    const activeSession = elementorFrontend.storage.get('activeSession', {
4157      session: true
4158    });
4159
4160    if (!activeSession) {
4161      elementorFrontend.storage.set('activeSession', true, {
4162        session: true
4163      });
4164      const sessions = elementorFrontend.storage.get('sessions') || 0;
4165      elementorFrontend.storage.set('sessions', sessions + 1);
4166    }
4167  }
4168
4169  showPopup(settings) {
4170    const popup = elementorFrontend.documentsManager.documents[settings.id];
4171
4172    if (!popup) {
4173      return;
4174    }
4175
4176    const modal = popup.getModal();
4177
4178    if (settings.toggle && modal.isVisible()) {
4179      modal.hide();
4180    } else {
4181      popup.showModal();
4182    }
4183  }
4184
4185  closePopup(settings, event) {
4186    const popupID = jQuery(event.target).parents('[data-elementor-type="popup"]').data('elementorId');
4187
4188    if (!popupID) {
4189      return;
4190    }
4191
4192    const document = elementorFrontend.documentsManager.documents[popupID];
4193    document.getModal().hide();
4194
4195    if (settings.do_not_show_again) {
4196      document.disable();
4197    }
4198  }
4199
4200  onFrontendComponentsInit() {
4201    elementorFrontend.utils.urlActions.addAction('popup:open', settings => this.showPopup(settings));
4202    elementorFrontend.utils.urlActions.addAction('popup:close', (settings, event) => this.closePopup(settings, event));
4203  }
4204
4205}
4206
4207exports["default"] = _default;
4208
4209/***/ }),
4210
4211/***/ "../modules/popup/assets/js/frontend/handlers/forms-action.js":
4212/*!********************************************************************!*\
4213  !*** ../modules/popup/assets/js/frontend/handlers/forms-action.js ***!
4214  \********************************************************************/
4215/***/ ((__unused_webpack_module, exports) => {
4216
4217
4218
4219Object.defineProperty(exports, "__esModule", ({
4220  value: true
4221}));
4222exports["default"] = void 0;
4223
4224var _default = elementorModules.frontend.handlers.Base.extend({
4225  getDefaultSettings() {
4226    return {
4227      selectors: {
4228        form: '.elementor-form'
4229      }
4230    };
4231  },
4232
4233  getDefaultElements() {
4234    var selectors = this.getSettings('selectors'),
4235        elements = {};
4236    elements.$form = this.$element.find(selectors.form);
4237    return elements;
4238  },
4239
4240  bindEvents() {
4241    this.elements.$form.on('submit_success', this.handleFormAction);
4242  },
4243
4244  handleFormAction(event, response) {
4245    if ('undefined' === typeof response.data.popup) {
4246      return;
4247    }
4248
4249    const popupSettings = response.data.popup;
4250
4251    if ('open' === popupSettings.action) {
4252      return elementorProFrontend.modules.popup.showPopup(popupSettings);
4253    }
4254
4255    setTimeout(() => {
4256      return elementorProFrontend.modules.popup.closePopup(popupSettings, event);
4257    }, 1000);
4258  }
4259
4260});
4261
4262exports["default"] = _default;
4263
4264/***/ }),
4265
4266/***/ "../modules/popup/assets/js/frontend/timing.js":
4267/*!*****************************************************!*\
4268  !*** ../modules/popup/assets/js/frontend/timing.js ***!
4269  \*****************************************************/
4270/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4271
4272
4273
4274var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4275
4276Object.defineProperty(exports, "__esModule", ({
4277  value: true
4278}));
4279exports["default"] = void 0;
4280
4281var _pageViews = _interopRequireDefault(__webpack_require__(/*! ./timing/page-views */ "../modules/popup/assets/js/frontend/timing/page-views.js"));
4282
4283var _sessions = _interopRequireDefault(__webpack_require__(/*! ./timing/sessions */ "../modules/popup/assets/js/frontend/timing/sessions.js"));
4284
4285var _url = _interopRequireDefault(__webpack_require__(/*! ./timing/url */ "../modules/popup/assets/js/frontend/timing/url.js"));
4286
4287var _sources = _interopRequireDefault(__webpack_require__(/*! ./timing/sources */ "../modules/popup/assets/js/frontend/timing/sources.js"));
4288
4289var _loggedIn = _interopRequireDefault(__webpack_require__(/*! ./timing/logged-in */ "../modules/popup/assets/js/frontend/timing/logged-in.js"));
4290
4291var _devices = _interopRequireDefault(__webpack_require__(/*! ./timing/devices */ "../modules/popup/assets/js/frontend/timing/devices.js"));
4292
4293var _times = _interopRequireDefault(__webpack_require__(/*! ./timing/times */ "../modules/popup/assets/js/frontend/timing/times.js"));
4294
4295var _browsers = _interopRequireDefault(__webpack_require__(/*! ./timing/browsers */ "../modules/popup/assets/js/frontend/timing/browsers.js"));
4296
4297class _default extends elementorModules.Module {
4298  constructor(settings, document) {
4299    super(settings);
4300    this.document = document;
4301    this.timingClasses = {
4302      page_views: _pageViews.default,
4303      sessions: _sessions.default,
4304      url: _url.default,
4305      sources: _sources.default,
4306      logged_in: _loggedIn.default,
4307      devices: _devices.default,
4308      times: _times.default,
4309      browsers: _browsers.default
4310    };
4311  }
4312
4313  check() {
4314    const settings = this.getSettings();
4315    let checkPassed = true;
4316    jQuery.each(this.timingClasses, (key, TimingClass) => {
4317      if (!settings[key]) {
4318        return;
4319      }
4320
4321      const timing = new TimingClass(settings, this.document);
4322
4323      if (!timing.check()) {
4324        checkPassed = false;
4325      }
4326    });
4327    return checkPassed;
4328  }
4329
4330}
4331
4332exports["default"] = _default;
4333
4334/***/ }),
4335
4336/***/ "../modules/popup/assets/js/frontend/timing/base.js":
4337/*!**********************************************************!*\
4338  !*** ../modules/popup/assets/js/frontend/timing/base.js ***!
4339  \**********************************************************/
4340/***/ ((__unused_webpack_module, exports) => {
4341
4342
4343
4344Object.defineProperty(exports, "__esModule", ({
4345  value: true
4346}));
4347exports["default"] = void 0;
4348
4349class _default extends elementorModules.Module {
4350  constructor(settings, document) {
4351    super(settings);
4352    this.document = document;
4353  }
4354
4355  getTimingSetting(settingKey) {
4356    return this.getSettings(this.getName() + '_' + settingKey);
4357  }
4358
4359}
4360
4361exports["default"] = _default;
4362
4363/***/ }),
4364
4365/***/ "../modules/popup/assets/js/frontend/timing/browsers.js":
4366/*!**************************************************************!*\
4367  !*** ../modules/popup/assets/js/frontend/timing/browsers.js ***!
4368  \**************************************************************/
4369/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4370
4371
4372
4373var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4374
4375Object.defineProperty(exports, "__esModule", ({
4376  value: true
4377}));
4378exports["default"] = void 0;
4379
4380var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/popup/assets/js/frontend/timing/base.js"));
4381
4382class _default extends _base.default {
4383  getName() {
4384    return 'browsers';
4385  }
4386
4387  check() {
4388    if ('all' === this.getTimingSetting('browsers')) {
4389      return true;
4390    }
4391
4392    const targetedBrowsers = this.getTimingSetting('browsers_options'),
4393          browserDetectionFlags = elementorFrontend.utils.environment;
4394    return targetedBrowsers.some(browserName => browserDetectionFlags[browserName]);
4395  }
4396
4397}
4398
4399exports["default"] = _default;
4400
4401/***/ }),
4402
4403/***/ "../modules/popup/assets/js/frontend/timing/devices.js":
4404/*!*************************************************************!*\
4405  !*** ../modules/popup/assets/js/frontend/timing/devices.js ***!
4406  \*************************************************************/
4407/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4408
4409
4410
4411var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4412
4413Object.defineProperty(exports, "__esModule", ({
4414  value: true
4415}));
4416exports["default"] = void 0;
4417
4418var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/popup/assets/js/frontend/timing/base.js"));
4419
4420class _default extends _base.default {
4421  getName() {
4422    return 'devices';
4423  }
4424
4425  check() {
4426    return -1 !== this.getTimingSetting('devices').indexOf(elementorFrontend.getCurrentDeviceMode());
4427  }
4428
4429}
4430
4431exports["default"] = _default;
4432
4433/***/ }),
4434
4435/***/ "../modules/popup/assets/js/frontend/timing/logged-in.js":
4436/*!***************************************************************!*\
4437  !*** ../modules/popup/assets/js/frontend/timing/logged-in.js ***!
4438  \***************************************************************/
4439/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4440
4441
4442
4443var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4444
4445Object.defineProperty(exports, "__esModule", ({
4446  value: true
4447}));
4448exports["default"] = void 0;
4449
4450var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/popup/assets/js/frontend/timing/base.js"));
4451
4452class _default extends _base.default {
4453  getName() {
4454    return 'logged_in';
4455  }
4456
4457  check() {
4458    const userConfig = elementorFrontend.config.user;
4459
4460    if (!userConfig) {
4461      return true;
4462    }
4463
4464    if ('all' === this.getTimingSetting('users')) {
4465      return false;
4466    }
4467
4468    const userRolesInHideList = this.getTimingSetting('roles').filter(role => -1 !== userConfig.roles.indexOf(role));
4469    return !userRolesInHideList.length;
4470  }
4471
4472}
4473
4474exports["default"] = _default;
4475
4476/***/ }),
4477
4478/***/ "../modules/popup/assets/js/frontend/timing/page-views.js":
4479/*!****************************************************************!*\
4480  !*** ../modules/popup/assets/js/frontend/timing/page-views.js ***!
4481  \****************************************************************/
4482/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4483
4484
4485
4486var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4487
4488Object.defineProperty(exports, "__esModule", ({
4489  value: true
4490}));
4491exports["default"] = void 0;
4492
4493var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/popup/assets/js/frontend/timing/base.js"));
4494
4495class _default extends _base.default {
4496  getName() {
4497    return 'page_views';
4498  }
4499
4500  check() {
4501    const pageViews = elementorFrontend.storage.get('pageViews'),
4502          name = this.getName();
4503    let initialPageViews = this.document.getStorage(name + '_initialPageViews');
4504
4505    if (!initialPageViews) {
4506      this.document.setStorage(name + '_initialPageViews', pageViews);
4507      initialPageViews = pageViews;
4508    }
4509
4510    return pageViews - initialPageViews >= this.getTimingSetting('views');
4511  }
4512
4513}
4514
4515exports["default"] = _default;
4516
4517/***/ }),
4518
4519/***/ "../modules/popup/assets/js/frontend/timing/sessions.js":
4520/*!**************************************************************!*\
4521  !*** ../modules/popup/assets/js/frontend/timing/sessions.js ***!
4522  \**************************************************************/
4523/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4524
4525
4526
4527var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4528
4529Object.defineProperty(exports, "__esModule", ({
4530  value: true
4531}));
4532exports["default"] = void 0;
4533
4534var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/popup/assets/js/frontend/timing/base.js"));
4535
4536class _default extends _base.default {
4537  getName() {
4538    return 'sessions';
4539  }
4540
4541  check() {
4542    const sessions = elementorFrontend.storage.get('sessions'),
4543          name = this.getName();
4544    let initialSessions = this.document.getStorage(name + '_initialSessions');
4545
4546    if (!initialSessions) {
4547      this.document.setStorage(name + '_initialSessions', sessions);
4548      initialSessions = sessions;
4549    }
4550
4551    return sessions - initialSessions >= this.getTimingSetting('sessions');
4552  }
4553
4554}
4555
4556exports["default"] = _default;
4557
4558/***/ }),
4559
4560/***/ "../modules/popup/assets/js/frontend/timing/sources.js":
4561/*!*************************************************************!*\
4562  !*** ../modules/popup/assets/js/frontend/timing/sources.js ***!
4563  \*************************************************************/
4564/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4565
4566
4567
4568var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4569
4570Object.defineProperty(exports, "__esModule", ({
4571  value: true
4572}));
4573exports["default"] = void 0;
4574
4575var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/popup/assets/js/frontend/timing/base.js"));
4576
4577class _default extends _base.default {
4578  getName() {
4579    return 'sources';
4580  }
4581
4582  check() {
4583    const sources = this.getTimingSetting('sources');
4584
4585    if (3 === sources.length) {
4586      return true;
4587    }
4588
4589    const referrer = document.referrer.replace(/https?:\/\/(?:www\.)?/, ''),
4590          isInternal = 0 === referrer.indexOf(location.host.replace('www.', ''));
4591
4592    if (isInternal) {
4593      return -1 !== sources.indexOf('internal');
4594    }
4595
4596    if (-1 !== sources.indexOf('external')) {
4597      return true;
4598    }
4599
4600    if (-1 !== sources.indexOf('search')) {
4601      return /^(google|yahoo|bing|yandex|baidu)\./.test(referrer);
4602    }
4603
4604    return false;
4605  }
4606
4607}
4608
4609exports["default"] = _default;
4610
4611/***/ }),
4612
4613/***/ "../modules/popup/assets/js/frontend/timing/times.js":
4614/*!***********************************************************!*\
4615  !*** ../modules/popup/assets/js/frontend/timing/times.js ***!
4616  \***********************************************************/
4617/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4618
4619
4620
4621var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4622
4623Object.defineProperty(exports, "__esModule", ({
4624  value: true
4625}));
4626exports["default"] = void 0;
4627
4628var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/popup/assets/js/frontend/timing/base.js"));
4629
4630class _default extends _base.default {
4631  getName() {
4632    return 'times';
4633  }
4634
4635  check() {
4636    const displayTimes = this.document.getStorage('times') || 0;
4637    return this.getTimingSetting('times') > displayTimes;
4638  }
4639
4640}
4641
4642exports["default"] = _default;
4643
4644/***/ }),
4645
4646/***/ "../modules/popup/assets/js/frontend/timing/url.js":
4647/*!*********************************************************!*\
4648  !*** ../modules/popup/assets/js/frontend/timing/url.js ***!
4649  \*********************************************************/
4650/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4651
4652
4653
4654var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4655
4656Object.defineProperty(exports, "__esModule", ({
4657  value: true
4658}));
4659exports["default"] = void 0;
4660
4661var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/popup/assets/js/frontend/timing/base.js"));
4662
4663class _default extends _base.default {
4664  getName() {
4665    return 'url';
4666  }
4667
4668  check() {
4669    const url = this.getTimingSetting('url'),
4670          action = this.getTimingSetting('action'),
4671          referrer = document.referrer;
4672
4673    if ('regex' !== action) {
4674      return 'hide' === action ^ -1 !== referrer.indexOf(url);
4675    }
4676
4677    let regexp;
4678
4679    try {
4680      regexp = new RegExp(url);
4681    } catch (e) {
4682      return false;
4683    }
4684
4685    return regexp.test(referrer);
4686  }
4687
4688}
4689
4690exports["default"] = _default;
4691
4692/***/ }),
4693
4694/***/ "../modules/popup/assets/js/frontend/triggers.js":
4695/*!*******************************************************!*\
4696  !*** ../modules/popup/assets/js/frontend/triggers.js ***!
4697  \*******************************************************/
4698/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4699
4700
4701
4702var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4703
4704Object.defineProperty(exports, "__esModule", ({
4705  value: true
4706}));
4707exports["default"] = void 0;
4708
4709var _pageLoad = _interopRequireDefault(__webpack_require__(/*! ./triggers/page-load */ "../modules/popup/assets/js/frontend/triggers/page-load.js"));
4710
4711var _scrolling = _interopRequireDefault(__webpack_require__(/*! ./triggers/scrolling */ "../modules/popup/assets/js/frontend/triggers/scrolling.js"));
4712
4713var _scrollingTo = _interopRequireDefault(__webpack_require__(/*! ./triggers/scrolling-to */ "../modules/popup/assets/js/frontend/triggers/scrolling-to.js"));
4714
4715var _click = _interopRequireDefault(__webpack_require__(/*! ./triggers/click */ "../modules/popup/assets/js/frontend/triggers/click.js"));
4716
4717var _inactivity = _interopRequireDefault(__webpack_require__(/*! ./triggers/inactivity */ "../modules/popup/assets/js/frontend/triggers/inactivity.js"));
4718
4719var _exitIntent = _interopRequireDefault(__webpack_require__(/*! ./triggers/exit-intent */ "../modules/popup/assets/js/frontend/triggers/exit-intent.js"));
4720
4721class _default extends elementorModules.Module {
4722  constructor(settings, document) {
4723    super(settings);
4724    this.document = document;
4725    this.triggers = [];
4726    this.triggerClasses = {
4727      page_load: _pageLoad.default,
4728      scrolling: _scrolling.default,
4729      scrolling_to: _scrollingTo.default,
4730      click: _click.default,
4731      inactivity: _inactivity.default,
4732      exit_intent: _exitIntent.default
4733    };
4734    this.runTriggers();
4735  }
4736
4737  runTriggers() {
4738    const settings = this.getSettings();
4739    jQuery.each(this.triggerClasses, (key, TriggerClass) => {
4740      if (!settings[key]) {
4741        return;
4742      }
4743
4744      const trigger = new TriggerClass(settings, () => this.onTriggerFired());
4745      trigger.run();
4746      this.triggers.push(trigger);
4747    });
4748  }
4749
4750  destroyTriggers() {
4751    this.triggers.forEach(trigger => trigger.destroy());
4752    this.triggers = [];
4753  }
4754
4755  onTriggerFired() {
4756    this.document.showModal(true);
4757    this.destroyTriggers();
4758  }
4759
4760}
4761
4762exports["default"] = _default;
4763
4764/***/ }),
4765
4766/***/ "../modules/popup/assets/js/frontend/triggers/base.js":
4767/*!************************************************************!*\
4768  !*** ../modules/popup/assets/js/frontend/triggers/base.js ***!
4769  \************************************************************/
4770/***/ ((__unused_webpack_module, exports) => {
4771
4772
4773
4774Object.defineProperty(exports, "__esModule", ({
4775  value: true
4776}));
4777exports["default"] = void 0;
4778
4779class _default extends elementorModules.Module {
4780  constructor(settings, callback) {
4781    super(settings);
4782    this.callback = callback;
4783  }
4784
4785  getTriggerSetting(settingKey) {
4786    return this.getSettings(this.getName() + '_' + settingKey);
4787  }
4788
4789}
4790
4791exports["default"] = _default;
4792
4793/***/ }),
4794
4795/***/ "../modules/popup/assets/js/frontend/triggers/click.js":
4796/*!*************************************************************!*\
4797  !*** ../modules/popup/assets/js/frontend/triggers/click.js ***!
4798  \*************************************************************/
4799/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4800
4801
4802
4803var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4804
4805Object.defineProperty(exports, "__esModule", ({
4806  value: true
4807}));
4808exports["default"] = void 0;
4809
4810var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/popup/assets/js/frontend/triggers/base.js"));
4811
4812class _default extends _base.default {
4813  constructor() {
4814    super(...arguments);
4815    this.checkClick = this.checkClick.bind(this);
4816    this.clicksCount = 0;
4817  }
4818
4819  getName() {
4820    return 'click';
4821  }
4822
4823  checkClick() {
4824    this.clicksCount++;
4825
4826    if (this.clicksCount === this.getTriggerSetting('times')) {
4827      this.callback();
4828    }
4829  }
4830
4831  run() {
4832    elementorFrontend.elements.$body.on('click', this.checkClick);
4833  }
4834
4835  destroy() {
4836    elementorFrontend.elements.$body.off('click', this.checkClick);
4837  }
4838
4839}
4840
4841exports["default"] = _default;
4842
4843/***/ }),
4844
4845/***/ "../modules/popup/assets/js/frontend/triggers/exit-intent.js":
4846/*!*******************************************************************!*\
4847  !*** ../modules/popup/assets/js/frontend/triggers/exit-intent.js ***!
4848  \*******************************************************************/
4849/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4850
4851
4852
4853var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4854
4855Object.defineProperty(exports, "__esModule", ({
4856  value: true
4857}));
4858exports["default"] = void 0;
4859
4860var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/popup/assets/js/frontend/triggers/base.js"));
4861
4862class _default extends _base.default {
4863  constructor() {
4864    super(...arguments);
4865    this.detectExitIntent = this.detectExitIntent.bind(this);
4866  }
4867
4868  getName() {
4869    return 'exit_intent';
4870  }
4871
4872  detectExitIntent(event) {
4873    if (event.clientY <= 0) {
4874      this.callback();
4875    }
4876  }
4877
4878  run() {
4879    elementorFrontend.elements.$window.on('mouseleave', this.detectExitIntent);
4880  }
4881
4882  destroy() {
4883    elementorFrontend.elements.$window.off('mouseleave', this.detectExitIntent);
4884  }
4885
4886}
4887
4888exports["default"] = _default;
4889
4890/***/ }),
4891
4892/***/ "../modules/popup/assets/js/frontend/triggers/inactivity.js":
4893/*!******************************************************************!*\
4894  !*** ../modules/popup/assets/js/frontend/triggers/inactivity.js ***!
4895  \******************************************************************/
4896/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4897
4898
4899
4900var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4901
4902Object.defineProperty(exports, "__esModule", ({
4903  value: true
4904}));
4905exports["default"] = void 0;
4906
4907var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/popup/assets/js/frontend/triggers/base.js"));
4908
4909class _default extends _base.default {
4910  constructor() {
4911    super(...arguments);
4912    this.restartTimer = this.restartTimer.bind(this);
4913  }
4914
4915  getName() {
4916    return 'inactivity';
4917  }
4918
4919  run() {
4920    this.startTimer();
4921    elementorFrontend.elements.$document.on('keypress mousemove', this.restartTimer);
4922  }
4923
4924  startTimer() {
4925    this.timeOut = setTimeout(this.callback, this.getTriggerSetting('time') * 1000);
4926  }
4927
4928  clearTimer() {
4929    clearTimeout(this.timeOut);
4930  }
4931
4932  restartTimer() {
4933    this.clearTimer();
4934    this.startTimer();
4935  }
4936
4937  destroy() {
4938    this.clearTimer();
4939    elementorFrontend.elements.$document.off('keypress mousemove', this.restartTimer);
4940  }
4941
4942}
4943
4944exports["default"] = _default;
4945
4946/***/ }),
4947
4948/***/ "../modules/popup/assets/js/frontend/triggers/page-load.js":
4949/*!*****************************************************************!*\
4950  !*** ../modules/popup/assets/js/frontend/triggers/page-load.js ***!
4951  \*****************************************************************/
4952/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4953
4954
4955
4956var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4957
4958Object.defineProperty(exports, "__esModule", ({
4959  value: true
4960}));
4961exports["default"] = void 0;
4962
4963var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/popup/assets/js/frontend/triggers/base.js"));
4964
4965class _default extends _base.default {
4966  getName() {
4967    return 'page_load';
4968  }
4969
4970  run() {
4971    this.timeout = setTimeout(this.callback, this.getTriggerSetting('delay') * 1000);
4972  }
4973
4974  destroy() {
4975    clearTimeout(this.timeout);
4976  }
4977
4978}
4979
4980exports["default"] = _default;
4981
4982/***/ }),
4983
4984/***/ "../modules/popup/assets/js/frontend/triggers/scrolling-to.js":
4985/*!********************************************************************!*\
4986  !*** ../modules/popup/assets/js/frontend/triggers/scrolling-to.js ***!
4987  \********************************************************************/
4988/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4989
4990
4991
4992var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
4993
4994Object.defineProperty(exports, "__esModule", ({
4995  value: true
4996}));
4997exports["default"] = void 0;
4998
4999var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/popup/assets/js/frontend/triggers/base.js"));
5000
5001class _default extends _base.default {
5002  getName() {
5003    return 'scrolling_to';
5004  }
5005
5006  run() {
5007    let $targetElement;
5008
5009    try {
5010      $targetElement = jQuery(this.getTriggerSetting('selector'));
5011    } catch (e) {
5012      return;
5013    }
5014
5015    this.waypointInstance = elementorFrontend.waypoint($targetElement, this.callback)[0];
5016  }
5017
5018  destroy() {
5019    if (this.waypointInstance) {
5020      this.waypointInstance.destroy();
5021    }
5022  }
5023
5024}
5025
5026exports["default"] = _default;
5027
5028/***/ }),
5029
5030/***/ "../modules/popup/assets/js/frontend/triggers/scrolling.js":
5031/*!*****************************************************************!*\
5032  !*** ../modules/popup/assets/js/frontend/triggers/scrolling.js ***!
5033  \*****************************************************************/
5034/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5035
5036
5037
5038var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
5039
5040Object.defineProperty(exports, "__esModule", ({
5041  value: true
5042}));
5043exports["default"] = void 0;
5044
5045var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/popup/assets/js/frontend/triggers/base.js"));
5046
5047class _default extends _base.default {
5048  constructor() {
5049    super(...arguments);
5050    this.checkScroll = this.checkScroll.bind(this);
5051    this.lastScrollOffset = 0;
5052  }
5053
5054  getName() {
5055    return 'scrolling';
5056  }
5057
5058  checkScroll() {
5059    const scrollDirection = scrollY > this.lastScrollOffset ? 'down' : 'up',
5060          requestedDirection = this.getTriggerSetting('direction');
5061    this.lastScrollOffset = scrollY;
5062
5063    if (scrollDirection !== requestedDirection) {
5064      return;
5065    }
5066
5067    if ('up' === scrollDirection) {
5068      this.callback();
5069      return;
5070    }
5071
5072    const fullScroll = elementorFrontend.elements.$document.height() - innerHeight,
5073          scrollPercent = scrollY / fullScroll * 100;
5074
5075    if (scrollPercent >= this.getTriggerSetting('offset')) {
5076      this.callback();
5077    }
5078  }
5079
5080  run() {
5081    elementorFrontend.elements.$window.on('scroll', this.checkScroll);
5082  }
5083
5084  destroy() {
5085    elementorFrontend.elements.$window.off('scroll', this.checkScroll);
5086  }
5087
5088}
5089
5090exports["default"] = _default;
5091
5092/***/ }),
5093
5094/***/ "../modules/posts/assets/js/frontend/frontend-legacy.js":
5095/*!**************************************************************!*\
5096  !*** ../modules/posts/assets/js/frontend/frontend-legacy.js ***!
5097  \**************************************************************/
5098/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5099
5100
5101
5102var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
5103
5104Object.defineProperty(exports, "__esModule", ({
5105  value: true
5106}));
5107exports["default"] = void 0;
5108
5109var _posts = _interopRequireDefault(__webpack_require__(/*! ./handlers/posts */ "../modules/posts/assets/js/frontend/handlers/posts.js"));
5110
5111var _cards = _interopRequireDefault(__webpack_require__(/*! ./handlers/cards */ "../modules/posts/assets/js/frontend/handlers/cards.js"));
5112
5113var _portfolio = _interopRequireDefault(__webpack_require__(/*! ./handlers/portfolio */ "../modules/posts/assets/js/frontend/handlers/portfolio.js"));
5114
5115var _loadMore = _interopRequireDefault(__webpack_require__(/*! ./handlers/load-more */ "../modules/posts/assets/js/frontend/handlers/load-more.js"));
5116
5117class _default extends elementorModules.Module {
5118  constructor() {
5119    super();
5120    ['classic', 'full_content', 'cards'].forEach(skinName => {
5121      elementorFrontend.elementsHandler.attachHandler('posts', _loadMore.default, skinName);
5122    });
5123    elementorFrontend.elementsHandler.attachHandler('posts', _posts.default, 'classic');
5124    elementorFrontend.elementsHandler.attachHandler('posts', _posts.default, 'full_content');
5125    elementorFrontend.elementsHandler.attachHandler('posts', _cards.default, 'cards');
5126    elementorFrontend.elementsHandler.attachHandler('portfolio', _portfolio.default);
5127  }
5128
5129}
5130
5131exports["default"] = _default;
5132
5133/***/ }),
5134
5135/***/ "../modules/posts/assets/js/frontend/handlers/cards.js":
5136/*!*************************************************************!*\
5137  !*** ../modules/posts/assets/js/frontend/handlers/cards.js ***!
5138  \*************************************************************/
5139/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5140
5141
5142
5143var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
5144
5145Object.defineProperty(exports, "__esModule", ({
5146  value: true
5147}));
5148exports["default"] = void 0;
5149
5150var _posts = _interopRequireDefault(__webpack_require__(/*! ./posts */ "../modules/posts/assets/js/frontend/handlers/posts.js"));
5151
5152var _default = _posts.default.extend({
5153  getSkinPrefix() {
5154    return 'cards_';
5155  }
5156
5157});
5158
5159exports["default"] = _default;
5160
5161/***/ }),
5162
5163/***/ "../modules/posts/assets/js/frontend/handlers/load-more.js":
5164/*!*****************************************************************!*\
5165  !*** ../modules/posts/assets/js/frontend/handlers/load-more.js ***!
5166  \*****************************************************************/
5167/***/ ((__unused_webpack_module, exports) => {
5168
5169
5170
5171Object.defineProperty(exports, "__esModule", ({
5172  value: true
5173}));
5174exports["default"] = void 0;
5175
5176class LoadMore extends elementorModules.frontend.handlers.Base {
5177  getDefaultSettings() {
5178    return {
5179      selectors: {
5180        postsContainer: '.elementor-posts-container',
5181        loadMoreButton: '.elementor-button',
5182        loadMoreSpinnerWrapper: '.e-load-more-spinner',
5183        loadMoreSpinner: '.e-load-more-spinner i, .e-load-more-spinner svg',
5184        loadMoreAnchor: '.e-load-more-anchor'
5185      },
5186      classes: {
5187        loadMoreSpin: 'eicon-animation-spin',
5188        loadMoreIsLoading: 'e-load-more-pagination-loading',
5189        loadMorePaginationEnd: 'e-load-more-pagination-end',
5190        loadMoreNoSpinner: 'e-load-more-no-spinner'
5191      }
5192    };
5193  }
5194
5195  getDefaultElements() {
5196    const selectors = this.getSettings('selectors');
5197    return {
5198      postsWidgetWrapper: this.$element[0],
5199      postsContainer: this.$element[0].querySelector(selectors.postsContainer),
5200      loadMoreButton: this.$element[0].querySelector(selectors.loadMoreButton),
5201      loadMoreSpinnerWrapper: this.$element[0].querySelector(selectors.loadMoreSpinnerWrapper),
5202      loadMoreSpinner: this.$element[0].querySelector(selectors.loadMoreSpinner),
5203      loadMoreAnchor: this.$element[0].querySelector(selectors.loadMoreAnchor)
5204    };
5205  }
5206
5207  bindEvents() {
5208    super.bindEvents(); // Handle load more functionality for on-click type.
5209
5210    if (!this.elements.loadMoreButton) {
5211      return;
5212    }
5213
5214    this.elements.loadMoreButton.addEventListener('click', event => {
5215      if (this.isLoading) {
5216        return;
5217      }
5218
5219      event.preventDefault();
5220      this.handlePostsQuery();
5221    });
5222  }
5223
5224  onInit() {
5225    super.onInit();
5226    this.classes = this.getSettings('classes');
5227    this.isLoading = false;
5228    const paginationType = this.getElementSettings('pagination_type');
5229
5230    if ('load_more_on_click' !== paginationType && 'load_more_infinite_scroll' !== paginationType) {
5231      return;
5232    }
5233
5234    this.isInfinteScroll = 'load_more_infinite_scroll' === paginationType; // When spinner is not available, the button's text should not be hidden.
5235
5236    this.isSpinnerAvailable = this.getElementSettings('load_more_spinner').value;
5237
5238    if (!this.isSpinnerAvailable) {
5239      this.elements.postsWidgetWrapper.classList.add(this.classes.loadMoreNoSpinner);
5240    }
5241
5242    if (this.isInfinteScroll) {
5243      this.handleInfiniteScroll();
5244    } else if (this.elements.loadMoreSpinnerWrapper && this.elements.loadMoreButton) {
5245      // Instead of creating 2 spinners for on-click and infinity-scroll, one spinner will be used so it should be appended to the button in on-click mode.
5246      this.elements.loadMoreButton.insertAdjacentElement('beforeEnd', this.elements.loadMoreSpinnerWrapper);
5247    } // Set the post id and element id for the ajax request.
5248
5249
5250    this.elementId = this.getID();
5251    this.postId = elementorFrontendConfig.post.id; // Set the current page and last page for handling the load more post and when no more posts to show.
5252
5253    if (this.elements.loadMoreAnchor) {
5254      this.currentPage = parseInt(this.elements.loadMoreAnchor.getAttribute('data-page'));
5255      this.maxPage = parseInt(this.elements.loadMoreAnchor.getAttribute('data-max-page'));
5256
5257      if (this.currentPage === this.maxPage || !this.currentPage) {
5258        this.handleUiWhenNoPosts();
5259      }
5260    }
5261  } // Handle load more functionality for infinity-scroll type.
5262
5263
5264  handleInfiniteScroll() {
5265    if (this.isEdit) {
5266      return;
5267    }
5268
5269    this.observer = elementorModules.utils.Scroll.scrollObserver({
5270      callback: event => {
5271        if (!event.isInViewport || this.isLoading) {
5272          return;
5273        } // When the observer is triggered it won't be triggered without scrolling, but sometimes there will be no scrollbar to trigger it again.
5274
5275
5276        this.observer.unobserve(this.elements.loadMoreAnchor);
5277        this.handlePostsQuery().then(() => {
5278          if (this.currentPage !== this.maxPage) {
5279            this.observer.observe(this.elements.loadMoreAnchor);
5280          }
5281        });
5282      }
5283    });
5284    this.observer.observe(this.elements.loadMoreAnchor);
5285  }
5286
5287  handleUiBeforeLoading() {
5288    this.isLoading = true;
5289
5290    if (this.elements.loadMoreSpinner) {
5291      this.elements.loadMoreSpinner.classList.add(this.classes.loadM
5291oreSpin);
5292    }
5293
5294    this.elements.postsWidgetWrapper.classList.add(this.classes.loadMoreIsLoading);
5295  }
5296
5297  handleUiAfterLoading() {
5298    this.isLoading = false;
5299
5300    if (this.elements.loadMoreSpinner) {
5301      this.elements.loadMoreSpinner.classList.remove(this.classes.loadMoreSpin);
5302    }
5303
5304    if (this.isInfinteScroll && this.elements.loadMoreSpinnerWrapper && this.elements.loadMoreAnchor) {
5305      // Since the spinner has to be shown after the new content (posts), it should be appended after the anchor element.
5306      this.elements.loadMoreAnchor.insertAdjacentElement('afterend', this.elements.loadMoreSpinnerWrapper);
5307    }
5308
5309    this.elements.postsWidgetWrapper.classList.remove(this.classes.loadMoreIsLoading);
5310  }
5311
5312  handleUiWhenNoPosts() {
5313    this.elements.postsWidgetWrapper.classList.add(this.classes.loadMorePaginationEnd);
5314  }
5315
5316  handleSuccessFetch(result) {
5317    this.handleUiAfterLoading(); // Grabbing only the new articles from the response without the existing once (prevent posts duplication).
5318
5319    const posts = result.querySelectorAll(`[data-id="${this.elementId}"] .elementor-posts-container > article`);
5320    const nextPageUrl = result.querySelector('.e-load-more-anchor').getAttribute('data-next-page'); // Converting HTMLCollection to an Array and iterate it.
5321
5322    const postsHTML = [...posts].reduce((accumulator, post) => {
5323      return accumulator + post.outerHTML;
5324    }, '');
5325    this.elements.postsContainer.insertAdjacentHTML('beforeend', postsHTML);
5326    this.elements.loadMoreAnchor.setAttribute('data-page', this.currentPage);
5327    this.elements.loadMoreAnchor.setAttribute('data-next-page', nextPageUrl);
5328
5329    if (this.currentPage === this.maxPage) {
5330      this.handleUiWhenNoPosts();
5331    }
5332  }
5333
5334  handlePostsQuery() {
5335    this.handleUiBeforeLoading();
5336    this.currentPage++;
5337    const nextPageUrl = this.elements.loadMoreAnchor.getAttribute('data-next-page');
5338    return fetch(nextPageUrl).then(response => response.text()).then(html => {
5339      // Convert the HTML string into a document object
5340      const parser = new DOMParser();
5341      const doc = parser.parseFromString(html, 'text/html');
5342      this.handleSuccessFetch(doc);
5343    }).catch(err => {
5344      console.warn('Something went wrong.', err);
5345    });
5346  }
5347
5348}
5349
5350exports["default"] = LoadMore;
5351
5352/***/ }),
5353
5354/***/ "../modules/posts/assets/js/frontend/handlers/portfolio.js":
5355/*!*****************************************************************!*\
5356  !*** ../modules/posts/assets/js/frontend/handlers/portfolio.js ***!
5357  \*****************************************************************/
5358/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5359
5360
5361
5362var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
5363
5364Object.defineProperty(exports, "__esModule", ({
5365  value: true
5366}));
5367exports["default"] = void 0;
5368
5369var _posts = _interopRequireDefault(__webpack_require__(/*! ./posts */ "../modules/posts/assets/js/frontend/handlers/posts.js"));
5370
5371var _default = _posts.default.extend({
5372  isActive(settings) {
5373    return settings.$element.find('.elementor-portfolio').length;
5374  },
5375
5376  getSkinPrefix() {
5377    return '';
5378  },
5379
5380  getDefaultSettings() {
5381    var settings = _posts.default.prototype.getDefaultSettings.apply(this, arguments);
5382
5383    settings.transitionDuration = 450;
5384    jQuery.extend(settings.classes, {
5385      active: 'elementor-active',
5386      item: 'elementor-portfolio-item',
5387      ghostItem: 'elementor-portfolio-ghost-item'
5388    });
5389    return settings;
5390  },
5391
5392  getDefaultElements() {
5393    var elements = _posts.default.prototype.getDefaultElements.apply(this, arguments);
5394
5395    elements.$filterButtons = this.$element.find('.elementor-portfolio__filter');
5396    return elements;
5397  },
5398
5399  getOffset(itemIndex, itemWidth, itemHeight) {
5400    var settings = this.getSettings(),
5401        itemGap = this.elements.$postsContainer.width() / settings.colsCount - itemWidth;
5402    itemGap += itemGap / (settings.colsCount - 1);
5403    return {
5404      start: (itemWidth + itemGap) * (itemIndex % settings.colsCount),
5405      top: (itemHeight + itemGap) * Math.floor(itemIndex / settings.colsCount)
5406    };
5407  },
5408
5409  getClosureMethodsNames() {
5410    var baseClosureMethods = _posts.default.prototype.getClosureMethodsNames.apply(this, arguments);
5411
5412    return baseClosureMethods.concat(['onFilterButtonClick']);
5413  },
5414
5415  filterItems(term) {
5416    var $posts = this.elements.$posts,
5417        activeClass = this.getSettings('classes.active'),
5418        termSelector = '.elementor-filter-' + term;
5419
5420    if ('__all' === term) {
5421      $posts.addClass(activeClass);
5422      return;
5423    }
5424
5425    $posts.not(termSelector).removeClass(activeClass);
5426    $posts.filter(termSelector).addClass(activeClass);
5427  },
5428
5429  removeExtraGhostItems() {
5430    var settings = this.getSettings(),
5431        $shownItems = this.elements.$posts.filter(':visible'),
5432        emptyColumns = (settings.colsCount - $shownItems.length % settings.colsCount) % settings.colsCount,
5433        $ghostItems = this.elements.$postsContainer.find('.' + settings.classes.ghostItem);
5434    $ghostItems.slice(emptyColumns).remove();
5435  },
5436
5437  handleEmptyColumns() {
5438    this.removeExtraGhostItems();
5439    var settings = this.getSettings(),
5440        $shownItems = this.elements.$posts.filter(':visible'),
5441        $ghostItems = this.elements.$postsContainer.find('.' + settings.classes.ghostItem),
5442        emptyColumns = (settings.colsCount - ($shownItems.length + $ghostItems.length) % settings.colsCount) % settings.colsCount;
5443
5444    for (var i = 0; i < emptyColumns; i++) {
5445      this.elements.$postsContainer.append(jQuery('<div>', {
5446        class: settings.classes.item + ' ' + settings.classes.ghostItem
5447      }));
5448    }
5449  },
5450
5451  showItems($activeHiddenItems) {
5452    $activeHiddenItems.show();
5453    setTimeout(function () {
5454      $activeHiddenItems.css({
5455        opacity: 1
5456      });
5457    });
5458  },
5459
5460  hideItems($inactiveShownItems) {
5461    $inactiveShownItems.hide();
5462  },
5463
5464  arrangeGrid() {
5465    var $ = jQuery,
5466        self = this,
5467        settings = self.getSettings(),
5468        $activeItems = self.elements.$posts.filter('.' + settings.classes.active),
5469        $inactiveItems = self.elements.$posts.not('.' + settings.classes.active),
5470        $activeHiddenItems = $activeItems.filter(':hidden'),
5471        $inactiveShownItems = $inactiveItems.filter(':visible');
5472    self.elements.$posts.css('transition-duration', settings.transitionDuration + 'ms');
5473    self.showItems($activeHiddenItems);
5474
5475    if (self.isEdit) {
5476      self.fitImages();
5477    }
5478
5479    self.handleEmptyColumns();
5480
5481    if (self.isMasonryEnabled()) {
5482      self.hideItems($inactiveShownItems);
5483      self.showItems($activeHiddenItems);
5484      self.handleEmptyColumns();
5485      self.runMasonry();
5486      return;
5487    }
5488
5489    $inactiveShownItems.css({
5490      opacity: 0,
5491      transform: 'scale3d(0.2, 0.2, 1)'
5492    });
5493    const $shownItems = self.elements.$posts.filter(':visible'),
5494          $activeOrShownItems = $activeItems.add($shownItems),
5495          $activeShownItems = $activeItems.filter(':visible'),
5496          itemWidth = $shownItems.outerWidth(),
5497          itemHeight = $shownItems.outerHeight();
5498    $activeShownItems.each(function () {
5499      var $item = $(this),
5500          currentOffset = self.getOffset($activeOrShownItems.index($item), itemWidth, itemHeight),
5501          requiredOffset = self.getOffset($shownItems.index($item), itemWidth, itemHeight);
5502
5503      if (currentOffset.start === requiredOffset.start && currentOffset.top === requiredOffset.top) {
5504        return;
5505      }
5506
5507      requiredOffset.start -= currentOffset.start;
5508      requiredOffset.top -= currentOffset.top;
5509
5510      if (elementorFrontend.config.is_rtl) {
5511        requiredOffset.start *= -1;
5512      }
5513
5514      $item.css({
5515        transitionDuration: '',
5516        transform: 'translate3d(' + requiredOffset.start + 'px, ' + requiredOffset.top + 'px, 0)'
5517      });
5518    });
5519    setTimeout(function () {
5520      $activeItems.each(function () {
5521        var $item = $(this),
5522            currentOffset = self.getOffset($activeOrShownItems.index($item), itemWidth, itemHeight),
5523            requiredOffset = self.getOffset($activeItems.index($item), itemWidth, itemHeight);
5524        $item.css({
5525          transitionDuration: settings.transitionDuration + 'ms'
5526        });
5527        requiredOffset.start -= currentOffset.start;
5528        requiredOffset.top -= currentOffset.top;
5529
5530        if (elementorFrontend.config.is_rtl) {
5531          requiredOffset.start *= -1;
5532        }
5533
5534        setTimeout(function () {
5535          $item.css('transform', 'translate3d(' + requiredOffset.start + 'px, ' + requiredOffset.top + 'px, 0)');
5536        });
5537      });
5538    });
5539    setTimeout(function () {
5540      self.hideItems($inactiveShownItems);
5541      $activeItems.css({
5542        transitionDuration: '',
5543        transform: 'translate3d(0px, 0px, 0px)'
5544      });
5545      self.handleEmptyColumns();
5546    }, settings.transitionDuration);
5547  },
5548
5549  activeFilterButton(filter) {
5550    var activeClass = this.getSettings('classes.active'),
5551        $filterButtons = this.elements.$filterButtons,
5552        $button = $filterButtons.filter('[data-filter="' + filter + '"]');
5553    $filterButtons.removeClass(activeClass);
5554    $button.addClass(activeClass);
5555  },
5556
5557  setFilter(filter) {
5558    this.activeFilterButton(filter);
5559    this.filterItems(filter);
5560    this.arrangeGrid();
5561  },
5562
5563  refreshGrid() {
5564    this.setColsCountSettings();
5565    this.arrangeGrid();
5566  },
5567
5568  bindEvents() {
5569    _posts.default.prototype.bindEvents.apply(this, arguments);
5570
5571    this.elements.$filterButtons.on('click', this.onFilterButtonClick);
5572  },
5573
5574  isMasonryEnabled() {
5575    return !!this.getElementSettings('masonry');
5576  },
5577
5578  run() {
5579    _posts.default.prototype.run.apply(this, arguments);
5580
5581    this.setColsCountSettings();
5582    this.setFilter('__all');
5583    this.handleEmptyColumns();
5584  },
5585
5586  onFilterButtonClick(event) {
5587    this.setFilter(jQuery(event.currentTarget).data('filter'));
5588  },
5589
5590  onWindowResize() {
5591    _posts.default.prototype.onWindowResize.apply(this, arguments);
5592
5593    this.refreshGrid();
5594  },
5595
5596  onElementChange(propertyName) {
5597    _posts.default.prototype.onElementChange.apply(this, arguments);
5598
5599    if ('classic_item_ratio' === propertyName) {
5600      this.refreshGrid();
5601    }
5602  }
5603
5604});
5605
5606exports["default"] = _default;
5607
5608/***/ }),
5609
5610/***/ "../modules/posts/assets/js/frontend/handlers/posts.js":
5611/*!*************************************************************!*\
5612  !*** ../modules/posts/assets/js/frontend/handlers/posts.js ***!
5613  \*************************************************************/
5614/***/ ((__unused_webpack_module, exports) => {
5615
5616
5617
5618Object.defineProperty(exports, "__esModule", ({
5619  value: true
5620}));
5621exports["default"] = void 0;
5622
5623var _default = elementorModules.frontend.handlers.Base.extend({
5624  getSkinPrefix() {
5625    return 'classic_';
5626  },
5627
5628  bindEvents() {
5629    var cid = this.getModelCID();
5630    elementorFrontend.addListenerOnce(cid, 'resize', this.onWindowResize);
5631  },
5632
5633  getClosureMethodsNames() {
5634    return elementorModules.frontend.handlers.Base.prototype.getClosureMethodsNames.apply(this, arguments).concat(['fitImages', 'onWindowResize', 'runMasonry']);
5635  },
5636
5637  getDefaultSettings() {
5638    return {
5639      classes: {
5640        fitHeight: 'elementor-fit-height',
5641        hasItemRatio: 'elementor-has-item-ratio'
5642      },
5643      selectors: {
5644        postsContainer: '.elementor-posts-container',
5645        post: '.elementor-post',
5646        postThumbnail: '.elementor-post__thumbnail',
5647        postThumbnailImage: '.elementor-post__thumbnail img'
5648      }
5649    };
5650  },
5651
5652  getDefaultElements() {
5653    var selectors = this.getSettings('selectors');
5654    return {
5655      $postsContainer: this.$element.find(selectors.postsContainer),
5656      $posts: this.$element.find(selectors.post)
5657    };
5658  },
5659
5660  fitImage($post) {
5661    var settings = this.getSettings(),
5662        $imageParent = $post.find(settings.selectors.postThumbnail),
5663        $image = $imageParent.find('img'),
5664        image = $image[0];
5665
5666    if (!image) {
5667      return;
5668    }
5669
5670    var imageParentRatio = $imageParent.outerHeight() / $imageParent.outerWidth(),
5671        imageRatio = image.naturalHeight / image.naturalWidth;
5672    $imageParent.toggleClass(settings.classes.fitHeight, imageRatio < imageParentRatio);
5673  },
5674
5675  fitImages() {
5676    var $ = jQuery,
5677        self = this,
5678        itemRatio = getComputedStyle(this.$element[0], ':after').content,
5679        settings = this.getSettings();
5680
5681    if (self.isMasonryEnabled()) {
5682      this.elements.$postsContainer.removeClass(settings.classes.hasItemRatio);
5683      return;
5684    }
5685
5686    this.elements.$postsContainer.toggleClass(settings.classes.hasItemRatio, !!itemRatio.match(/\d/));
5687    this.elements.$posts.each(function () {
5688      var $post = $(this),
5689          $image = $post.find(settings.selectors.postThumbnailImage);
5690      self.fitImage($post);
5691      $image.on('load', function () {
5692        self.fitImage($post);
5693      });
5694    });
5695  },
5696
5697  setColsCountSettings() {
5698    var currentDeviceMode = elementorFrontend.getCurrentDeviceMode(),
5699        settings = this.getElementSettings(),
5700        skinPrefix = this.getSkinPrefix(),
5701        colsCount;
5702
5703    switch (currentDeviceMode) {
5704      case 'mobile':
5705        colsCount = settings[skinPrefix + 'columns_mobile'];
5706        break;
5707
5708      case 'tablet':
5709        colsCount = settings[skinPrefix + 'columns_tablet'];
5710        break;
5711
5712      default:
5713        colsCount = settings[skinPrefix + 'columns'];
5714    }
5715
5716    this.setSettings('colsCount', colsCount);
5717  },
5718
5719  isMasonryEnabled() {
5720    return !!this.getElementSettings(this.getSkinPrefix() + 'masonry');
5721  },
5722
5723  initMasonry() {
5724    imagesLoaded(this.elements.$posts, this.runMasonry);
5725  },
5726
5727  runMasonry() {
5728    var elements = this.elements;
5729    elements.$posts.css({
5730      marginTop: '',
5731      transitionDuration: ''
5732    });
5733    this.setColsCountSettings();
5734    var colsCount = this.getSettings('colsCount'),
5735        hasMasonry = this.isMasonryEnabled() && colsCount >= 2;
5736    elements.$postsContainer.toggleClass('elementor-posts-masonry', hasMasonry);
5737
5738    if (!hasMasonry) {
5739      elements.$postsContainer.height('');
5740      return;
5741    }
5742    /* The `verticalSpaceBetween` variable is setup in a way that supports older versions of the portfolio widget */
5743
5744
5745    var verticalSpaceBetween = this.getElementSettings(this.getSkinPrefix() + 'row_gap.size');
5746
5747    if ('' === this.getSkinPrefix() && '' === verticalSpaceBetween) {
5748      verticalSpaceBetween = this.getElementSettings(this.getSkinPrefix() + 'item_gap.size');
5749    }
5750
5751    var masonry = new elementorModules.utils.Masonry({
5752      container: elements.$postsContainer,
5753      items: elements.$posts.filter(':visible'),
5754      columnsCount: this.getSettings('colsCount'),
5755      verticalSpaceBetween: verticalSpaceBetween || 0
5756    });
5757    masonry.run();
5758  },
5759
5760  run() {
5761    // For slow browsers
5762    setTimeout(this.fitImages, 0);
5763    this.initMasonry();
5764  },
5765
5766  onInit() {
5767    elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
5768    this.bindEvents();
5769    this.run();
5770  },
5771
5772  onWindowResize() {
5773    this.fitImages();
5774    this.runMasonry();
5775  },
5776
5777  onElementChange() {
5778    this.fitImages();
5779    setTimeout(this.runMasonry);
5780  }
5781
5782});
5783
5784exports["default"] = _default;
5785
5786/***/ }),
5787
5788/***/ "../modules/share-buttons/assets/js/frontend/frontend-legacy.js":
5789/*!**********************************************************************!*\
5790  !*** ../modules/share-buttons/assets/js/frontend/frontend-legacy.js ***!
5791  \**********************************************************************/
5792/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5793
5794
5795
5796var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
5797
5798Object.defineProperty(exports, "__esModule", ({
5799  value: true
5800}));
5801exports["default"] = void 0;
5802
5803var _shareButtons = _interopRequireDefault(__webpack_require__(/*! ./handlers/share-buttons */ "../modules/share-buttons/assets/js/frontend/handlers/share-buttons.js"));
5804
5805class _default extends elementorModules.Module {
5806  constructor() {
5807    super();
5808    elementorFrontend.elementsHandler.attachHandler('share-buttons', _shareButtons.default);
5809  }
5810
5811}
5812
5813exports["default"] = _default;
5814
5815/***/ }),
5816
5817/***/ "../modules/share-buttons/assets/js/frontend/handlers/share-buttons.js":
5818/*!*****************************************************************************!*\
5819  !*** ../modules/share-buttons/assets/js/frontend/handlers/share-buttons.js ***!
5820  \*****************************************************************************/
5821/***/ ((__unused_webpack_module, exports) => {
5822
5823
5824
5825Object.defineProperty(exports, "__esModule", ({
5826  value: true
5827}));
5828exports["default"] = void 0;
5829
5830var _default = elementorModules.frontend.handlers.Base.extend({
5831  async onInit() {
5832    if (!this.isActive()) {
5833      return;
5834    }
5835
5836    elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
5837    const elementSettings = this.getElementSettings(),
5838          classes = this.getSettings('classes'),
5839          isCustomURL = elementSettings.share_url && elementSettings.share_url.url,
5840          shareLinkSettings = {
5841      classPrefix: classes.shareLinkPrefix
5842    };
5843
5844    if (isCustomURL) {
5845      shareLinkSettings.url = elementSettings.share_url.url;
5846    } else {
5847      shareLinkSettings.url = location.href;
5848      shareLinkSettings.title = elementorFrontend.config.post.title;
5849      shareLinkSettings.text = elementorFrontend.config.post.excerpt;
5850      shareLinkSettings.image = elementorFrontend.config.post.featuredImage;
5851    }
5852    /**
5853     * First check of the ShareLink is for detecting if the optimized mode is disabled and the library should be loaded dynamically.
5854     * Checking if the assetsLoader exist, in case that the library is not loaded due to Ad Blockers and not because the optimized mode is enabled.
5855     */
5856
5857
5858    if (!window.ShareLink && elementorFrontend.utils.assetsLoader) {
5859      await elementorFrontend.utils.assetsLoader.load('script', 'share-link');
5860    }
5861    /**
5862     * The following condition should remain regardless of the share-link dynamic loading.
5863     * Ad Blockers may block the share script. (/assets/lib/share-link/share-link.js).
5864     */
5865
5866
5867    if (!this.elements.$shareButton.shareLink) {
5868      return;
5869    }
5870
5871    this.elements.$shareButton.shareLink(shareLinkSettings);
5872  },
5873
5874  getDefaultSettings() {
5875    return {
5876      selectors: {
5877        shareButton: '.elementor-share-btn'
5878      },
5879      classes: {
5880        shareLinkPrefix: 'elementor-share-btn_'
5881      }
5882    };
5883  },
5884
5885  getDefaultElements() {
5886    var selectors = this.getSettings('selectors');
5887    return {
5888      $shareButton: this.$element.find(selectors.shareButton)
5889    };
5890  },
5891
5892  isActive() {
5893    return !elementorFrontend.isEditMode();
5894  }
5895
5896});
5897
5898exports["default"] = _default;
5899
5900/***/ }),
5901
5902/***/ "../modules/slides/assets/js/frontend/frontend-legacy.js":
5903/*!***************************************************************!*\
5904  !*** ../modules/slides/assets/js/frontend/frontend-legacy.js ***!
5905  \***************************************************************/
5906/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5907
5908
5909
5910var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
5911
5912Object.defineProperty(exports, "__esModule", ({
5913  value: true
5914}));
5915exports["default"] = void 0;
5916
5917var _slides = _interopRequireDefault(__webpack_require__(/*! ./handlers/slides */ "../modules/slides/assets/js/frontend/handlers/slides.js"));
5918
5919class _default extends elementorModules.Module {
5920  constructor() {
5921    super();
5922    elementorFrontend.elementsHandler.attachHandler('slides', _slides.default);
5923  }
5924
5925}
5926
5927exports["default"] = _default;
5928
5929/***/ }),
5930
5931/***/ "../modules/slides/assets/js/frontend/handlers/slides.js":
5932/*!***************************************************************!*\
5933  !*** ../modules/slides/assets/js/frontend/handlers/slides.js ***!
5934  \***************************************************************/
5935/***/ ((__unused_webpack_module, exports) => {
5936
5937
5938
5939Object.defineProperty(exports, "__esModule", ({
5940  value: true
5941}));
5942exports["default"] = void 0;
5943
5944class SlidesHandler extends elementorModules.frontend.handlers.SwiperBase {
5945  getDefaultSettings() {
5946    return {
5947      selectors: {
5948        slider: '.elementor-slides-wrapper',
5949        slide: '.swiper-slide',
5950        slideInnerContents: '.swiper-slide-contents',
5951        activeSlide: '.swiper-slide-active',
5952        activeDuplicate: '.swiper-slide-duplicate-active'
5953      },
5954      classes: {
5955        animated: 'animated',
5956        kenBurnsActive: 'elementor-ken-burns--active',
5957        slideBackground: 'swiper-slide-bg'
5958      },
5959      attributes: {
5960        dataSliderOptions: 'slider_options',
5961        dataAnimation: 'animation'
5962      }
5963    };
5964  }
5965
5966  getDefaultElements() {
5967    const selectors = this.getSettings('selectors'),
5968          elements = {
5969      $swiperContainer: this.$element.find(selectors.slider)
5970    };
5971    elements.$slides = elements.$swiperContainer.find(selectors.slide);
5972    return elements;
5973  }
5974
5975  getSwiperOptions() {
5976    const elementSettings = this.getElementSettings(),
5977          swiperOptions = {
5978      autoplay: this.getAutoplayConfig(),
5979      grabCursor: true,
5980      initialSlide: this.getInitialSlide(),
5981      slidesPerView: 1,
5982      slidesPerGroup: 1,
5983      loop: 'yes' === elementSettings.infinite,
5984      speed: elementSettings.transition_speed,
5985      effect: elementSettings.transition,
5986      observeParents: true,
5987      observer: true,
5988      handleElementorBreakpoints: true,
5989      on: {
5990        slideChange: () => {
5991          this.handleKenBurns();
5992        }
5993      }
5994    };
5995    const showArrows = 'arrows' === elementSettings.navigation || 'both' === elementSettings.navigation,
5996          pagination = 'dots' === elementSettings.navigation || 'both' === elementSettings.navigation;
5997
5998    if (showArrows) {
5999      swiperOptions.navigation = {
6000        prevEl: '.elementor-swiper-button-prev',
6001        nextEl: '.elementor-swiper-button-next'
6002      };
6003    }
6004
6005    if (pagination) {
6006      swiperOptions.pagination = {
6007        el: '.swiper-pagination',
6008        type: 'bullets',
6009        clickable: true
6010      };
6011    }
6012
6013    if (true === swiperOptions.loop) {
6014      swiperOptions.loopedSlides = this.getSlidesCount();
6015    }
6016
6017    if ('fade' === swiperOptions.effect) {
6018      swiperOptions.fadeEffect = {
6019        crossFade: true
6020      };
6021    }
6022
6023    return swiperOptions;
6024  }
6025
6026  getAutoplayConfig() {
6027    const elementSettings = this.getElementSettings();
6028
6029    if ('yes' !== elementSettings.autoplay) {
6030      return false;
6031    }
6032
6033    return {
6034      stopOnLastSlide: true,
6035      // Has no effect in infinite mode by default.
6036      delay: elementSettings.autoplay_speed,
6037      disableOnInteraction: 'yes' === elementSettings.pause_on_interaction
6038    };
6039  }
6040
6041  initSingleSlideAnimations() {
6042    const settings = this.getSettings(),
6043          animation = this.elements.$swiperContainer.data(settings.attributes.dataAnimation);
6044    this.elements.$swiperContainer.find('.' + settings.classes.slideBackground).addClass(settings.classes.kenBurnsActive); // If there is an animation, get the container of the slide's inner contents and add the animation classes to it
6045
6046    if (animation) {
6047      this.elements.$swiperContainer.find(settings.selectors.slideInnerContents).addClass(settings.classes.animated + ' ' + animation);
6048    }
6049  }
6050
6051  async initSlider() {
6052    const $slider = this.elements.$swiperContainer;
6053
6054    if (!$slider.length) {
6055      return;
6056    }
6057
6058    if (1 >= this.getSlidesCount()) {
6059      return;
6060    }
6061
6062    const Swiper = elementorFrontend.utils.swiper;
6063    this.swiper = await new Swiper($slider, this.getSwiperOptions()); // Expose the swiper instance in the frontend
6064
6065    $slider.data('swiper', this.swiper); // The Ken Burns effect will only apply on the specific slides that toggled the effect ON,
6066    // since it depends on an additional class besides 'elementor-ken-burns--active'
6067
6068    this.handleKenBurns();
6069    const elementSettings = this.getElementSettings();
6070
6071    if (elementSettings.pause_on_hover) {
6072      this.togglePauseOnHover(true);
6073    }
6074
6075    const settings = this.getSettings();
6076    const animation = $slider.data(settings.attributes.dataAnimation);
6077
6078    if (!animation) {
6079      return;
6080    }
6081
6082    this.swiper.on('slideChangeTransitionStart', function () {
6083      const $sliderContent = $slider.find(settings.selectors.slideInnerContents);
6084      $sliderContent.removeClass(settings.classes.animated + ' ' + animation).hide();
6085    });
6086    this.swiper.on('slideChangeTransitionEnd', function () {
6087      const $currentSlide = $slider.find(settings.selectors.slideInnerContents);
6088      $currentSlide.show().addClass(settings.classes.animated + ' ' + animation);
6089    });
6090  }
6091
6092  onInit() {
6093    elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
6094
6095    if (2 > this.getSlidesCount()) {
6096      this.initSingleSlideAnimations();
6097      return;
6098    }
6099
6100    this.initSlider();
6101  }
6102
6103  getChangeableProperties() {
6104    return {
6105      pause_on_hover: 'pauseOnHover',
6106      pause_on_interaction: 'disableOnInteraction',
6107      autoplay_speed: 'delay',
6108      transition_speed: 'speed'
6109    };
6110  }
6111
6112  updateSwiperOption(propertyName) {
6113    if (0 === propertyName.indexOf('width')) {
6114      this.swiper.update();
6115      return;
6116    }
6117
6118    const elementSettings = this.getElementSettings(),
6119          newSettingValue = elementSettings[propertyName],
6120          changeableProperties = this.getChangeableProperties();
6121    let propertyToUpdate = changeableProperties[propertyName],
6122        valueToUpdate = newSettingValue; // Handle special cases where the value to update is not the value that the Swiper library accepts
6123
6124    switch (propertyName) {
6125      case 'autoplay_speed':
6126        propertyToUpdate = 'autoplay';
6127        valueToUpdate = {
6128          delay: newSettingValue,
6129          disableOnInteraction: 'yes' === elementSettings.pause_on_interaction
6130        };
6131        break;
6132
6133      case 'pause_on_hover':
6134        this.togglePauseOnHover('yes' === newSettingValue);
6135        break;
6136
6137      case 'pause_on_interaction':
6138        valueToUpdate = 'yes' === newSettingValue;
6139        break;
6140    } // 'pause_on_hover' is implemented by the handler with event listeners, not the Swiper library
6141
6142
6143    if ('pause_on_hover' !== propertyName) {
6144      this.swiper.params[propertyToUpdate] = valueToUpdate;
6145    }
6146
6147    this.swiper.update();
6148  }
6149
6150  onElementChange(propertyName) {
6151    if (1 >= this.getSlidesCount()) {
6152      return;
6153    }
6154
6155    const changeableProperties = this.getChangeableProperties();
6156
6157    if (changeableProperties.hasOwnProperty(propertyName)) {
6158      this.updateSwiperOption(propertyName);
6159    }
6160  }
6161
6162  onEditSettingsChange(propertyName) {
6163    if (1 >= this.getSlidesCount()) {
6164      return;
6165    }
6166
6167    if ('activeItemIndex' === propertyName) {
6168      this.swiper.slideToLoop(this.getEditSettings('activeItemIndex') - 1);
6169    }
6170  }
6171
6172}
6173
6174exports["default"] = SlidesHandler;
6175
6176/***/ }),
6177
6178/***/ "../modules/social/assets/js/frontend/frontend-legacy.js":
6179/*!***************************************************************!*\
6180  !*** ../modules/social/assets/js/frontend/frontend-legacy.js ***!
6181  \***************************************************************/
6182/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6183
6184
6185
6186var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
6187
6188Object.defineProperty(exports, "__esModule", ({
6189  value: true
6190}));
6191exports["default"] = void 0;
6192
6193var _facebook = _interopRequireDefault(__webpack_require__(/*! ./handlers/facebook */ "../modules/social/assets/js/frontend/handlers/facebook.js"));
6194
6195class _default extends elementorModules.Module {
6196  constructor() {
6197    super();
6198    elementorFrontend.elementsHandler.attachHandler('facebook-button', _facebook.default);
6199    elementorFrontend.elementsHandler.attachHandler('facebook-comments', _facebook.default);
6200    elementorFrontend.elementsHandler.attachHandler('facebook-embed', _facebook.default);
6201    elementorFrontend.elementsHandler.attachHandler('facebook-page', _facebook.default);
6202  }
6203
6204}
6205
6206exports["default"] = _default;
6207
6208/***/ }),
6209
6210/***/ "../modules/social/assets/js/frontend/handlers/facebook.js":
6211/*!*****************************************************************!*\
6212  !*** ../modules/social/assets/js/frontend/handlers/facebook.js ***!
6213  \*****************************************************************/
6214/***/ ((__unused_webpack_module, exports) => {
6215
6216
6217
6218Object.defineProperty(exports, "__esModule", ({
6219  value: true
6220}));
6221exports["default"] = void 0;
6222
6223class FacebookHandler extends elementorModules.frontend.handlers.Base {
6224  getConfig() {
6225    return elementorProFrontend.config.facebook_sdk;
6226  }
6227
6228  setConfig(prop, value) {
6229    elementorProFrontend.config.facebook_sdk[prop] = value;
6230  }
6231
6232  parse() {
6233    // On FB SDK is loaded, parse current element
6234    FB.XFBML.parse(this.$element[0]);
6235  }
6236
6237  loadSDK() {
6238    const config = this.getConfig(); // Preventing from ajax request to be sent multiple times when loading multiple widgets
6239
6240    if (config.isLoading || config.isLoaded) {
6241      return;
6242    }
6243
6244    this.setConfig('isLoading', true);
6245    jQuery.ajax({
6246      url: 'https://connect.facebook.net/' + config.lang + '/sdk.js',
6247      dataType: 'script',
6248      cache: true,
6249      success: () => {
6250        FB.init({
6251          appId: config.app_id,
6252          version: 'v2.10',
6253          xfbml: false
6254        });
6255        this.setConfig('isLoaded', true);
6256        this.setConfig('isLoading', false);
6257        elementorFrontend.elements.$document.trigger('fb:sdk:loaded');
6258      }
6259    });
6260  }
6261
6262  onInit() {
6263    super.onInit(...arguments);
6264    this.loadSDK();
6265    const config = this.getConfig();
6266
6267    if (config.isLoaded) {
6268      this.parse();
6269    } else {
6270      elementorFrontend.elements.$document.on('fb:sdk:loaded', () => this.parse());
6271    }
6272  }
6273
6274}
6275
6276exports["default"] = FacebookHandler;
6277
6278/***/ }),
6279
6280/***/ "../modules/table-of-contents/assets/js/frontend/frontend-legacy.js":
6281/*!**************************************************************************!*\
6282  !*** ../modules/table-of-contents/assets/js/frontend/frontend-legacy.js ***!
6283  \**************************************************************************/
6284/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6285
6286
6287
6288var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
6289
6290Object.defineProperty(exports, "__esModule", ({
6291  value: true
6292}));
6293exports["default"] = void 0;
6294
6295var _tableOfContents = _interopRequireDefault(__webpack_require__(/*! ./handlers/table-of-contents */ "../modules/table-of-contents/assets/js/frontend/handlers/table-of-contents.js"));
6296
6297class _default extends elementorModules.Module {
6298  constructor() {
6299    super();
6300    elementorFrontend.elementsHandler.attachHandler('table-of-contents', _tableOfContents.default);
6301  }
6302
6303}
6304
6305exports["default"] = _default;
6306
6307/***/ }),
6308
6309/***/ "../modules/table-of-contents/assets/js/frontend/handlers/table-of-contents.js":
6310/*!*************************************************************************************!*\
6311  !*** ../modules/table-of-contents/assets/js/frontend/handlers/table-of-contents.js ***!
6312  \*************************************************************************************/
6313/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6314
6315/* provided dependency */ var __ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n")["__"];
6316
6317
6318Object.defineProperty(exports, "__esModule", ({
6319  value: true
6320}));
6321exports["default"] = void 0;
6322
6323class TOCHandler extends elementorModules.frontend.handlers.Base {
6324  getDefaultSettings() {
6325    const elementSettings = this.getElementSettings(),
6326          listWrapperTag = 'numbers' === elementSettings.marker_view ? 'ol' : 'ul';
6327    return {
6328      selectors: {
6329        widgetContainer: '.elementor-widget-container',
6330        postContentContainer: '.elementor:not([data-elementor-type="header"]):not([data-elementor-type="footer"]):not([data-elementor-type="popup"])',
6331        expandButton: '.elementor-toc__toggle-button--expand',
6332        collapseButton: '.elementor-toc__toggle-button--collapse',
6333        body: '.elementor-toc__body',
6334        headerTitle: '.elementor-toc__header-title'
6335      },
6336      classes: {
6337        anchor: 'elementor-menu-anchor',
6338        listWrapper: 'elementor-toc__list-wrapper',
6339        listItem: 'elementor-toc__list-item',
6340        listTextWrapper: 'elementor-toc__list-item-text-wrapper',
6341        firstLevelListItem: 'elementor-toc__top-level',
6342        listItemText: 'elementor-toc__list-item-text',
6343        activeItem: 'elementor-item-active',
6344        headingAnchor: 'elementor-toc__heading-anchor',
6345        collapsed: 'elementor-toc--collapsed'
6346      },
6347      listWrapperTag
6348    };
6349  }
6350
6351  getDefaultElements() {
6352    const settings = this.getSettings();
6353    return {
6354      $pageContainer: this.getContainer(),
6355      $widgetContainer: this.$element.find(settings.selectors.widgetContainer),
6356      $expandButton: this.$element.find(settings.selectors.expandButton),
6357      $collapseButton: this.$element.find(settings.selectors.collapseButton),
6358      $tocBody: this.$element.find(settings.selectors.body),
6359      $listItems: this.$element.find('.' + settings.classes.listItem)
6360    };
6361  }
6362
6363  getContainer() {
6364    const elementSettings = this.getElementSettings(); // If there is a custom container defined by the user, use it as the headings-scan container
6365
6366    if (elementSettings.container) {
6367      return jQuery(elementSettings.container);
6368    } // Get the document wrapper element in which the TOC is located
6369
6370
6371    const $documentWrapper = this.$element.parents('.elementor'); // If the TOC container is a popup, only scan the popup for headings
6372
6373    if ('popup' === $documentWrapper.attr('data-elementor-type')) {
6374      return $documentWrapper;
6375    } // If the TOC container is anything other than a popup, scan only the post/page content for headings
6376
6377
6378    const settings = this.getSettings();
6379    return jQuery(settings.selectors.postContentContainer);
6380  }
6381
6382  bindEvents() {
6383    const elementSettings = this.getElementSettings();
6384
6385    if (elementSettings.minimize_box) {
6386      this.elements.$expandButton.on('click', () => this.expandBox());
6387      this.elements.$collapseButton.on('click', () => this.collapseBox());
6388    }
6389
6390    if (elementSettings.collapse_subitems) {
6391      this.elements.$listItems.on('hover', event => jQuery(event.target).slideToggle());
6392    }
6393  }
6394
6395  getHeadings() {
6396    // Get all headings from document by user-selected tags
6397    const elementSettings = this.getElementSettings(),
6398          tags = elementSettings.headings_by_tags.join(','),
6399          selectors = this.getSettings('selectors'),
6400          excludedSelectors = elementSettings.exclude_headings_by_selector;
6401    return this.elements.$pageContainer.find(tags).not(selectors.headerTitle).filter((index, heading) => {
6402      return !jQuery(heading).closest(excludedSelectors).length; // Handle excluded selectors if there are any
6403    });
6404  }
6405
6406  addAnchorsBeforeHeadings() {
6407    const classes = this.getSettings('classes'); // Add an anchor element right before each TOC heading to create anchors for TOC links
6408
6409    this.elements.$headings.before(index => {
6410      // Check if the heading element itself has an ID, or if it is a widget which includes a main heading element, whether the widget wrapper has an ID
6411      if (jQuery(this.elements.$headings[index]).data('hasOwnID')) {
6412        return;
6413      }
6414
6415      return `<span id="${classes.headingAnchor}-${index}" class="${classes.anchor} "></span>`;
6416    });
6417  }
6418
6419  activateItem($listItem) {
6420    const classes = this.getSettings('classes');
6421    this.deactivateActiveItem($listItem);
6422    $listItem.addClass(classes.activeItem);
6423    this.$activeItem = $listItem;
6424
6425    if (!this.getElementSettings('collapse_subitems')) {
6426      return;
6427    }
6428
6429    let $activeList;
6430
6431    if ($listItem.hasClass(classes.firstLevelListItem)) {
6432      $activeList = $listItem.parent().next();
6433    } else {
6434      $activeList = $listItem.parents('.' + classes.listWrapper).eq(-2);
6435    }
6436
6437    if (!$activeList.length) {
6438      delete this.$activeList;
6439      return;
6440    }
6441
6442    this.$activeList = $activeList;
6443    this.$activeList.stop().slideDown();
6444  }
6445
6446  deactivateActiveItem($activeToBe) {
6447    if (!this.$activeItem || this.$activeItem.is($activeToBe)) {
6448      return;
6449    }
6450
6451    const {
6452      classes
6453    } = this.getSettings();
6454    this.$activeItem.removeClass(classes.activeItem);
6455
6456    if (this.$activeList && (!$activeToBe || !this.$activeList[0].contains($activeToBe[0]))) {
6457      this.$activeList.slideUp();
6458    }
6459  }
6460
6461  followAnchor($element, index) {
6462    const anchorSelector = $element[0].hash;
6463    let $anchor;
6464
6465    try {
6466      // `decodeURIComponent` for UTF8 characters in the hash.
6467      $anchor = jQuery(decodeURIComponent(anchorSelector));
6468    } catch (e) {
6469      return;
6470    }
6471
6472    elementorFrontend.waypoint($anchor, direction => {
6473      if (this.itemClicked) {
6474        return;
6475      }
6476
6477      const id = $anchor.attr('id');
6478
6479      if ('down' === direction) {
6480        this.viewportItems[id] = true;
6481        this.activateItem($element);
6482      } else {
6483        delete this.viewportItems[id];
6484        this.activateItem(this.$listItemTexts.eq(index - 1));
6485      }
6486    }, {
6487      offset: 'bottom-in-view',
6488      triggerOnce: false
6489    });
6490    elementorFrontend.waypoint($anchor, direction => {
6491      if (this.itemClicked) {
6492        return;
6493      }
6494
6495      const id = $anchor.attr('id');
6496
6497      if ('down' === direction) {
6498        delete this.viewportItems[id];
6499
6500        if (Object.keys(this.viewportItems).length) {
6501          this.activateItem(this.$listItemTexts.eq(index + 1));
6502        }
6503      } else {
6504        this.viewportItems[id] = true;
6505        this.activateItem($element);
6506      }
6507    }, {
6508      offset: 0,
6509      triggerOnce: false
6510    });
6511  }
6512
6513  followAnchors() {
6514    this.$listItemTexts.each((index, element) => this.followAnchor(jQuery(element), index));
6515  }
6516
6517  populateTOC() {
6518    this.listItemPointer = 0;
6519    const elementSettings = this.getElementSettings();
6520
6521    if (elementSettings.hierarchical_view) {
6522      this.createNestedList();
6523    } else {
6524      this.createFlatList();
6525    }
6526
6527    this.$listItemTexts = this.$element.find('.elementor-toc__list-item-text');
6528    this.$listItemTexts.on('click', this.onListItemClick.bind(this));
6529
6530    if (!elementorFrontend.isEditMode()) {
6531      this.followAnchors();
6532    }
6533  }
6534
6535  createNestedList() {
6536    this.headingsData.forEach((heading, index) => {
6537      heading.level = 0;
6538
6539      for (let i = index - 1; i >= 0; i--) {
6540        const currentOrderedItem = this.headingsData[i];
6541
6542        if (currentOrderedItem.tag <= heading.tag) {
6543          heading.level = currentOrderedItem.level;
6544
6545          if (currentOrderedItem.tag < heading.tag) {
6546            heading.level++;
6547          }
6548
6549          break;
6550        }
6551      }
6552    });
6553    this.elements.$tocBody.html(this.getNestedLevel(0));
6554  }
6555
6556  createFlatList() {
6557    this.elements.$tocBody.html(this.getNestedLevel());
6558  }
6559
6560  getNestedLevel(level) {
6561    const settings = this.getSettings(),
6562          elementSettings = this.getElementSettings(),
6563          icon = this.getElementSettings('icon');
6564    let renderedIcon;
6565
6566    if (icon) {
6567      // We generate the icon markup in PHP and make it available via get_frontend_settings(). As a result, the
6568      // rendered icon is not available in the editor, so in the editor we use the regular <i> tag.
6569      if (elementorFrontend.config.experimentalFeatures.e_font_icon_svg && !elementorFrontend.isEditMode()) {
6570        renderedIcon = icon.rendered_tag;
6571      } else {
6572        renderedIcon = `<i class="${icon.value}"></i>`;
6573      }
6574    } // Open new list/nested list
6575
6576
6577    let html = `<${settings.listWrapperTag} class="${settings.classes.listWrapper}">`; // for each list item, build its markup.
6578
6579    while (this.listItemPointer < this.headingsData.length) {
6580      const currentItem = this.headingsData[this.listItemPointer];
6581      let listItemTextClasses = settings.classes.listItemText;
6582
6583      if (0 === currentItem.level) {
6584        // If the current list item is a top level item, give it the first level class
6585        listItemTextClasses += ' ' + settings.classes.firstLevelListItem;
6586      }
6587
6588      if (level > currentItem.level) {
6589        break;
6590      }
6591
6592      if (level === currentItem.level) {
6593        html += `<li class="${settings.classes.listItem}">`;
6594        html += `<div class="${settings.classes.listTextWrapper}">`;
6595        let liContent = `<a href="#${currentItem.anchorLink}" class="${listItemTextClasses}">${currentItem.text}</a>`; // If list type is bullets, add the bullet icon as an <i> tag
6596
6597        if ('bullets' === elementSettings.marker_view && icon) {
6598          liContent = `${renderedIcon}${liContent}`;
6599        }
6600
6601        html += liContent;
6602        html += '</div>';
6603        this.listItemPointer++;
6604        const nextItem = this.headingsData[this.listItemPointer];
6605
6606        if (nextItem && level < nextItem.level) {
6607          // If a new nested list has to be created under the current item,
6608          // this entire method is called recursively (outside the while loop, a list wrapper is created)
6609          html += this.getNestedLevel(nextItem.level);
6610        }
6611
6612        html += '</li>';
6613      }
6614    }
6615
6616    html += `</${settings.listWrapperTag}>`;
6617    return html;
6618  }
6619
6620  handleNoHeadingsFound() {
6621    const noHeadingsText = __('No headings were found on this page.', 'elementor-pro');
6622
6623    return this.elements.$tocBody.html(noHeadingsText);
6624  }
6625
6626  collapseBodyListener() {
6627    const activeBreakpoints = elementorFrontend.breakpoints.getActiveBreakpointsList({
6628      withDesktop: true
6629    });
6630    const minimizedOn = this.getElementSettings('minimized_on'),
6631          currentDeviceMode = elementorFrontend.getCurrentDeviceMode(),
6632          isCollapsed = this.$element.hasClass(this.getSettings('classes.collapsed')); // If minimizedOn value is set to desktop, it applies for widescreen as well.
6633
6634    if ('desktop' === minimizedOn || activeBreakpoints.indexOf(minimizedOn) >= activeBreakpoints.indexOf(currentDeviceMode)) {
6635      if (!isCollapsed) {
6636        this.collapseBox();
6637      }
6638    } else if (isCollapsed) {
6639      this.expandBox();
6640    }
6641  }
6642
6643  onElementChange(settings) {
6644    if ('minimized_on' === settings) {
6645      this.collapseBodyListener();
6646    }
6647  }
6648
6649  getHeadingAnchorLink(index, classes) {
6650    const headingID = this.elements.$headings[index].id,
6651          wrapperID = this.elements.$headings[index].closest('.elementor-widget').id;
6652    let anchorLink = '';
6653
6654    if (headingID) {
6655      anchorLink = headingID;
6656    } else if (wrapperID) {
6657      // If the heading itself has an ID, we don't want to overwrite it
6658      anchorLink = wrapperID;
6659    } // If there is no existing ID, use the heading text to create a semantic ID
6660
6661
6662    if (headingID || wrapperID) {
6663      jQuery(this.elements.$headings[index]).data('hasOwnID', true);
6664    } else {
6665      anchorLink = `${classes.headingAnchor}-${index}`;
6666    }
6667
6668    return anchorLink;
6669  }
6670
6671  setHeadingsData() {
6672    this.headingsData = [];
6673    const classes = this.getSettings('classes'); // Create an array for simplifying TOC list creation
6674
6675    this.elements.$headings.each((index, element) => {
6676      const anchorLink = this.getHeadingAnchorLink(index, classes);
6677      this.headingsData.push({
6678        tag: +element.nodeName.slice(1),
6679        text: element.textContent,
6680        anchorLink
6681      });
6682    });
6683  }
6684
6685  run() {
6686    this.elements.$headings = this.getHeadings();
6687
6688    if (!this.elements.$headings.length) {
6689      return this.handleNoHeadingsFound();
6690    }
6691
6692    this.setHeadingsData();
6693
6694    if (!elementorFrontend.isEditMode()) {
6695      this.addAnchorsBeforeHeadings();
6696    }
6697
6698    this.populateTOC();
6699
6700    if (this.getElementSettings('minimize_box')) {
6701      this.collapseBodyListener();
6702    }
6703  }
6704
6705  expandBox() {
6706    const boxHeight = this.getCurrentDeviceSetting('min_height');
6707    this.$element.removeClass(this.getSettings('classes.collapsed'));
6708    this.elements.$tocBody.slideDown(); // return container to the full height in case a min-height is defined by the user
6709
6710    this.elements.$widgetContainer.css('min-height', boxHeight.size + boxHeight.unit);
6711  }
6712
6713  collapseBox() {
6714    this.$element.addClass(this.getSettings('classes.collapsed'));
6715    this.elements.$tocBody.slideUp(); // close container in case a min-height is defined by the user
6716
6717    this.elements.$widgetContainer.css('min-height', '0px');
6718  }
6719
6720  onInit() {
6721    super.onInit(...arguments);
6722    this.viewportItems = [];
6723    jQuery(() => this.run());
6724  }
6725
6726  onListItemClick(event) {
6727    this.itemClicked = true;
6728    setTimeout(() => this.itemClicked = false, 2000);
6729    const $clickedItem = jQuery(event.target),
6730          $list = $clickedItem.parent().next(),
6731          collapseNestedList = this.getElementSettings('collapse_subitems');
6732    let listIsActive;
6733
6734    if (collapseNestedList && $clickedItem.hasClass(this.getSettings('classes.firstLevelListItem'))) {
6735      if ($list.is(':visible')) {
6736        listIsActive = true;
6737      }
6738    }
6739
6740    this.activateItem($clickedItem);
6741
6742    if (collapseNestedList && listIsActive) {
6743      $list.slideUp();
6744    }
6745  }
6746
6747}
6748
6749exports["default"] = TOCHandler;
6750
6751/***/ }),
6752
6753/***/ "../modules/theme-builder/assets/js/frontend/frontend-legacy.js":
6754/*!**********************************************************************!*\
6755  !*** ../modules/theme-builder/assets/js/frontend/frontend-legacy.js ***!
6756  \**********************************************************************/
6757/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6758
6759
6760
6761var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
6762
6763Object.defineProperty(exports, "__esModule", ({
6764  value: true
6765}));
6766exports["default"] = void 0;
6767
6768var _archivePostsSkinClassic = _interopRequireDefault(__webpack_require__(/*! ./handlers/archive-posts-skin-classic */ "../modules/theme-builder/assets/js/frontend/handlers/archive-posts-skin-classic.js"));
6769
6770var _archivePostsSkinCards = _interopRequireDefault(__webpack_require__(/*! ./handlers/archive-posts-skin-cards */ "../modules/theme-builder/assets/js/frontend/handlers/archive-posts-skin-cards.js"));
6771
6772var _archivePostsLoadMore = _interopRequireDefault(__webpack_require__(/*! ./handlers/archive-posts-load-more */ "../modules/theme-builder/assets/js/frontend/handlers/archive-posts-load-more.js"));
6773
6774class _default extends elementorModules.Module {
6775  constructor() {
6776    super();
6777    ['archive_classic', 'archive_full_content', 'archive_cards'].forEach(skinName => {
6778      elementorFrontend.elementsHandler.attachHandler('archive-posts', _archivePostsLoadMore.default, skinName);
6779    });
6780    elementorFrontend.elementsHandler.attachHandler('archive-posts', _archivePostsSkinClassic.default, 'archive_classic');
6781    elementorFrontend.elementsHandler.attachHandler('archive-posts', _archivePostsSkinClassic.default, 'archive_full_content');
6782    elementorFrontend.elementsHandler.attachHandler('archive-posts', _archivePostsSkinCards.default, 'archive_cards');
6783    jQuery(function () {
6784      // Go to elementor element - if the URL is something like http://domain.com/any-page?preview=true&theme_template_id=6479
6785      var match = location.search.match(/theme_template_id=(\d*)/),
6786          $element = match ? jQuery('.elementor-' + match[1]) : [];
6787
6788      if ($element.length) {
6789        jQuery('html, body').animate({
6790          scrollTop: $element.offset().top - window.innerHeight / 2
6791        });
6792      }
6793    });
6794  }
6795
6796}
6797
6798exports["default"] = _default;
6799
6800/***/ }),
6801
6802/***/ "../modules/theme-builder/assets/js/frontend/handlers/archive-posts-load-more.js":
6803/*!***************************************************************************************!*\
6804  !*** ../modules/theme-builder/assets/js/frontend/handlers/archive-posts-load-more.js ***!
6805  \***************************************************************************************/
6806/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6807
6808
6809
6810var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
6811
6812Object.defineProperty(exports, "__esModule", ({
6813  value: true
6814}));
6815exports["default"] = void 0;
6816
6817var _loadMore = _interopRequireDefault(__webpack_require__(/*! ../../../../../posts/assets/js/frontend/handlers/load-more */ "../modules/posts/assets/js/frontend/handlers/load-more.js"));
6818
6819class ArchivePostsLoadMore extends _loadMore.default {}
6820
6821exports["default"] = ArchivePostsLoadMore;
6822
6823/***/ }),
6824
6825/***/ "../modules/theme-builder/assets/js/frontend/handlers/archive-posts-skin-cards.js":
6826/*!****************************************************************************************!*\
6827  !*** ../modules/theme-builder/assets/js/frontend/handlers/archive-posts-skin-cards.js ***!
6828  \****************************************************************************************/
6829/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6830
6831
6832
6833var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
6834
6835Object.defineProperty(exports, "__esModule", ({
6836  value: true
6837}));
6838exports["default"] = void 0;
6839
6840var _cards = _interopRequireDefault(__webpack_require__(/*! ../../../../../posts/assets/js/frontend/handlers/cards */ "../modules/posts/assets/js/frontend/handlers/cards.js"));
6841
6842var _default = _cards.default.extend({
6843  getSkinPrefix() {
6844    return 'archive_cards_';
6845  }
6846
6847});
6848
6849exports["default"] = _default;
6850
6851/***/ }),
6852
6853/***/ "../modules/theme-builder/assets/js/frontend/handlers/archive-posts-skin-classic.js":
6854/*!******************************************************************************************!*\
6855  !*** ../modules/theme-builder/assets/js/frontend/handlers/archive-posts-skin-classic.js ***!
6856  \******************************************************************************************/
6857/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6858
6859
6860
6861var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
6862
6863Object.defineProperty(exports, "__esModule", ({
6864  value: true
6865}));
6866exports["default"] = void 0;
6867
6868var _posts = _interopRequireDefault(__webpack_require__(/*! ../../../../../posts/assets/js/frontend/handlers/posts */ "../modules/posts/assets/js/frontend/handlers/posts.js"));
6869
6870var _default = _posts.default.extend({
6871  getSkinPrefix() {
6872    return 'archive_classic_';
6873  }
6874
6875});
6876
6877exports["default"] = _default;
6878
6879/***/ }),
6880
6881/***/ "../modules/theme-elements/assets/js/frontend/frontend-legacy.js":
6882/*!***********************************************************************!*\
6883  !*** ../modules/theme-elements/assets/js/frontend/frontend-legacy.js ***!
6884  \***********************************************************************/
6885/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6886
6887
6888
6889var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
6890
6891Object.defineProperty(exports, "__esModule", ({
6892  value: true
6893}));
6894exports["default"] = void 0;
6895
6896var _searchForm = _interopRequireDefault(__webpack_require__(/*! ./handlers/search-form */ "../modules/theme-elements/assets/js/frontend/handlers/search-form.js"));
6897
6898class _default extends elementorModules.Module {
6899  constructor() {
6900    super();
6901    elementorFrontend.elementsHandler.attachHandler('search-form', _searchForm.default);
6902  }
6903
6904}
6905
6906exports["default"] = _default;
6907
6908/***/ }),
6909
6910/***/ "../modules/theme-elements/assets/js/frontend/handlers/search-form.js":
6911/*!****************************************************************************!*\
6912  !*** ../modules/theme-elements/assets/js/frontend/handlers/search-form.js ***!
6913  \****************************************************************************/
6914/***/ ((__unused_webpack_module, exports) => {
6915
6916
6917
6918Object.defineProperty(exports, "__esModule", ({
6919  value: true
6920}));
6921exports["default"] = void 0;
6922
6923var _default = elementorModules.frontend.handlers.Base.extend({
6924  getDefaultSettings() {
6925    return {
6926      selectors: {
6927        wrapper: '.elementor-search-form',
6928        container: '.elementor-search-form__container',
6929        icon: '.elementor-search-form__icon',
6930        input: '.elementor-search-form__input',
6931        toggle: '.elementor-search-form__toggle',
6932        submit: '.elementor-search-form__submit',
6933        closeButton: '.dialog-close-button'
6934      },
6935      classes: {
6936        isFocus: 'elementor-search-form--focus',
6937        isFullScreen: 'elementor-search-form--full-screen',
6938        lightbox: 'elementor-lightbox'
6939      }
6940    };
6941  },
6942
6943  getDefaultElements() {
6944    var selectors = this.getSettings('selectors'),
6945        elements = {};
6946    elements.$wrapper = this.$element.find(selectors.wrapper);
6947    elements.$container = this.$element.find(selectors.container);
6948    elements.$input = this.$element.find(selectors.input);
6949    elements.$icon = this.$element.find(selectors.icon);
6950    elements.$toggle = this.$element.find(selectors.toggle);
6951    elements.$submit = this.$element.find(selectors.submit);
6952    elements.$closeButton = this.$element.find(selectors.closeButton);
6953    return elements;
6954  },
6955
6956  bindEvents() {
6957    var self = this,
6958        $container = self.elements.$container,
6959        $closeButton = self.elements.$closeButton,
6960        $input = self.elements.$input,
6961        $wrapper = self.elements.$wrapper,
6962        $icon = self.elements.$icon,
6963        skin = this.getElementSettings('skin'),
6964        classes = this.getSettings('classes');
6965
6966    if ('full_screen' === skin) {
6967      // Activate full-screen mode on click
6968      self.elements.$toggle.on('click', function () {
6969        $container.toggleClass(classes.isFullScreen).toggleClass(classes.lightbox);
6970        $input.trigger('focus');
6971      }); // Deactivate full-screen mode on click or on esc.
6972
6973      $container.on('click', function (event) {
6974        if ($container.hasClass(classes.isFullScreen) && $container[0] === event.target) {
6975          $container.removeClass(classes.isFullScreen).removeClass(classes.lightbox);
6976        }
6977      });
6978      $closeButton.on('click', function () {
6979        $container.removeClass(classes.isFullScreen).removeClass(classes.lightbox);
6980      });
6981      elementorFrontend.elements.$document.on('keyup', function (event) {
6982        var ESC_KEY = 27;
6983
6984        if (ESC_KEY === event.keyCode) {
6985          if ($container.hasClass(classes.isFullScreen)) {
6986            $container.trigger('click');
6987          }
6988        }
6989      });
6990    } else {
6991      // Apply focus style on wrapper element when input is focused
6992      $input.on({
6993        focus() {
6994          $wrapper.addClass(classes.isFocus);
6995        },
6996
6997        blur() {
6998          $wrapper.removeClass(classes.isFocus);
6999        }
7000
7001      });
7002    }
7003
7004    if ('minimal' === skin) {
7005      // Apply focus style on wrapper element when icon is clicked in minimal skin
7006      $icon.on('click', function () {
7007        $wrapper.addClass(classes.isFocus);
7008        $input.trigger('focus');
7009      });
7010    }
7011  }
7012
7013});
7014
7015exports["default"] = _default;
7016
7017/***/ }),
7018
7019/***/ "../modules/woocommerce/assets/js/frontend/frontend-legacy.js":
7020/*!********************************************************************!*\
7021  !*** ../modules/woocommerce/assets/js/frontend/frontend-legacy.js ***!
7022  \********************************************************************/
7023/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7024
7025
7026
7027var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
7028
7029Object.defineProperty(exports, "__esModule", ({
7030  value: true
7031}));
7032exports["default"] = void 0;
7033
7034var _menuCart = _interopRequireDefault(__webpack_require__(/*! ./handlers/menu-cart */ "../modules/woocommerce/assets/js/frontend/handlers/menu-cart.js"));
7035
7036var _purchaseSummary = _interopRequireDefault(__webpack_require__(/*! ./handlers/purchase-summary */ "../modules/woocommerce/assets/js/frontend/handlers/purchase-summary.js"));
7037
7038var _checkoutPage = _interopRequireDefault(__webpack_require__(/*! ./handlers/checkout-page */ "../modules/woocommerce/assets/js/frontend/handlers/checkout-page.js"));
7039
7040var _cart = _interopRequireDefault(__webpack_require__(/*! ./handlers/cart */ "../modules/woocommerce/assets/js/frontend/handlers/cart.js"));
7041
7042var _myAccount = _interopRequireDefault(__webpack_require__(/*! ./handlers/my-account */ "../modules/woocommerce/assets/js/frontend/handlers/my-account.js"));
7043
7044var _notices = _interopRequireDefault(__webpack_require__(/*! ./handlers/notices */ "../modules/woocommerce/assets/js/frontend/handlers/notices.js"));
7045
7046class _default extends elementorModules.Module {
7047  constructor() {
7048    super();
7049    elementorFrontend.elementsHandler.attachHandler('woocommerce-menu-cart', _menuCart.default);
7050    elementorFrontend.elementsHandler.attachHandler('woocommerce-purchase-summary', _purchaseSummary.default);
7051    elementorFrontend.elementsHandler.attachHandler('woocommerce-checkout-page', _checkoutPage.default);
7052    elementorFrontend.elementsHandler.attachHandler('woocommerce-cart', _cart.default);
7053    elementorFrontend.elementsHandler.attachHandler('woocommerce-my-account', _myAccount.default);
7054    elementorFrontend.elementsHandler.attachHandler('woocommerce-notices', _notices.default);
7055    /**
7056     * `wc-cart` script is enqueued in the Editor by the widget `get_script_depends()`. As a result WooCommerce
7057     * triggers its cart related event callbacks. One of the callbacks requires `.woocommerce-cart-form` to be in
7058     * the page and reloads the Preview if it's not there. To get around this we add our own empty
7059     * `.woocommerce-cart-form` to the page to stop the page reloading.
7060     */
7061
7062    if (elementorFrontend.isEditMode()) {
7063      elementorFrontend.on('components:init', () => {
7064        if (!elementorFrontend.elements.$body.find('.elementor-widget-woocommerce-cart').length) {
7065          elementorFrontend.elements.$body.append('<div class="woocommerce-cart-form">');
7066        }
7067      });
7068    }
7069  }
7070
7071}
7072
7073exports["default"] = _default;
7074
7075/***/ }),
7076
7077/***/ "../modules/woocommerce/assets/js/frontend/handlers/base.js":
7078/*!******************************************************************!*\
7079  !*** ../modules/woocommerce/assets/js/frontend/handlers/base.js ***!
7080  \******************************************************************/
7081/***/ ((__unused_webpack_module, exports) => {
7082
7083
7084
7085Object.defineProperty(exports, "__esModule", ({
7086  value: true
7087}));
7088exports["default"] = void 0;
7089
7090class Base extends elementorModules.frontend.handlers.Base {
7091  getDefaultSettings() {
7092    return {
7093      selectors: {
7094        stickyRightColumn: '.e-sticky-right-column'
7095      },
7096      classes: {
7097        stickyRightColumnActive: 'e-sticky-right-column--active'
7098      }
7099    };
7100  }
7101
7102  getDefaultElements() {
7103    const selectors = this.getSettings('selectors');
7104    return {
7105      $stickyRightColumn: this.$element.find(selectors.stickyRightColumn)
7106    };
7107  }
7108
7109  bindEvents() {
7110    // Add our wrapper class around the select2 whenever it is opened.
7111    elementorFrontend.elements.$document.on('select2:open', event => {
7112      this.addSelect2Wrapper(event);
7113    });
7114  }
7115
7116  addSelect2Wrapper(event) {
7117    // The select element is recaptured every time because the markup can refresh
7118    const selectElement = jQuery(event.target).data('select2');
7119
7120    if (selectElement.$dropdown) {
7121      selectElement.$dropdown.addClass('e-woo-select2-wrapper');
7122    }
7123  }
7124
7125  isStickyRightColumnActive() {
7126    const classes = this.getSettings('classes');
7127    return this.elements.$stickyRightColumn.hasClass(classes.stickyRightColumnActive);
7128  }
7129
7130  activateStickyRightColumn() {
7131    const elementSettings = this.getElementSettings(),
7132          $wpAdminBar = elementorFrontend.elements.$wpAdminBar,
7133          classes = this.getSettings('classes');
7134    let stickyOptionsOffset = elementSettings.sticky_right_column_offset || 0;
7135
7136    if ($wpAdminBar.length && 'fixed' === $wpAdminBar.css('position')) {
7137      stickyOptionsOffset += $wpAdminBar.height();
7138    }
7139
7140    if ('yes' === this.getElementSettings('sticky_right_column')) {
7141      this.elements.$stickyRightColumn.addClass(classes.stickyRightColumnActive);
7142      this.elements.$stickyRightColumn.css('top', stickyOptionsOffset + 'px');
7143    }
7144  }
7145
7146  deactivateStickyRightColumn() {
7147    if (!this.isStickyRightColumnActive()) {
7148      return;
7149    }
7150
7151    const classes = this.getSettings('classes');
7152    this.elements.$stickyRightColumn.removeClass(classes.stickyRightColumnActive);
7153  }
7154  /**
7155   * Activates the sticky column
7156   *
7157   * @return {void}
7158   */
7159
7160
7161  toggleStickyRightColumn() {
7162    if (!this.getElementSettings('sticky_right_column')) {
7163      this.deactivateStickyRightColumn();
7164      return;
7165    }
7166
7167    if (!this.isStickyRightColumnActive()) {
7168      this.activateStickyRightColumn();
7169    }
7170  }
7171
7172  equalizeElementHeight($element) {
7173    if ($element.length) {
7174      $element.removeAttr('style'); // first remove the custom height we added so that the new height can be re-calculated according to the content
7175
7176      let maxHeight = 0;
7177      $element.each((index, element) => {
7178        maxHeight = Math.max(maxHeight, element.offsetHeight);
7179      });
7180
7181      if (0 < maxHeight) {
7182        $element.css({
7183          height: maxHeight + 'px'
7184        });
7185      }
7186    }
7187  }
7188  /**
7189   * WooCommerce prints the Purchase Note separated from the product name by a border and padding.
7190   * In Elementor's Order Summary design, the product name and purchase note are displayed un-separated.
7191   * To achieve this design, it is necessary to access the Product Name line before the Purchase Note line to adjust
7192   * its padding. Since this cannot be achieved in CSS, it is done in this method.
7193   *
7194   * @param {Object} $element
7195   *
7196   * @return {void}
7197   */
7198
7199
7200  removePaddingBetweenPurchaseNote($element) {
7201    if ($element) {
7202      $element.each((index, element) => {
7203        jQuery(element).prev().children('td').addClass('product-purchase-note-is-below');
7204      });
7205    }
7206  }
7207  /**
7208   * `elementorPageId` and `elementorWidgetId` are added to the url in the `_wp_http_referer` input which is then
7209   * received when WooCommerce does its cart and checkout ajax requests e.g `update_order_review` and `update_cart`.
7210   * These query strings are extracted from the url and used in our `load_widget_before_wc_ajax` method.
7211   */
7212
7213
7214  updateWpReferers() {
7215    const selectors = this.getSettings('selectors'),
7216          wpHttpRefererInputs = this.$element.find(selectors.wpHttpRefererInputs),
7217          url = new URL(document.location);
7218    url.searchParams.set('elementorPageId', elementorFrontend.config.post.id);
7219    url.searchParams.set('elementorWidgetId', this.getID());
7220    wpHttpRefererInputs.attr('value', url);
7221  }
7222
7223}
7224
7225exports["default"] = Base;
7226
7227/***/ }),
7228
7229/***/ "../modules/woocommerce/assets/js/frontend/handlers/cart.js":
7230/*!******************************************************************!*\
7231  !*** ../modules/woocommerce/assets/js/frontend/handlers/cart.js ***!
7232  \******************************************************************/
7233/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7234
7235
7236
7237var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
7238
7239Object.defineProperty(exports, "__esModule", ({
7240  value: true
7241}));
7242exports["default"] = void 0;
7243
7244var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/woocommerce/assets/js/frontend/handlers/base.js"));
7245
7246class Cart extends _base.default {
7247  getDefaultSettings() {
7248    const defaultSettings = super.getDefaultSettings(...arguments);
7249    return {
7250      selectors: { ...defaultSettings.selectors,
7251        shippingForm: '.shipping-calculator-form',
7252        quantityInput: '.qty',
7253        updateCartButton: 'button[name=update_cart]',
7254        wpHttpRefererInputs: '[name=_wp_http_referer]',
7255        hiddenInput: 'input[type=hidden]',
7256        productRemove: '.product-remove a'
7257      },
7258      classes: defaultSettings.classes,
7259      ajaxUrl: elementorProFrontend.config.ajaxurl
7260    };
7261  }
7262
7263  getDefaultElements() {
7264    const selectors = this.getSettings('selectors');
7265    return { ...super.getDefaultElements(...arguments),
7266      $shippingForm: this.$element.find(selectors.shippingForm),
7267      $stickyColumn: this.$element.find(selectors.stickyColumn),
7268      $hiddenInput: this.$element.find(selectors.hiddenInput)
7269    };
7270  }
7271
7272  bindEvents() {
7273    super.bindEvents();
7274    const selectors = this.getSettings('selectors');
7275    elementorFrontend.elements.$body.on('wc_fragments_refreshed', () => this.applyButtonsHoverAnimation());
7276
7277    if ('yes' === this.getElementSettings('update_cart_automatically')) {
7278      this.$element.on('input', selectors.quantityInput, () => this.updateCart());
7279    }
7280
7281    elementorFrontend.elements.$body.on('wc_fragments_loaded wc_fragments_refreshed', () => {
7282      this.updateWpReferers();
7283
7284      if (elementorFrontend.isEditMode() || elementorFrontend.isWPPreviewMode()) {
7285        this.disableActions();
7286      }
7287    });
7288    elementorFrontend.elements.$body.on('added_to_cart', function (e, data) {
7289      // We do not want the page to reload in the Editor after we triggered the 'added_to_cart' event.
7290      if (data.e_manually_triggered) {
7291        return false;
7292      }
7293    });
7294  }
7295
7296  onInit() {
7297    super.onInit(...arguments);
7298    this.toggleStickyRightColumn();
7299    this.hideHiddenInputsParentElements();
7300
7301    if (elementorFrontend.isEditMode()) {
7302      this.elements.$shippingForm.show();
7303    }
7304
7305    this.applyButtonsHoverAnimation();
7306    this.updateWpReferers();
7307
7308    if (elementorFrontend.isEditMode() || elementorFrontend.isWPPreviewMode()) {
7309      this.disableActions();
7310    }
7311  }
7312  /**
7313   * Using the WooCommerce Cart controls (quantity, remove product) in the editor will cause the cart to disappear.
7314   * This is because WooCommerce does an ajax round trip where it modifies the cart, then loads that cart into the
7315   * current page and attempts to grab the elements from that page via ajax. In the Editor, if the page is not
7316   * published yet, it fetches an empty page that does not contain the required elements. As a result, the cart
7317   * is rendered empty.
7318   *
7319   * Due to this issue, the cart controls (quantity, remove product) need to be disabled in the Editor.
7320   */
7321
7322
7323  disableActions() {
7324    const selectors = this.getSettings('selectors');
7325    this.$element.find(selectors.updateCartButton).attr({
7326      disabled: 'disabled',
7327      'aria-disabled': 'true'
7328    });
7329
7330    if (elementorFrontend.isEditMode()) {
7331      this.$element.find(selectors.quantityInput).attr('disabled', 'disabled');
7332      this.$element.find(selectors.productRemove).css('pointer-events', 'none');
7333    }
7334  }
7335
7336  onElementChange(propertyName) {
7337    if ('sticky_right_column' === propertyName) {
7338      this.toggleStickyRightColumn();
7339    }
7340
7341    if ('additional_template_select' === propertyName) {
7342      elementorPro.modules.woocommerce.onTemplateIdChange('additional_template_select');
7343    }
7344  }
7345
7346  onDestroy() {
7347    super.onDestroy(...arguments);
7348    this.deactivateStickyRightColumn();
7349  }
7350
7351  updateCart() {
7352    const selectors = this.getSettings('selectors');
7353    clearTimeout(this._debounce);
7354    this._debounce = setTimeout(() => {
7355      this.$element.find(selectors.updateCartButton).trigger('click');
7356    }, 1500);
7357  }
7358
7359  applyButtonsHoverAnimation() {
7360    const elementSettings = this.getElementSettings();
7361
7362    if (elementSettings.checkout_button_hover_animation) {
7363      // This element is recaptured every time because the cart markup can refresh
7364      jQuery('.checkout-button').addClass('elementor-animation-' + elementSettings.checkout_button_hover_animation);
7365    }
7366
7367    if (elementSettings.forms_buttons_hover_animation) {
7368      // This element is recaptured every time because the cart markup can refresh
7369      jQuery('.shop_table .button').addClass('elementor-animation-' + elementSettings.forms_buttons_hover_animation);
7370    }
7371  }
7372  /**
7373   * In the editor, WC Frontend JS does not fire (not registered).
7374   * This causes that hidden inputs parent paragraph elements do not get display:none
7375   * as they would have on the front end.
7376   * So this function manually display:none the parent elements of these hidden inputs to avoid having
7377   * gaps/spaces in the layout caused by these parent elements' margins/paddings.
7378   */
7379
7380
7381  hideHiddenInputsParentElements() {
7382    if (this.isEdit) {
7383      if (this.elements.$hiddenInput) {
7384        this.elements.$hiddenInput.parent('.form-row').addClass('elementor-hidden');
7385      }
7386    }
7387  }
7388
7389}
7390
7391exports["default"] = Cart;
7392
7393/***/ }),
7394
7395/***/ "../modules/woocommerce/assets/js/frontend/handlers/checkout-page.js":
7396/*!***************************************************************************!*\
7397  !*** ../modules/woocommerce/assets/js/frontend/handlers/checkout-page.js ***!
7398  \***************************************************************************/
7399/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7400
7401
7402
7403var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
7404
7405Object.defineProperty(exports, "__esModule", ({
7406  value: true
7407}));
7408exports["default"] = void 0;
7409
7410var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/woocommerce/assets/js/frontend/handlers/base.js"));
7411
7412class Checkout extends _base.default {
7413  getDefaultSettings() {
7414    const defaultSettings = super.getDefaultSettings(...arguments);
7415    return {
7416      selectors: { ...defaultSettings.selectors,
7417        container: '.elementor-widget-woocommerce-checkout-page',
7418        loginForm: '.e-woocommerce-login-anchor',
7419        loginSubmit: '.e-woocommerce-form-login-submit',
7420        loginSection: '.e-woocommerce-login-section',
7421        showCouponForm: '.e-show-coupon-form',
7422        couponSection: '.e-coupon-anchor',
7423        showLoginForm: '.e-show-login',
7424        applyCoupon: '.e-apply-coupon',
7425        checkoutForm: 'form.woocommerce-checkout',
7426        couponBox: '.e-coupon-box',
7427        address: 'address',
7428        wpHttpRefererInputs: '[name="_wp_http_referer"]'
7429      },
7430      classes: defaultSettings.classes,
7431      ajaxUrl: elementorProFrontend.config.ajaxurl
7432    };
7433  }
7434
7435  getDefaultElements() {
7436    const selectors = this.getSettings('selectors');
7437    return { ...super.getDefaultElements(...arguments),
7438      $container: this.$element.find(selectors.container),
7439      $loginForm: this.$element.find(selectors.loginForm),
7440      $showCouponForm: this.$element.find(selectors.showCouponForm),
7441      $couponSection: this.$element.find(selectors.couponSection),
7442      $showLoginForm: this.$element.find(selectors.showLoginForm),
7443      $applyCoupon: this.$element.find(selectors.applyCoupon),
7444      $loginSubmit: this.$element.find(selectors.loginSubmit),
7445      $couponBox: this.$element.find(selectors.couponBox),
7446      $checkoutForm: this.$element.find(selectors.checkoutForm),
7447      $loginSection: this.$element.find(selectors.loginSection),
7448      $address: this.$element.find(selectors.address)
7449    };
7450  }
7451
7452  bindEvents() {
7453    super.bindEvents(...arguments);
7454    this.elements.$showCouponForm.on('click', event => {
7455      event.preventDefault();
7456      this.elements.$couponSection.slideToggle();
7457    });
7458    this.elements.$showLoginForm.on('click', event => {
7459      event.preventDefault();
7460      this.elements.$loginForm.slideToggle();
7461    });
7462    this.elements.$applyCoupon.on('click', event => {
7463      event.preventDefault();
7464      this.applyCoupon();
7465    });
7466    this.elements.$loginSubmit.on('click', event => {
7467      event.preventDefault();
7468      this.loginUser();
7469    });
7470    elementorFrontend.elements.$body.on('updated_checkout', () => {
7471      this.applyPurchaseButtonHoverAnimation();
7472      this.updateWpReferers();
7473    });
7474  }
7475
7476  onInit() {
7477    super.onInit(...arguments);
7478    this.toggleStickyRightColumn();
7479    this.updateWpReferers();
7480    this.equalizeElementHeight(this.elements.$address); // equalize <address> boxes height
7481
7482    if (elementorFrontend.isEditMode()) {
7483      this.elements.$loginForm.show();
7484      this.elements.$couponSection.show();
7485      this.applyPurchaseButtonHoverAnimation();
7486    }
7487  }
7488
7489  onElementChange(propertyName) {
7490    if ('sticky_right_column' === propertyName) {
7491      this.toggleStickyRightColumn();
7492    }
7493  }
7494
7495  onDestroy() {
7496    super.onDestroy(...arguments);
7497    this.deactivateStickyRightColumn();
7498  }
7499
7500  applyPurchaseButtonHoverAnimation() {
7501    const purchaseButtonHoverAnimation = this.getElementSettings('purchase_button_hover_animation');
7502
7503    if (purchaseButtonHoverAnimation) {
7504      // This element is recaptured every time because the checkout markup can refresh
7505      jQuery('#place_order').addClass('elementor-animation-' + purchaseButtonHoverAnimation);
7506    }
7507  }
7508
7509  applyCoupon() {
7510    // wc_checkout_params is required to continue, ensure the object exists
7511    // eslint-disable-next-line camelcase
7512    if (!wc_checkout_params) {
7513      return;
7514    }
7515
7516    this.startProcessing(this.elements.$couponBox);
7517    const data = {
7518      // eslint-disable-next-line camelcase
7519      security: wc_checkout_params.apply_coupon_nonce,
7520      coupon_code: this.elements.$couponBox.find('input[name="coupon_code"]').val()
7521    };
7522    jQuery.ajax({
7523      type: 'POST',
7524      // eslint-disable-next-line camelcase
7525      url: wc_checkout_params.wc_ajax_url.toString().replace('%%endpoint%%', 'apply_coupon'),
7526      context: this,
7527      data,
7528
7529      success(code) {
7530        jQuery('.woocommerce-error, .woocommerce-message').remove();
7531        this.elements.$couponBox.removeClass('processing').unblock();
7532
7533        if (code) {
7534          this.elements.$checkoutForm.before(code);
7535          this.elements.$couponSection.slideUp();
7536          elementorFrontend.elements.$body.trigger('applied_coupon_in_checkout', [data.coupon_code]);
7537          elementorFrontend.elements.$body.trigger('update_checkout', {
7538            update_shipping_method: false
7539          });
7540        }
7541      },
7542
7543      dataType: 'html'
7544    });
7545  }
7546
7547  loginUser() {
7548    this.startProcessing(this.elements.$loginSection);
7549    const data = {
7550      action: 'elementor_woocommerce_checkout_login_user',
7551      username: this.elements.$loginSection.find('input[name="username"]').val(),
7552      password: this.elements.$loginSection.find('input[name="password"]').val(),
7553      nonce: this.elements.$loginSection.find('input[name="woocommerce-login-nonce"]').val(),
7554      remember: this.elements.$loginSection.find('input#rememberme').prop('checked')
7555    };
7556    jQuery.ajax({
7557      type: 'POST',
7558      url: this.getSettings('ajaxUrl'),
7559      context: this,
7560      data,
7561
7562      success(code) {
7563        code = JSON.parse(code);
7564        this.elements.$loginSection.removeClass('processing').unblock();
7565        const messages = jQuery('.woocommerce-error, .woocommerce-message');
7566        messages.remove();
7567
7568        if (code.logged_in) {
7569          location.reload();
7570        } else {
7571          this.elements.$checkoutForm.before(code.message);
7572          elementorFrontend.elements.$body.trigger('checkout_error', [code.message]);
7573        }
7574      }
7575
7576    });
7577  }
7578
7579  startProcessing($form) {
7580    if ($form.is('.processing')) {
7581      return;
7582    }
7583    /**
7584     * .block() is from a jQuery blockUI plugin loaded by WooCommerce. This code is based on WooCommerce
7585     * core in order for the Checkout widget to behave the same as WooCommerce Checkout pages.
7586     */
7587
7588
7589    $form.addClass('processing').block({
7590      message: null,
7591      overlayCSS: {
7592        background: '#fff',
7593        opacity: 0.6
7594      }
7595    });
7596  }
7597
7598}
7599
7600exports["default"] = Checkout;
7601
7602/***/ }),
7603
7604/***/ "../modules/woocommerce/assets/js/frontend/handlers/menu-cart.js":
7605/*!***********************************************************************!*\
7606  !*** ../modules/woocommerce/assets/js/frontend/handlers/menu-cart.js ***!
7607  \***********************************************************************/
7608/***/ ((__unused_webpack_module, exports) => {
7609
7610
7611
7612Object.defineProperty(exports, "__esModule", ({
7613  value: true
7614}));
7615exports["default"] = void 0;
7616
7617class _default extends elementorModules.frontend.handlers.Base {
7618  getDefaultSettings() {
7619    return {
7620      selectors: {
7621        container: '.elementor-menu-cart__container',
7622        main: '.elementor-menu-cart__main',
7623        toggle: '.elementor-menu-cart__toggle',
7624        toggleButton: '#elementor-menu-cart__toggle_button',
7625        toggleWrapper: '.elementor-menu-cart__toggle_wrapper',
7626        closeButton: '.elementor-menu-cart__close-button',
7627        productList: '.elementor-menu-cart__products'
7628      },
7629      classes: {
7630        isShown: 'elementor-menu-cart--shown'
7631      }
7632    };
7633  }
7634
7635  getDefaultElements() {
7636    const selectors = this.getSettings('selectors');
7637    return {
7638      $container: this.$element.find(selectors.container),
7639      $main: this.$element.find(selectors.main),
7640      $toggleWrapper: this.$element.find(selectors.toggleWrapper),
7641      $closeButton: this.$element.find(selectors.closeButton)
7642    };
7643  }
7644
7645  toggleCart() {
7646    if (!this.isCartOpen) {
7647      this.showCart();
7648    } else {
7649      this.hideCart();
7650    }
7651  }
7652
7653  showCart() {
7654    if (this.isCartOpen) {
7655      return;
7656    }
7657
7658    const classes = this.getSettings('classes'),
7659          selectors = this.getSettings('selectors');
7660    this.isCartOpen = true;
7661    this.$element.addClass(classes.isShown);
7662    this.$element.find(selectors.toggleButton).attr('aria-expanded', true);
7663    this.elements.$main.attr('aria-hidden', false);
7664    this.elements.$container.attr('aria-hidden', false);
7665  }
7666
7667  hideCart() {
7668    if (!this.isCartOpen) {
7669      return;
7670    }
7671
7672    const classes = this.getSettings('classes'),
7673          selectors = this.getSettings('selectors');
7674    this.isCartOpen = false;
7675    this.$element.removeClass(classes.isShown);
7676    this.$element.find(selectors.toggleButton).attr('aria-expanded', false);
7677    this.elements.$main.attr('aria-hidden', true);
7678    this.elements.$container.attr('aria-hidden', true);
7679  }
7680
7681  automaticallyOpenCart() {
7682    const settings = this.getElementSettings();
7683
7684    if ('yes' === settings.automatically_open_cart) {
7685      this.showCart();
7686    }
7687  }
7688
7689  refreshFragments(eventType) {
7690    let data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
7691
7692    if (elementorFrontend.isEditMode() && elementorPro.modules.woocommerce.didManuallyTriggerAddToCartEvent(data)) {
7693      return false;
7694    }
7695
7696    const templatesInPage = [];
7697    jQuery.each(elementorFrontend.documentsManager.documents, index => {
7698      templatesInPage.push(index);
7699    });
7700    jQuery.ajax({
7701      type: 'POST',
7702      url: elementorProFrontend.config.ajaxurl,
7703      context: this,
7704      data: {
7705        action: 'elementor_menu_cart_fragments',
7706        templates: templatesInPage,
7707        _nonce: ElementorProFrontendConfig.woocommerce.menu_cart.fragments_nonce,
7708        is_editor: elementorFrontend.isEditMode()
7709      },
7710
7711      success(successData) {
7712        if (successData?.fragments) {
7713          jQuery.each(successData.fragments, (key, value) => {
7714            jQuery(key).replaceWith(value);
7715          });
7716        }
7717      },
7718
7719      complete() {
7720        if ('added_to_cart' === eventType) {
7721          this.automaticallyOpenCart();
7722        }
7723      }
7724
7725    });
7726  }
7727
7728  bindEvents() {
7729    const menuCart = elementorProFrontend.config.woocommerce.menu_cart,
7730          noQueryParams = -1 === menuCart.cart_page_url.indexOf('?'),
7731          currentUrl = noQueryParams ? window.location.origin + window.location.pathname : window.location.href,
7732          cartUrl = menuCart.cart_page_url,
7733          isCart = menuCart.cart_page_url === currentUrl,
7734          isCheckout = menuCart.checkout_page_url === currentUrl,
7735          selectors = this.getSettings('selectors'); // If on cart page or checkout page don't open cart, rather stay on, or go to cart page, and bail from init.
7736
7737    if (isCart && isCheckout) {
7738      this.$element.find(selectors.toggleButton).attr('href', cartUrl);
7739      return;
7740    } // Cache cart open state.
7741
7742
7743    const classes = this.getSettings('classes');
7744    this.isCartOpen = this.$element.hasClass(classes.isShown);
7745    const settings = this.getElementSettings();
7746
7747    if ('mouseover' === settings.open_cart) {
7748      // Enable opening of mini-cart and side-cart by hover (include click so we can `preventDefault()` page-top jump on click).
7749      this.elements.$toggleWrapper.on('mouseover click', selectors.toggleButton, event => {
7750        event.preventDefault();
7751        this.showCart();
7752      }); // Close Cart on mouseleave.
7753
7754      this.elements.$toggleWrapper.on('mouseleave', () => this.hideCart());
7755    } else {
7756      // Enable opening of mini-cart and side-cart by click.
7757      this.elements.$toggleWrapper.on('click', selectors.toggleButton, event => {
7758        event.preventDefault();
7759        this.toggleCart();
7760      });
7761    } // Listen for clicks outside to close any open cart.
7762
7763
7764    elementorFrontend.elements.$document.on('click', event => {
7765      if (!this.isCartOpen) {
7766        return;
7767      }
7768
7769      const $target = jQuery(event.target); // Don't close if this is click on the main panel or toggle button.
7770
7771      if ($target.closest(this.elements.$main).length || $target.closest(selectors.toggle).length) {
7772        return;
7773      }
7774
7775      this.hideCart();
7776    });
7777    this.elements.$closeButton.on('click', event => {
7778      event.preventDefault();
7779      this.hideCart();
7780    });
7781    elementorFrontend.elements.$document.on('keyup', event => {
7782      const ESC_KEY = 27;
7783
7784      if (ESC_KEY === event.keyCode) {
7785        this.hideCart();
7786      }
7787    });
7788    elementorFrontend.elements.$body.on('wc_fragments_refreshed removed_from_cart added_to_cart', (event, data) => this.refreshFragments(event.type, data)); // Govern the height of the mini-cart dropdown.
7789
7790    elementorFrontend.addListenerOnce(this.getUniqueHandlerID() + '_window_resize_dropdown', 'resize', () => this.governDropdownHeight());
7791    elementorFrontend.elements.$body.on('wc_fragments_loaded wc_fragments_refreshed', () => this.governDropdownHeight());
7792  }
7793
7794  unbindEvents() {
7795    elementorFrontend.removeListeners(this.getUniqueHandlerID() + '_window_resize_dropdown', 'resize');
7796  }
7797
7798  onInit() {
7799    super.onInit();
7800    /**
7801     * When the page is reloaded after an item is added to cart, and the user activated the
7802     * "Automatically Open Cart" option, the cart should open to show the updated contents.
7803     */
7804
7805    if (elementorProFrontend.config.woocommerce.productAddedToCart) {
7806      this.automaticallyOpenCart();
7807    } // Govern the height of the mini-cart dropdown.
7808
7809
7810    this.governDropdownHeight();
7811  }
7812
7813  governDropdownHeight() {
7814    const settings = this.getElementSettings(); // Only do this for mini-cart.
7815
7816    if ('mini-cart' !== settings.cart_type) {
7817      return;
7818    } // Elements need to be re-instantiated every time as WooCommerce reloads the toggle button
7819    // and cart contents in our widget when the cart changes e.g. adding products to the cart.
7820
7821
7822    const selectors = this.getSettings('selectors');
7823    const $productList = this.$element.find(selectors.productList),
7824          $toggle = this.$element.find(selectors.toggle); // Make sure required elements exist.
7825
7826    if (!$productList.length || !$toggle.length) {
7827      return;
7828    } // Remove max-height of productList so we can take new measurements.
7829
7830
7831    this.$element.find(selectors.productList).css('max-height', ''); // Calculate what the height of the productList should be based on elements above, below and it's vertical position.
7832
7833    const windowHeight = document.documentElement.clientHeight,
7834          toggleHeight = $toggle.height() + parseInt(this.elements.$main.css('margin-top')),
7835          toggleTopPosition = $toggle[0].getBoundingClientRect().top,
7836          productListHeight = $productList.height(),
7837          dropdownWithoutViewportHeight = this.elements.$main.prop('scrollHeight') - productListHeight,
7838          extraBottomSpacing = 30,
7839          maxViewportHeight = windowHeight - toggleTopPosition - toggleHeight - dropdownWithoutViewportHeight - extraBottomSpacing,
7840          optimalViewportHeight = Math.max(120, maxViewportHeight); // Apply max-height to the productList.
7841
7842    $productList.css('max-height', optimalViewportHeight);
7843  }
7844
7845}
7846
7847exports["default"] = _default;
7848
7849/***/ }),
7850
7851/***/ "../modules/woocommerce/assets/js/frontend/handlers/my-account.js":
7852/*!************************************************************************!*\
7853  !*** ../modules/woocommerce/assets/js/frontend/handlers/my-account.js ***!
7854  \************************************************************************/
7855/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7856
7857
7858
7859var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
7860
7861Object.defineProperty(exports, "__esModule", ({
7862  value: true
7863}));
7864exports["default"] = void 0;
7865
7866var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/woocommerce/assets/js/frontend/handlers/base.js"));
7867
7868class MyAccountHandler extends _base.default {
7869  getDefaultSettings() {
7870    return {
7871      selectors: {
7872        address: 'address',
7873        tabLinks: '.woocommerce-MyAccount-navigation-link a',
7874        viewOrderButtons: '.my_account_orders .woocommerce-button.view',
7875        viewOrderLinks: '.woocommerce-orders-table__cell-order-number a',
7876        authForms: 'form.login, form.register',
7877        tabWrapper: '.e-my-account-tab',
7878        tabItem: '.woocommerce-MyAccount-navigation li',
7879        allPageElements: '[e-my-account-page]',
7880        purchasenote: 'tr.product-purchase-note',
7881        contentWrapper: '.woocommerce-MyAccount-content-wrapper'
7882      }
7883    };
7884  }
7885
7886  getDefaultElements() {
7887    const selectors = this.getSettings('selectors');
7888    return {
7889      $address: this.$element.find(selectors.address),
7890      $tabLinks: this.$element.find(selectors.tabLinks),
7891      $viewOrderButtons: this.$element.find(selectors.viewOrderButtons),
7892      $viewOrderLinks: this.$element.find(selectors.viewOrderLinks),
7893      $authForms: this.$element.find(selectors.authForms),
7894      $tabWrapper: this.$element.find(selectors.tabWrapper),
7895      $tabItem: this.$element.find(selectors.tabItem),
7896      $allPageElements: this.$element.find(selectors.allPageElements),
7897      $purchasenote: this.$element.find(selectors.purchasenote),
7898      $contentWrapper: this.$element.find(selectors.contentWrapper)
7899    };
7900  }
7901
7902  editorInitTabs() {
7903    this.elements.$allPageElements.each((index, element) => {
7904      const currentPage = element.getAttribute('e-my-account-page');
7905      let $linksToThisPage;
7906
7907      switch (currentPage) {
7908        case 'view-order':
7909          $linksToThisPage = this.elements.$viewOrderLinks.add(this.elements.$viewOrderButtons);
7910          break;
7911
7912        default:
7913          $linksToThisPage = this.$element.find('.woocommerce-MyAccount-navigation-link--' + currentPage);
7914      }
7915
7916      $linksToThisPage.on('click', () => {
7917        this.currentPage = currentPage;
7918        this.editorShowTab();
7919      });
7920    });
7921  }
7922
7923  editorShowTab() {
7924    const $currentPage = this.$element.find('[e-my-account-page="' + this.currentPage + '"]');
7925    this.$element.attr('e-my-account-page', this.currentPage);
7926    this.elements.$allPageElements.hide();
7927    $currentPage.show();
7928    this.toggleEndpointClasses();
7929
7930    if ('view-order' !== this.currentPage) {
7931      this.elements.$tabItem.removeClass('is-active');
7932      this.$element.find('.woocommerce-MyAccount-navigation-link--' + this.currentPage).addClass('is-active');
7933    }
7934    /**
7935     * We need to run equalizeElementHeights() again when the 'edit-address' or 'view-order' tab is shown, because jQuery cannot
7936     * get the height of hidden elements, and this tab was hidden on initial page load in the editor.
7937     */
7938
7939
7940    if ('edit-address' === this.currentPage || 'view-order' === this.currentPage) {
7941      this.equalizeElementHeights();
7942    }
7943  }
7944
7945  toggleEndpointClasses() {
7946    const wcPages = ['dashboard', 'orders', 'view-order', 'downloads', 'edit-account', 'edit-ad
7946dress', 'payment-methods'];
7947    let wrapperClass = '';
7948    this.elements.$tabWrapper.removeClass('e-my-account-tab__' + wcPages.join(' e-my-account-tab__') + ' e-my-account-tab__dashboard--custom');
7949
7950    if ('dashboard' === this.currentPage && this.elements.$contentWrapper.find('.elementor').length) {
7951      wrapperClass = ' e-my-account-tab__dashboard--custom';
7952    }
7953
7954    if (wcPages.includes(this.currentPage)) {
7955      this.elements.$tabWrapper.addClass('e-my-account-tab__' + this.currentPage + wrapperClass);
7956    }
7957  }
7958
7959  applyButtonsHoverAnimation() {
7960    const elementSettings = this.getElementSettings();
7961
7962    if (elementSettings.forms_buttons_hover_animation) {
7963      this.$element.find('.woocommerce button.button,  #add_payment_method #payment #place_order').addClass('elementor-animation-' + elementSettings.forms_buttons_hover_animation);
7964    }
7965
7966    if (elementSettings.tables_button_hover_animation) {
7967      this.$element.find('.order-again .button, td .button, .woocommerce-pagination .button').addClass('elementor-animation-' + elementSettings.tables_button_hover_animation);
7968    }
7969  }
7970
7971  equalizeElementHeights() {
7972    this.equalizeElementHeight(this.elements.$address); // equalize <address> boxes height
7973
7974    if (!this.isEdit) {
7975      // Auth forms do not display in the Editor
7976      this.equalizeElementHeight(this.elements.$authForms); // equalize login/reg boxes height
7977    }
7978  }
7979
7980  onElementChange(propertyName) {
7981    // When the 'General Text' Typography or 'Section' Padding is changed, the height of the boxes need to update as well.
7982    if (0 === propertyName.indexOf('general_text_typography') || 0 === propertyName.indexOf('sections_padding')) {
7983      this.equalizeElementHeights();
7984    }
7985
7986    if (0 === propertyName.indexOf('forms_rows_gap')) {
7987      this.removePaddingBetweenPurchaseNote(this.elements.$purchasenote);
7988    }
7989
7990    if ('customize_dashboard_select' === propertyName) {
7991      elementorPro.modules.woocommerce.onTemplateIdChange('customize_dashboard_select');
7992    }
7993  }
7994
7995  bindEvents() {
7996    super.bindEvents(); // The heights of the Registration and Login boxes need to be recaclulated and equalized when
7997    // WooCommerce adds validation messages (such as the password strength meter) into these sections.
7998
7999    elementorFrontend.elements.$body.on('keyup change', '.register #reg_password', () => {
8000      this.equalizeElementHeights();
8001    });
8002  }
8003
8004  onInit() {
8005    super.onInit(...arguments);
8006
8007    if (this.isEdit) {
8008      this.editorInitTabs();
8009
8010      if (!this.$element.attr('e-my-account-page')) {
8011        this.currentPage = 'dashboard';
8012      } else {
8013        this.currentPage = this.$element.attr('e-my-account-page');
8014      }
8015
8016      this.editorShowTab();
8017    }
8018
8019    this.applyButtonsHoverAnimation();
8020    this.equalizeElementHeights();
8021    this.removePaddingBetweenPurchaseNote(this.elements.$purchasenote);
8022  }
8023
8024}
8025
8026exports["default"] = MyAccountHandler;
8027
8028/***/ }),
8029
8030/***/ "../modules/woocommerce/assets/js/frontend/handlers/notices.js":
8031/*!*********************************************************************!*\
8032  !*** ../modules/woocommerce/assets/js/frontend/handlers/notices.js ***!
8033  \*********************************************************************/
8034/***/ ((__unused_webpack_module, exports) => {
8035
8036
8037
8038Object.defineProperty(exports, "__esModule", ({
8039  value: true
8040}));
8041exports["default"] = void 0;
8042
8043class _default extends elementorModules.frontend.handlers.Base {
8044  getDefaultSettings() {
8045    return {
8046      selectors: {
8047        woocommerceNotices: '.woocommerce-NoticeGroup, :not(.woocommerce-NoticeGroup) .woocommerce-error, :not(.woocommerce-NoticeGroup) .woocommerce-message, :not(.woocommerce-NoticeGroup) .woocommerce-info',
8048        noticesWrapper: '.e-woocommerce-notices-wrapper'
8049      }
8050    };
8051  }
8052
8053  getDefaultElements() {
8054    const selectors = this.getSettings('selectors');
8055    return {
8056      $documentScrollToElements: elementorFrontend.elements.$document.find('html, body'),
8057      $woocommerceCheckoutForm: elementorFrontend.elements.$body.find('.form.checkout'),
8058      $noticesWrapper: this.$element.find(selectors.noticesWrapper)
8059    };
8060  }
8061
8062  moveNotices() {
8063    let scrollToNotices = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
8064    const selectors = this.getSettings('selectors');
8065    let $notices = elementorFrontend.elements.$body.find(selectors.woocommerceNotices);
8066
8067    if (elementorFrontend.isEditMode() || elementorFrontend.isWPPreviewMode()) {
8068      $notices = $notices.filter(':not(.e-notices-demo-notice)');
8069    }
8070
8071    if (scrollToNotices) {
8072      this.elements.$documentScrollToElements.stop();
8073    }
8074
8075    this.elements.$noticesWrapper.prepend($notices);
8076
8077    if (!this.is_ready) {
8078      this.elements.$noticesWrapper.removeClass('e-woocommerce-notices-wrapper-loading');
8079      this.is_ready = true;
8080    }
8081
8082    if (scrollToNotices) {
8083      let $scrollToElement = $notices;
8084
8085      if (!$scrollToElement.length) {
8086        $scrollToElement = this.elements.$woocommerceCheckoutForm;
8087      }
8088
8089      if ($scrollToElement.length) {
8090        // Scrolls to the notice and puts it in the middle of the window so users' attention is drawn to it.
8091        this.elements.$documentScrollToElements.animate({
8092          scrollTop: $scrollToElement.offset().top - document.documentElement.clientHeight / 2
8093        }, 1000);
8094      }
8095    }
8096  }
8097
8098  onInit() {
8099    super.onInit();
8100    this.is_ready = false;
8101    this.moveNotices(true);
8102  }
8103
8104  bindEvents() {
8105    elementorFrontend.elements.$body.on('updated_wc_div updated_checkout updated_cart_totals applied_coupon removed_coupon applied_coupon_in_checkout removed_coupon_in_checkout checkout_error', () => this.moveNotices(true));
8106  }
8107
8108}
8109
8110exports["default"] = _default;
8111
8112/***/ }),
8113
8114/***/ "../modules/woocommerce/assets/js/frontend/handlers/purchase-summary.js":
8115/*!******************************************************************************!*\
8116  !*** ../modules/woocommerce/assets/js/frontend/handlers/purchase-summary.js ***!
8117  \******************************************************************************/
8118/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
8119
8120
8121
8122var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
8123
8124Object.defineProperty(exports, "__esModule", ({
8125  value: true
8126}));
8127exports["default"] = void 0;
8128
8129var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/woocommerce/assets/js/frontend/handlers/base.js"));
8130
8131class PurchaseSummaryHandler extends _base.default {
8132  getDefaultSettings() {
8133    return {
8134      selectors: {
8135        container: '.elementor-widget-woocommerce-purchase-summary',
8136        address: 'address',
8137        purchasenote: '.product-purchase-note'
8138      }
8139    };
8140  }
8141
8142  getDefaultElements() {
8143    const selectors = this.getSettings('selectors');
8144    return {
8145      $container: this.$element.find(selectors.container),
8146      $address: this.$element.find(selectors.address),
8147      $purchasenote: this.$element.find(selectors.purchasenote)
8148    };
8149  }
8150
8151  onElementChange(propertyName) {
8152    // When the 'General Text' Typography, 'Section' Padding, or Border Width is changed, the height of the boxes need to update as well.
8153    const properties = ['general_text_typography', 'sections_padding', 'sections_border_width'];
8154
8155    for (const property of properties) {
8156      if (propertyName.startsWith(property)) {
8157        this.equalizeElementHeight(this.elements.$address);
8158      }
8159    } // Remove padding on the purchase notes.
8160
8161
8162    if (propertyName.startsWith('order_details_rows_gap')) {
8163      this.removePaddingBetweenPurchaseNote(this.elements.$purchasenote);
8164    }
8165  }
8166
8167  applyButtonsHoverAnimation() {
8168    const elementSettings = this.getElementSettings();
8169
8170    if (elementSettings.order_details_button_hover_animation) {
8171      this.$element.find('.order-again .button, td .button').addClass('elementor-animation-' + elementSettings.order_details_button_hover_animation);
8172    }
8173  }
8174
8175  onInit() {
8176    super.onInit(...arguments);
8177    this.equalizeElementHeight(this.elements.$address);
8178    this.removePaddingBetweenPurchaseNote(this.elements.$purchasenote);
8179    this.applyButtonsHoverAnimation();
8180  }
8181
8182}
8183
8184exports["default"] = PurchaseSummaryHandler;
8185
8186/***/ })
8186,
8187
8188/***/ "@wordpress/i18n":
8189/*!**************************!*\
8190  !*** external "wp.i18n" ***!
8191  \**************************/
8192/***/ ((module) => {
8193
8194module.exports = wp.i18n;
8195
8196/***/ })
8197
8198},
8199/******/ __webpack_require__ => { // webpackRuntimeModules
8200/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
8201/******/ __webpack_require__.O(0, ["frontend"], () => (__webpack_exec__("../assets/dev/js/frontend/preloaded-elements-handlers.js")));
8202/******/ var __webpack_exports__ = __webpack_require__.O();
8203/******/ }
8204]);
8205//# sourceMappingURL=preloaded-elements-handlers.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.