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> </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.