frontend.js (87685B)
1 /*! elementor - v3.4.4 - 13-09-2021 */ 2 (self["webpackChunkelementor"] = self["webpackChunkelementor"] || []).push([["frontend"],{ 3 4 /***/ "../assets/dev/js/frontend/documents-manager.js": 5 /*!******************************************************!*\ 6 !*** ../assets/dev/js/frontend/documents-manager.js ***! 7 \******************************************************/ 8 /***/ ((__unused_webpack_module, exports, __webpack_require__) => { 9 10 "use strict"; 11 12 13 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); 14 15 Object.defineProperty(exports, "__esModule", ({ 16 value: true 17 })); 18 exports.default = void 0; 19 20 var _document = _interopRequireDefault(__webpack_require__(/*! ./document */ "../assets/dev/js/frontend/document.js")); 21 22 class _default extends elementorModules.ViewModule { 23 constructor(...args) { 24 super(...args); 25 this.documents = {}; 26 this.initDocumentClasses(); 27 this.attachDocumentsClasses(); 28 } 29 30 getDefaultSettings() { 31 return { 32 selectors: { 33 document: '.elementor' 34 } 35 }; 36 } 37 38 getDefaultElements() { 39 const selectors = this.getSettings('selectors'); 40 return { 41 $documents: jQuery(selectors.document) 42 }; 43 } 44 45 initDocumentClasses() { 46 this.documentClasses = { 47 base: _document.default 48 }; 49 elementorFrontend.hooks.doAction('elementor/frontend/documents-manager/init-classes', this); 50 } 51 52 addDocumentClass(documentType, documentClass) { 53 this.documentClasses[documentType] = documentClass; 54 } 55 56 attachDocumentsClasses() { 57 this.elements.$documents.each((index, document) => this.attachDocumentClass(jQuery(document))); 58 } 59 60 attachDocumentClass($document) { 61 const documentData = $document.data(), 62 documentID = documentData.elementorId, 63 documentType = documentData.elementorType, 64 DocumentClass = this.documentClasses[documentType] || this.documentClasses.base; 65 this.documents[documentID] = new DocumentClass({ 66 $element: $document, 67 id: documentID 68 }); 69 } 70 71 } 72 73 exports.default = _default; 74 75 /***/ }), 76 77 /***/ "../assets/dev/js/frontend/elements-handlers-manager.js": 78 /*!**************************************************************!*\ 79 !*** ../assets/dev/js/frontend/elements-handlers-manager.js ***! 80 \**************************************************************/ 81 /***/ ((module, __unused_webpack_exports, __webpack_require__) => { 82 83 "use strict"; 84 85 86 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); 87 88 var _global = _interopRequireDefault(__webpack_require__(/*! ./handlers/global */ "../assets/dev/js/frontend/handlers/global.js")); 89 90 var _section = _interopRequireDefault(__webpack_require__(/*! ./handlers/section/section */ "../assets/dev/js/frontend/handlers/section/section.js")); 91 92 var _column = _interopRequireDefault(__webpack_require__(/*! ./handlers/column */ "../assets/dev/js/frontend/handlers/column.js")); 93 94 module.exports = function ($) { 95 const handlersInstances = {}; 96 this.elementsHandlers = { 97 'accordion.default': () => __webpack_require__.e(/*! import() | accordion */ "accordion").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/accordion */ "../assets/dev/js/frontend/handlers/accordion.js")), 98 'alert.default': () => __webpack_require__.e(/*! import() | alert */ "alert").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/alert */ "../assets/dev/js/frontend/handlers/alert.js")), 99 'counter.default': () => __webpack_require__.e(/*! import() | counter */ "counter").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/counter */ "../assets/dev/js/frontend/handlers/counter.js")), 100 'progress.default': () => __webpack_require__.e(/*! import() | progress */ "progress").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/progress */ "../assets/dev/js/frontend/handlers/progress.js")), 101 'tabs.default': () => __webpack_require__.e(/*! import() | tabs */ "tabs").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/tabs */ "../assets/dev/js/frontend/handlers/tabs.js")), 102 'toggle.default': () => __webpack_require__.e(/*! import() | toggle */ "toggle").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/toggle */ "../assets/dev/js/frontend/handlers/toggle.js")), 103 'video.default': () => __webpack_require__.e(/*! import() | video */ "video").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/video */ "../assets/dev/js/frontend/handlers/video.js")), 104 'image-carousel.default': () => __webpack_require__.e(/*! import() | image-carousel */ "image-carousel").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/image-carousel */ "../assets/dev/js/frontend/handlers/image-carousel.js")), 105 'text-editor.default': () => __webpack_require__.e(/*! import() | text-editor */ "text-editor").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/text-editor */ "../assets/dev/js/frontend/handlers/text-editor.js")), 106 'wp-widget-media_audio.default': () => __webpack_require__.e(/*! import() | wp-audio */ "wp-audio").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/wp-audio */ "../assets/dev/js/frontend/handlers/wp-audio.js")) 107 }; 108 109 const addGlobalHandlers = () => elementorFrontend.hooks.addAction('frontend/element_ready/global', _global.default); 110 111 const addElementsHandlers = () => { 112 this.elementsHandlers.section = _section.default; 113 this.elementsHandlers.column = _column.default; 114 $.each(this.elementsHandlers, (elementName, Handlers) => { 115 const elementData = elementName.split('.'); 116 elementName = elementData[0]; 117 const skin = elementData[1] || null; 118 this.attachHandler(elementName, Handlers, skin); 119 }); 120 }; 121 122 const isClassHandler = Handler => { 123 var _Handler$prototype; 124 125 return (_Handler$prototype = Handler.prototype) === null || _Handler$prototype === void 0 ? void 0 : _Handler$prototype.getUniqueHandlerID; 126 }; 127 128 const addHandlerWithHook = (elementName, Handler, skin = 'default') => { 129 skin = skin ? '.' + skin : ''; 130 elementorFrontend.hooks.addAction(`frontend/element_ready/${elementName}${skin}`, $element => { 131 if (isClassHandler(Handler)) { 132 this.addHandler(Handler, { 133 $element 134 }, true); 135 } else { 136 const handlerValue = Handler(); 137 138 if (handlerValue instanceof Promise) { 139 handlerValue.then(({ 140 default: dynamicHandler 141 }) => { 142 this.addHandler(dynamicHandler, { 143 $element 144 }, true); 145 }); 146 } else { 147 this.addHandler(handlerValue, { 148 $element 149 }, true); 150 } 151 } 152 }); 153 }; 154 155 this.addHandler = function (HandlerClass, options) { 156 const elementID = options.$element.data('model-cid'); 157 let handlerID; // If element is in edit mode 158 159 if (elementID) { 160 handlerID = HandlerClass.prototype.getConstructorID(); 161 162 if (!handlersInstances[elementID]) { 163 handlersInstances[elementID] = {}; 164 } 165 166 const oldHandler = handlersInstances[elementID][handlerID]; 167 168 if (oldHandler) { 169 oldHandler.onDestroy(); 170 } 171 } 172 173 const newHandler = new HandlerClass(options); 174 175 if (elementID) { 176 handlersInstances[elementID][handlerID] = newHandler; 177 } 178 }; 179 180 this.attachHandler = (elementName, Handlers, skin) => { 181 if (!Array.isArray(Handlers)) { 182 Handlers = [Handlers]; 183 } 184 185 Handlers.forEach(Handler => addHandlerWithHook(elementName, Handler, skin)); 186 }; 187 188 this.getHandler = function (handlerName) { 189 if (!handlerName) { 190 return; 191 } 192 193 const elementHandler = this.elementsHandlers[handlerName]; 194 195 if (isClassHandler(elementHandler)) { 196 return elementHandler; 197 } 198 199 return new Promise(res => { 200 elementHandler().then(({ 201 default: dynamicHandler 202 }) => { 203 res(dynamicHandler); 204 }); 205 }); 206 }; 207 208 this.getHandlers = function (handlerName) { 209 elementorCommon.helpers.softDeprecated('getHandlers', '3.1.0', 'elementorFrontend.elementsHandler.getHandler'); 210 211 if (handlerName) { 212 return this.getHandler(handlerName); 213 } 214 215 return this.elementsHandlers; 216 }; 217 218 this.runReadyTrigger = function (scope) { 219 if (elementorFrontend.config.is_static) { 220 return; 221 } // Initializing the `$scope` as frontend jQuery instance 222 223 224 const $scope = jQuery(scope), 225 elementType = $scope.attr('data-element_type'); 226 227 if (!elementType) { 228 return; 229 } 230 231 elementorFrontend.hooks.doAction('frontend/element_ready/global', $scope, $); 232 elementorFrontend.hooks.doAction(`frontend/element_ready/${elementType}`, $scope, $); 233 234 if ('widget' === elementType) { 235 const widgetType = $scope.attr('data-widget_type'); 236 elementorFrontend.hooks.doAction(`frontend/element_ready/${widgetType}`, $scope, $); 237 } 238 }; 239 240 this.init = () => { 241 addGlobalHandlers(); 242 addElementsHandlers(); 243 }; 244 }; 245 246 /***/ }), 247 248 /***/ "../assets/dev/js/frontend/frontend.js": 249 /*!*********************************************!*\ 250 !*** ../assets/dev/js/frontend/frontend.js ***! 251 \*********************************************/ 252 /***/ ((__unused_webpack_module, exports, __webpack_require__) => { 253 254 "use strict"; 255 256 257 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); 258 259 Object.defineProperty(exports, "__esModule", ({ 260 value: true 261 })); 262 exports.default = void 0; 263 264 __webpack_require__(/*! ../public-path */ "../assets/dev/js/public-path.js"); 265 266 var _documentsManager = _interopRequireDefault(__webpack_require__(/*! ./documents-manager */ "../assets/dev/js/frontend/documents-manager.js")); 267 268 var _storage = _interopRequireDefault(__webpack_require__(/*! elementor-common/utils/storage */ "../core/common/assets/js/utils/storage.js")); 269 270 var _environment = _interopRequireDefault(__webpack_require__(/*! elementor-common/utils/environment */ "../core/common/assets/js/utils/environment.js")); 271 272 var _youtubeLoader = _interopRequireDefault(__webpack_require__(/*! ./utils/video-api/youtube-loader */ "../assets/dev/js/frontend/utils/video-api/youtube-loader.js")); 273 274 var _vimeoLoader = _interopRequireDefault(__webpack_require__(/*! ./utils/video-api/vimeo-loader */ "../assets/dev/js/frontend/utils/video-api/vimeo-loader.js")); 275 276 var _baseLoader = _interopRequireDefault(__webpack_require__(/*! ./utils/video-api/base-loader */ "../assets/dev/js/frontend/utils/video-api/base-loader.js")); 277 278 var _urlActions = _interopRequireDefault(__webpack_require__(/*! ./utils/url-actions */ "../assets/dev/js/frontend/utils/url-actions.js")); 279 280 var _swiperBc = _interopRequireDefault(__webpack_require__(/*! ./utils/swiper-bc */ "../assets/dev/js/frontend/utils/swiper-bc.js")); 281 282 var _lightboxManager = _interopRequireDefault(__webpack_require__(/*! ./utils/lightbox/lightbox-manager */ "../assets/dev/js/frontend/utils/lightbox/lightbox-manager.js")); 283 284 var _assetsLoader = _interopRequireDefault(__webpack_require__(/*! ./utils/assets-loader */ "../assets/dev/js/frontend/utils/assets-loader.js")); 285 286 var _breakpoints = _interopRequireDefault(__webpack_require__(/*! elementor-utils/breakpoints */ "../assets/dev/js/utils/breakpoints.js")); 287 288 var _frontend = _interopRequireDefault(__webpack_require__(/*! elementor/modules/shapes/assets/js/frontend/frontend */ "../modules/shapes/assets/js/frontend/frontend.js")); 289 290 var _utils = __webpack_require__(/*! elementor-frontend/utils/utils */ "../assets/dev/js/frontend/utils/utils.js"); 291 292 /* global elementorFrontendConfig */ 293 const EventManager = __webpack_require__(/*! elementor-utils/hooks */ "../assets/dev/js/utils/hooks.js"), 294 ElementsHandler = __webpack_require__(/*! elementor-frontend/elements-handlers-manager */ "../assets/dev/js/frontend/elements-handlers-manager.js"), 295 AnchorsModule = __webpack_require__(/*! elementor-frontend/utils/anchors */ "../assets/dev/js/frontend/utils/anchors.js"); 296 297 class Frontend extends elementorModules.ViewModule { 298 constructor(...args) { 299 super(...args); 300 this.config = elementorFrontendConfig; 301 this.config.legacyMode = { 302 get elementWrappers() { 303 if (elementorFrontend.isEditMode()) { 304 elementorCommon.helpers.hardDeprecated('elementorFrontend.config.legacyMode.elementWrappers', '3.1.0', 'elementorFrontend.config.experimentalFeatures.e_dom_optimization'); 305 } 306 307 return !elementorFrontend.config.experimentalFeatures.e_dom_optimization; 308 } 309 310 }; 311 this.populateActiveBreakpointsConfig(); 312 } // TODO: BC since 2.5.0 313 314 315 get Module() { 316 if (this.isEditMode()) { 317 parent.elementorCommon.helpers.hardDeprecated('elementorFrontend.Module', '2.5.0', 'elementorModules.frontend.handlers.Base'); 318 } 319 320 return elementorModules.frontend.handlers.Base; 321 } 322 323 getDefaultSettings() { 324 return { 325 selectors: { 326 elementor: '.elementor', 327 adminBar: '#wpadminbar' 328 } 329 }; 330 } 331 332 getDefaultElements() { 333 const defaultElements = { 334 window: window, 335 $window: jQuery(window), 336 $document: jQuery(document), 337 $head: jQuery(document.head), 338 $body: jQuery(document.body), 339 $deviceMode: jQuery('<span>', { 340 id: 'elementor-device-mode', 341 class: 'elementor-screen-only' 342 }) 343 }; 344 defaultElements.$body.append(defaultElements.$deviceMode); 345 return defaultElements; 346 } 347 348 bindEvents() { 349 this.elements.$window.on('resize', () => this.setDeviceModeData()); 350 } 351 /** 352 * @deprecated 2.4.0 Use just `this.elements` instead 353 */ 354 355 356 getElements(elementName) { 357 return this.getItems(this.elements, elementName); 358 } 359 /** 360 * @deprecated 2.4.0 This method was never in use 361 */ 362 363 364 getPageSettings(settingName) { 365 const settingsObject = this.isEditMode() ? elementor.settings.page.model.attributes : this.config.settings.page; 366 return this.getItems(settingsObject, settingName); 367 } 368 369 getGeneralSettings(settingName) { 370 if (this.isEditMode()) { 371 parent.elementorCommon.helpers.softDeprecated('getGeneralSettings', '3.0.0', 'getKitSettings and remove the `elementor_` prefix'); 372 } 373 374 return this.getKitSettings(`elementor_${settingName}`); 375 } 376 377 getKitSettings(settingName) { 378 // TODO: use Data API. 379 return this.getItems(this.config.kit, settingName); 380 } 381 382 getCurrentDeviceMode() { 383 return getComputedStyle(this.elements.$deviceMode[0], ':after').content.replace(/"/g, ''); 384 } 385 386 getDeviceSetting(deviceMode, settings, settingKey) { 387 // Add specific handling for widescreen since it is larger than desktop. 388 if ('widescreen' === deviceMode) { 389 return this.getWidescreenSetting(settings, settingKey); 390 } 391 392 const devices = elementorFrontend.breakpoints.getActiveBreakpointsList({ 393 largeToSmall: true, 394 withDesktop: true 395 }); 396 let deviceIndex = devices.indexOf(deviceMode); 397 398 while (deviceIndex > 0) { 399 const currentDevice = devices[deviceIndex], 400 fullSettingKey = settingKey + '_' + currentDevice, 401 deviceValue = settings[fullSettingKey]; // Accept 0 as value. 402 403 if (deviceValue || 0 === deviceValue) { 404 return deviceValue; 405 } 406 407 deviceIndex--; 408 } 409 410 return settings[settingKey]; 411 } 412 413 getWidescreenSetting(settings, settingKey) { 414 const deviceMode = 'widescreen', 415 widescreenSettingKey = settingKey + '_' + deviceMode; 416 let settingToReturn; // If the device mode is 'widescreen', and the setting exists - return it. 417 418 if (settings[widescreenSettingKey]) { 419 settingToReturn = settings[widescreenSettingKey]; 420 } else { 421 // Otherwise, return the desktop setting 422 settingToReturn = settings[settingKey]; 423 } 424 425 return settingToReturn; 426 } 427 428 getCurrentDeviceSetting(settings, settingKey) { 429 return this.getDeviceSetting(elementorFrontend.getCurrentDeviceMode(), settings, settingKey); 430 } 431 432 isEditMode() { 433 return this.config.environmentMode.edit; 434 } 435 436 isWPPreviewMode() { 437 return this.config.environmentMode.wpPreview; 438 } 439 440 initDialogsManager() { 441 let dialogsManager; 442 443 this.getDialogsManager = () => { 444 if (!dialogsManager) { 445 dialogsManager = new DialogsManager.Instance(); 446 } 447 448 return dialogsManager; 449 }; 450 } 451 452 initOnReadyComponents() { 453 this.utils = { 454 youtube: new _youtubeLoader.default(), 455 vimeo: new _vimeoLoader.default(), 456 baseVideoLoader: new _baseLoader.default(), 457 anchors: new AnchorsModule(), 458 459 get lightbox() { 460 return _lightboxManager.default.getLightbox(); 461 }, 462 463 urlActions: new _urlActions.default(), 464 swiper: _swiperBc.default, 465 environment: _environment.default, 466 assetsLoader: new _assetsLoader.default(), 467 escapeHTML: _utils.escapeHTML 468 }; // TODO: BC since 2.4.0 469 470 this.modules = { 471 StretchElement: elementorModules.frontend.tools.StretchElement, 472 Masonry: elementorModules.utils.Masonry 473 }; 474 this.elementsHandler.init(); 475 476 if (this.isEditMode()) { 477 elementor.once('document:loaded', () => this.onDocumentLoaded()); 478 } else { 479 this.onDocumentLoaded(); 480 } 481 } 482 483 initOnReadyElements() { 484 this.elements.$wpAdminBar = this.elements.$document.find(this.getSettings('selectors.adminBar')); 485 } 486 487 addUserAgentClasses() { 488 for (const [key, value] of Object.entries(_environment.default)) { 489 if (value) { 490 this.elements.$body.addClass('e--ua-' + key); 491 } 492 } 493 } 494 495 setDeviceModeData() { 496 this.elements.$body.attr('data-elementor-device-mode', this.getCurrentDeviceMode()); 497 } 498 499 addListenerOnce(listenerID, event, callback, to) { 500 if (!to) { 501 to = this.elements.$window; 502 } 503 504 if (!this.isEditMode()) { 505 to.on(event, callback); 506 return; 507 } 508 509 this.removeListeners(listenerID, event, to); 510 511 if (to instanceof jQuery) { 512 const eventNS = event + '.' + listenerID; 513 to.on(eventNS, callback); 514 } else { 515 to.on(event, callback, listenerID); 516 } 517 } 518 519 removeListeners(listenerID, event, callback, from) { 520 if (!from) { 521 from = this.elements.$window; 522 } 523 524 if (from instanceof jQuery) { 525 const eventNS = event + '.' + listenerID; 526 from.off(eventNS, callback); 527 } else { 528 from.off(event, callback, listenerID); 529 } 530 } // Based on underscore function 531 532 533 debounce(func, wait) { 534 let timeout; 535 return function () { 536 const context = this, 537 args = arguments; 538 539 const later = () => { 540 timeout = null; 541 func.apply(context, args); 542 }; 543 544 const callNow = !timeout; 545 clearTimeout(timeout); 546 timeout = setTimeout(later, wait); 547 548 if (callNow) { 549 func.apply(context, args); 550 } 551 }; 552 } 553 554 waypoint($element, callback, options) { 555 const defaultOptions = { 556 offset: '100%', 557 triggerOnce: true 558 }; 559 options = jQuery.extend(defaultOptions, options); 560 561 const correctCallback = function () { 562 const element = this.element || this, 563 result = callback.apply(element, arguments); // If is Waypoint new API and is frontend 564 565 if (options.triggerOnce && this.destroy) { 566 this.destroy(); 567 } 568 569 return result; 570 }; 571 572 return $element.elementorWaypoint(correctCallback, options); 573 } 574 575 muteMigrationTraces() { 576 jQuery.migrateMute = true; 577 jQuery.migrateTrace = false; 578 } 579 /** 580 * Initialize the modules' widgets handlers. 581 */ 582 583 584 initModules() { 585 const handlers = { 586 shapes: _frontend.default 587 }; 588 elementorFrontend.trigger('elementor/modules/init:before'); 589 Object.entries(handlers).forEach(([moduleName, ModuleClass]) => { 590 this.modulesHandlers[moduleName] = new ModuleClass(); 591 }); 592 } 593 594 populateActiveBreakpointsConfig() { 595 this.config.responsive.activeBreakpoints = {}; 596 Object.entries(this.config.responsive.breakpoints).forEach(([breakpointKey, breakpointData]) => { 597 if (breakpointData.is_enabled) { 598 this.config.responsive.activeBreakpoints[breakpointKey] = breakpointData; 599 } 600 }); 601 } 602 603 init() { 604 this.hooks = new EventManager(); 605 this.breakpoints = new _breakpoints.default(this.config.responsive); 606 this.storage = new _storage.default(); 607 this.elementsHandler = new ElementsHandler(jQuery); 608 this.modulesHandlers = {}; 609 this.addUserAgentClasses(); 610 this.setDeviceModeData(); 611 this.initDialogsManager(); 612 613 if (this.isEditMode()) { 614 this.muteMigrationTraces(); 615 } // Keep this line before `initOnReadyComponents` call 616 617 618 this.elements.$window.trigger('elementor/frontend/init'); 619 this.initModules(); 620 this.initOnReadyElements(); 621 this.initOnReadyComponents(); 622 } 623 624 onDocumentLoaded() { 625 this.documentsManager = new _documentsManager.default(); 626 this.trigger('components:init'); 627 new _lightboxManager.default(); 628 } 629 630 } 631 632 exports.default = Frontend; 633 window.elementorFrontend = new Frontend(); 634 635 if (!elementorFrontend.isEditMode()) { 636 jQuery(() => elementorFrontend.init()); 637 } 638 639 /***/ }), 640 641 /***/ "../assets/dev/js/frontend/handlers/background-slideshow.js": 642 /*!******************************************************************!*\ 643 !*** ../assets/dev/js/frontend/handlers/background-slideshow.js ***! 644 \******************************************************************/ 645 /***/ ((__unused_webpack_module, exports) => { 646 647 "use strict"; 648 649 650 Object.defineProperty(exports, "__esModule", ({ 651 value: true 652 })); 653 exports.default = void 0; 654 655 class BackgroundSlideshow extends elementorModules.frontend.handlers.SwiperBase { 656 getDefaultSettings() { 657 return { 658 classes: { 659 swiperContainer: 'elementor-background-slideshow swiper-container', 660 swiperWrapper: 'swiper-wrapper', 661 swiperSlide: 'elementor-background-slideshow__slide swiper-slide', 662 slideBackground: 'elementor-background-slideshow__slide__image', 663 kenBurns: 'elementor-ken-burns', 664 kenBurnsActive: 'elementor-ken-burns--active', 665 kenBurnsIn: 'elementor-ken-burns--in', 666 kenBurnsOut: 'elementor-ken-burns--out' 667 } 668 }; 669 } 670 671 getSwiperOptions() { 672 const elementSettings = this.getElementSettings(); 673 const swiperOptions = { 674 grabCursor: false, 675 slidesPerView: 1, 676 slidesPerGroup: 1, 677 loop: 'yes' === elementSettings.background_slideshow_loop, 678 speed: elementSettings.background_slideshow_transition_duration, 679 autoplay: { 680 delay: elementSettings.background_slideshow_slide_duration, 681 stopOnLastSlide: !elementSettings.background_slideshow_loop 682 }, 683 handleElementorBreakpoints: true, 684 on: { 685 slideChange: () => { 686 if (elementSettings.background_slideshow_ken_burns) { 687 this.handleKenBurns(); 688 } 689 } 690 } 691 }; 692 693 if ('yes' === elementSettings.background_slideshow_loop) { 694 swiperOptions.loopedSlides = this.getSlidesCount(); 695 } 696 697 switch (elementSettings.background_slideshow_slide_transition) { 698 case 'fade': 699 swiperOptions.effect = 'fade'; 700 swiperOptions.fadeEffect = { 701 crossFade: true 702 }; 703 break; 704 705 case 'slide_down': 706 swiperOptions.autoplay.reverseDirection = true; 707 708 case 'slide_up': 709 swiperOptions.direction = 'vertical'; 710 break; 711 } 712 713 return swiperOptions; 714 } 715 716 buildSwiperElements() { 717 const classes = this.getSettings('classes'), 718 elementSettings = this.getElementSettings(), 719 direction = 'slide_left' === elementSettings.background_slideshow_slide_transition ? 'ltr' : 'rtl', 720 $container = jQuery('<div>', { 721 class: classes.swiperContainer, 722 dir: direction 723 }), 724 $wrapper = jQuery('<div>', { 725 class: classes.swiperWrapper 726 }), 727 kenBurnsActive = elementSettings.background_slideshow_ken_burns; 728 let slideInnerClass = classes.slideBackground; 729 730 if (kenBurnsActive) { 731 slideInnerClass += ' ' + classes.kenBurns; 732 const kenBurnsDirection = 'in' === elementSettings.background_slideshow_ken_burns_zoom_direction ? 'kenBurnsIn' : 'kenBurnsOut'; 733 slideInnerClass += ' ' + classes[kenBurnsDirection]; 734 } 735 736 this.elements.$slides = jQuery(); 737 elementSettings.background_slideshow_gallery.forEach(slide => { 738 const $slide = jQuery('<div>', { 739 class: classes.swiperSlide 740 }), 741 $slidebg = jQuery('<div>', { 742 class: slideInnerClass, 743 style: 'background-image: url("' + slide.url + '");' 744 }); 745 $slide.append($slidebg); 746 $wrapper.append($slide); 747 this.elements.$slides = this.elements.$slides.add($slide); 748 }); 749 $container.append($wrapper); 750 this.$element.prepend($container); 751 this.elements.$backgroundSlideShowContainer = $container; 752 } 753 754 async initSlider() { 755 if (1 >= this.getSlidesCount()) { 756 return; 757 } 758 759 const elementSettings = this.getElementSettings(); 760 const Swiper = elementorFrontend.utils.swiper; 761 this.swiper = await new Swiper(this.elements.$backgroundSlideShowContainer, this.getSwiperOptions()); // Expose the swiper instance in the frontend 762 763 this.elements.$backgroundSlideShowContainer.data('swiper', this.swiper); 764 765 if (elementSettings.background_slideshow_ken_burns) { 766 this.handleKenBurns(); 767 } 768 } 769 770 activate() { 771 this.buildSwiperElements(); 772 this.initSlider(); 773 } 774 775 deactivate() { 776 if (this.swiper) { 777 this.swiper.destroy(); 778 this.elements.$backgroundSlideShowContainer.remove(); 779 } 780 } 781 782 run() { 783 if ('slideshow' === this.getElementSettings('background_background')) { 784 this.activate(); 785 } else { 786 this.deactivate(); 787 } 788 } 789 790 onInit() { 791 super.onInit(); 792 793 if (this.getElementSettings('background_slideshow_gallery')) { 794 this.run(); 795 } 796 } 797 798 onDestroy() { 799 super.onDestroy(); 800 this.deactivate(); 801 } 802 803 onElementChange(propertyName) { 804 if ('background_background' === propertyName) { 805 this.run(); 806 } 807 } 808 809 } 810 811 exports.default = BackgroundSlideshow; 812 813 /***/ }), 814 815 /***/ "../assets/dev/js/frontend/handlers/column.js": 816 /*!****************************************************!*\ 817 !*** ../assets/dev/js/frontend/handlers/column.js ***! 818 \****************************************************/ 819 /***/ ((__unused_webpack_module, exports, __webpack_require__) => { 820 821 "use strict"; 822 823 824 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); 825 826 Object.defineProperty(exports, "__esModule", ({ 827 value: true 828 })); 829 exports.default = void 0; 830 831 var _backgroundSlideshow = _interopRequireDefault(__webpack_require__(/*! ./background-slideshow */ "../assets/dev/js/frontend/handlers/background-slideshow.js")); 832 833 var _default = [_backgroundSlideshow.default]; 834 exports.default = _default; 835 836 /***/ }), 837 838 /***/ "../assets/dev/js/frontend/handlers/global.js": 839 /*!****************************************************!*\ 840 !*** ../assets/dev/js/frontend/handlers/global.js ***! 841 \****************************************************/ 842 /***/ ((__unused_webpack_module, exports) => { 843 844 "use strict"; 845 846 847 Object.defineProperty(exports, "__esModule", ({ 848 value: true 849 })); 850 exports.default = void 0; 851 852 class GlobalHandler extends elementorModules.frontend.handlers.Base { 853 getWidgetType() { 854 return 'global'; 855 } 856 857 animate() { 858 const $element = this.$element, 859 animation = this.getAnimation(); 860 861 if ('none' === animation) { 862 $element.removeClass('elementor-invisible'); 863 return; 864 } 865 866 const elementSettings = this.getElementSettings(), 867 animationDelay = elementSettings._animation_delay || elementSettings.animation_delay || 0; 868 $element.removeClass(animation); 869 870 if (this.currentAnimation) { 871 $element.removeClass(this.currentAnimation); 872 } 873 874 this.currentAnimation = animation; 875 setTimeout(() => { 876 $element.removeClass('elementor-invisible').addClass('animated ' + animation); 877 }, animationDelay); 878 } 879 880 getAnimation() { 881 return this.getCurrentDeviceSetting('animation') || this.getCurrentDeviceSetting('_animation'); 882 } 883 884 onInit(...args) { 885 super.onInit(...args); 886 887 if (this.getAnimation()) { 888 const observer = elementorModules.utils.Scroll.scrollObserver({ 889 callback: event => { 890 if (event.isInViewport) { 891 this.animate(); 892 observer.unobserve(this.$element[0]); 893 } 894 } 895 }); 896 observer.observe(this.$element[0]); 897 } 898 } 899 900 onElementChange(propertyName) { 901 if (/^_?animation/.test(propertyName)) { 902 this.animate(); 903 } 904 } 905 906 } 907 908 var _default = $scope => { 909 elementorFrontend.elementsHandler.addHandler(GlobalHandler, { 910 $element: $scope 911 }); 912 }; 913 914 exports.default = _default; 915 916 /***/ }), 917 918 /***/ "../assets/dev/js/frontend/handlers/section/background-video.js": 919 /*!**********************************************************************!*\ 920 !*** ../assets/dev/js/frontend/handlers/section/background-video.js ***! 921 \**********************************************************************/ 922 /***/ ((__unused_webpack_module, exports) => { 923 924 "use strict"; 925 926 927 Object.defineProperty(exports, "__esModule", ({ 928 value: true 929 })); 930 exports.default = void 0; 931 932 class BackgroundVideo extends elementorModules.frontend.handlers.Base { 933 getDefaultSettings() { 934 return { 935 selectors: { 936 backgroundVideoContainer: '.elementor-background-video-container', 937 backgroundVideoEmbed: '.elementor-background-video-embed', 938 backgroundVideoHosted: '.elementor-background-video-hosted' 939 } 940 }; 941 } 942 943 getDefaultElements() { 944 const selectors = this.getSettings('selectors'), 945 elements = { 946 $backgroundVideoContainer: this.$element.find(selectors.backgroundVideoContainer) 947 }; 948 elements.$backgroundVideoEmbed = elements.$backgroundVideoContainer.children(selectors.backgroundVideoEmbed); 949 elements.$backgroundVideoHosted = elements.$backgroundVideoContainer.children(selectors.backgroundVideoHosted); 950 return elements; 951 } 952 953 calcVideosSize($video) { 954 let aspectRatioSetting = '16:9'; 955 956 if ('vimeo' === this.videoType) { 957 aspectRatioSetting = $video[0].width + ':' + $video[0].height; 958 } 959 960 const containerWidth = this.elements.$backgroundVideoContainer.outerWidth(), 961 containerHeight = this.elements.$backgroundVideoContainer.outerHeight(), 962 aspectRatioArray = aspectRatioSetting.split(':'), 963 aspectRatio = aspectRatioArray[0] / aspectRatioArray[1], 964 ratioWidth = containerWidth / aspectRatio, 965 ratioHeight = containerHeight * aspectRatio, 966 isWidthFixed = containerWidth / containerHeight > aspectRatio; 967 return { 968 width: isWidthFixed ? containerWidth : ratioHeight, 969 height: isWidthFixed ? ratioWidth : containerHeight 970 }; 971 } 972 973 changeVideoSize() { 974 if (!('hosted' === this.videoType) && !this.player) { 975 return; 976 } 977 978 let $video; 979 980 if ('youtube' === this.videoType) { 981 $video = jQuery(this.player.getIframe()); 982 } else if ('vimeo' === this.videoType) { 983 $video = jQuery(this.player.element); 984 } else if ('hosted' === this.videoType) { 985 $video = this.elements.$backgroundVideoHosted; 986 } 987 988 if (!$video) { 989 return; 990 } 991 992 const size = this.calcVideosSize($video); 993 $video.width(size.width).height(size.height); 994 } 995 996 startVideoLoop(firstTime) { 997 // If the section has been removed 998 if (!this.player.getIframe().contentWindow) { 999 return; 1000 } 1001 1002 const elementSettings = this.getElementSettings(), 1003 startPoint = elementSettings.background_video_start || 0, 1004 endPoint = elementSettings.background_video_end; 1005 1006 if (elementSettings.background_play_once && !firstTime) { 1007 this.player.stopVideo(); 1008 return; 1009 } 1010 1011 this.player.seekTo(startPoint); 1012 1013 if (endPoint) { 1014 const durationToEnd = endPoint - startPoint + 1; 1015 setTimeout(() => { 1016 this.startVideoLoop(false); 1017 }, durationToEnd * 1000); 1018 } 1019 } 1020 1021 prepareVimeoVideo(Vimeo, videoId) { 1022 const elementSettings = this.getElementSettings(), 1023 startTime = elementSettings.background_video_start ? elementSettings.background_video_start : 0, 1024 videoSize = this.elements.$backgroundVideoContainer.outerWidth(), 1025 vimeoOptions = { 1026 id: videoId, 1027 width: videoSize.width, 1028 autoplay: true, 1029 loop: !elementSettings.background_play_once, 1030 transparent: false, 1031 background: true, 1032 muted: true 1033 }; 1034 this.player = new Vimeo.Player(this.elements.$backgroundVideoContainer, vimeoOptions); // Handle user-defined start/end times 1035 1036 this.handleVimeoStartEndTimes(elementSettings); 1037 this.player.ready().then(() => { 1038 jQuery(this.player.element).addClass('elementor-background-video-embed'); 1039 this.changeVideoSize(); 1040 }); 1041 } 1042 1043 handleVimeoStartEndTimes(elementSettings) { 1044 // If a start time is defined, set the start time 1045 if (elementSettings.background_video_start) { 1046 this.player.on('play', data => { 1047 if (0 === data.seconds) { 1048 this.player.setCurrentTime(elementSettings.background_video_start); 1049 } 1050 }); 1051 } 1052 1053 this.player.on('timeupdate', data => { 1054 // If an end time is defined, handle ending the video 1055 if (elementSettings.background_video_end && elementSettings.background_video_end < data.seconds) { 1056 if (elementSettings.background_play_once) { 1057 // Stop at user-defined end time if not loop 1058 this.player.pause(); 1059 } else { 1060 // Go to start time if loop 1061 this.player.setCurrentTime(elementSettings.background_video_start); 1062 } 1063 } // If start time is defined but an end time is not, go to user-defined start time at video end. 1064 // Vimeo JS API has an 'ended' event, but it never fires when infinite loop is defined, so we 1065 // get the video duration (returns a promise) then use duration-0.5s as end time 1066 1067 1068 this.player.getDuration().then(duration => { 1069 if (elementSettings.background_video_start && !elementSettings.background_video_end && data.seconds > duration - 0.5) { 1070 this.player.setCurrentTime(elementSettings.background_video_start); 1071 } 1072 }); 1073 }); 1074 } 1075 1076 prepareYTVideo(YT, videoID) { 1077 const $backgroundVideoContainer = this.elements.$backgroundVideoContainer, 1078 elementSettings = this.getElementSettings(); 1079 let startStateCode = YT.PlayerState.PLAYING; // Since version 67, Chrome doesn't fire the `PLAYING` state at start time 1080 1081 if (window.chrome) { 1082 startStateCode = YT.PlayerState.UNSTARTED; 1083 } 1084 1085 const playerOptions = { 1086 videoId: videoID, 1087 events: { 1088 onReady: () => { 1089 this.player.mute(); 1090 this.changeVideoSize(); 1091 this.startVideoLoop(true); 1092 this.player.playVideo(); 1093 }, 1094 onStateChange: event => { 1095 switch (event.data) { 1096 case startStateCode: 1097 $backgroundVideoContainer.removeClass('elementor-invisible elementor-loading'); 1098 break; 1099 1100 case YT.PlayerState.ENDED: 1101 this.player.seekTo(elementSettings.background_video_start || 0); 1102 1103 if (elementSettings.background_play_once) { 1104 this.player.destroy(); 1105 } 1106 1107 } 1108 } 1109 }, 1110 playerVars: { 1111 controls: 0, 1112 rel: 0, 1113 playsinline: 1 1114 } 1115 }; // To handle CORS issues, when the default host is changed, the origin parameter has to be set. 1116 1117 if (elementSettings.background_privacy_mode) { 1118 playerOptions.host = 'https://www.youtube-nocookie.com'; 1119 playerOptions.origin = window.location.hostname; 1120 } 1121 1122 $backgroundVideoContainer.addClass('elementor-loading elementor-invisible'); 1123 this.player = new YT.Player(this.elements.$backgroundVideoEmbed[0], playerOptions); 1124 } 1125 1126 activate() { 1127 let videoLink = this.getElementSettings('background_video_link'), 1128 videoID; 1129 const playOnce = this.getElementSettings('background_play_once'); 1130 1131 if (-1 !== videoLink.indexOf('vimeo.com')) { 1132 this.videoType = 'vimeo'; 1133 this.apiProvider = elementorFrontend.utils.vimeo; 1134 } else if (videoLink.match(/^(?:https?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com)/)) { 1135 this.videoType = 'youtube'; 1136 this.apiProvider = elementorFrontend.utils.youtube; 1137 } 1138 1139 if (this.apiProvider) { 1140 videoID = this.apiProvider.getVideoIDFromURL(videoLink); 1141 this.apiProvider.onApiReady(apiObject => { 1142 if ('youtube' === this.videoType) { 1143 this.prepareYTVideo(apiObject, videoID); 1144 } 1145 1146 if ('vimeo' === this.videoType) { 1147 this.prepareVimeoVideo(apiObject, videoID); 1148 } 1149 }); 1150 } else { 1151 this.videoType = 'hosted'; 1152 const startTime = this.getElementSettings('background_video_start'), 1153 endTime = this.getElementSettings('background_video_end'); 1154 1155 if (startTime || endTime) { 1156 videoLink += '#t=' + (startTime || 0) + (endTime ? ',' + endTime : ''); 1157 } 1158 1159 this.elements.$backgroundVideoHosted.attr('src', videoLink).one('canplay', this.changeVideoSize.bind(this)); 1160 1161 if (playOnce) { 1162 this.elements.$backgroundVideoHosted.on('ended', () => { 1163 this.elements.$backgroundVideoHosted.hide(); 1164 }); 1165 } 1166 } 1167 1168 elementorFrontend.elements.$window.on('resize', this.changeVideoSize); 1169 } 1170 1171 deactivate() { 1172 if ('youtube' === this.videoType && this.player.getIframe() || 'vimeo' === this.videoType) { 1173 this.player.destroy(); 1174 } else { 1175 this.elements.$backgroundVideoHosted.removeAttr('src').off('ended'); 1176 } 1177 1178 elementorFrontend.elements.$window.off('resize', this.changeVideoSize); 1179 } 1180 1181 run() { 1182 const elementSettings = this.getElementSettings(); 1183 1184 if (!elementSettings.background_play_on_mobile && 'mobile' === elementorFrontend.getCurrentDeviceMode()) { 1185 return; 1186 } 1187 1188 if ('video' === elementSettings.background_background && elementSettings.background_video_link) { 1189 this.activate(); 1190 } else { 1191 this.deactivate(); 1192 } 1193 } 1194 1195 onInit(...args) { 1196 super.onInit(...args); 1197 this.changeVideoSize = this.changeVideoSize.bind(this); 1198 this.run(); 1199 } 1200 1201 onElementChange(propertyName) { 1202 if ('background_background' === propertyName) { 1203 this.run(); 1204 } 1205 } 1206 1207 } 1208 1209 exports.default = BackgroundVideo; 1210 1211 /***/ }), 1212 1213 /***/ "../assets/dev/js/frontend/handlers/section/handles-position.js": 1214 /*!**********************************************************************!*\ 1215 !*** ../assets/dev/js/frontend/handlers/section/handles-position.js ***! 1216 \**********************************************************************/ 1217 /***/ ((__unused_webpack_module, exports) => { 1218 1219 "use strict"; 1220 1221 1222 Object.defineProperty(exports, "__esModule", ({ 1223 value: true 1224 })); 1225 exports.default = void 0; 1226 1227 class HandlesPosition extends elementorModules.frontend.handlers.Base { 1228 isActive() { 1229 return elementorFrontend.isEditMode(); 1230 } 1231 1232 isFirstSection() { 1233 return this.$element[0] === document.querySelector('.elementor-edit-mode .elementor-top-section'); 1234 } 1235 1236 isOverflowHidden() { 1237 return 'hidden' === this.$element.css('overflow'); 1238 } 1239 1240 getOffset() { 1241 if ('body' === elementor.config.document.container) { 1242 return this.$element.offset().top; 1243 } 1244 1245 const $container = jQuery(elementor.config.document.container); 1246 return this.$element.offset().top - $container.offset().top; 1247 } 1248 1249 setHandlesPosition() { 1250 const document = elementor.documents.getCurrent(); 1251 1252 if (!document || !document.container.isEditable()) { 1253 return; 1254 } 1255 1256 const isOverflowHidden = this.isOverflowHidden(); 1257 1258 if (!isOverflowHidden && !this.isFirstSection()) { 1259 return; 1260 } 1261 1262 const offset = isOverflowHidden ? 0 : this.getOffset(), 1263 $handlesElement = this.$element.find('> .elementor-element-overlay > .elementor-editor-section-settings'), 1264 insideHandleClass = 'elementor-section--handles-inside'; 1265 1266 if (offset < 25) { 1267 this.$element.addClass(insideHandleClass); 1268 1269 if (offset < -5) { 1270 $handlesElement.css('top', -offset); 1271 } else { 1272 $handlesElement.css('top', ''); 1273 } 1274 } else { 1275 this.$element.removeClass(insideHandleClass); 1276 } 1277 } 1278 1279 onInit() { 1280 if (!this.isActive()) { 1281 return; 1282 } 1283 1284 this.setHandlesPosition(); 1285 this.$element.on('mouseenter', this.setHandlesPosition.bind(this)); 1286 } 1287 1288 } 1289 1290 exports.default = HandlesPosition; 1291 1292 /***/ }), 1293 1294 /***/ "../assets/dev/js/frontend/handlers/section/section.js": 1295 /*!*************************************************************!*\ 1296 !*** ../assets/dev/js/frontend/handlers/section/section.js ***! 1297 \*************************************************************/ 1298 /***/ ((__unused_webpack_module, exports, __webpack_require__) => { 1299 1300 "use strict"; 1301 1302 1303 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); 1304 1305 Object.defineProperty(exports, "__esModule", ({ 1306 value: true 1307 })); 1308 exports.default = void 0; 1309 1310 var _backgroundSlideshow = _interopRequireDefault(__webpack_require__(/*! ../background-slideshow */ "../assets/dev/js/frontend/handlers/background-slideshow.js")); 1311 1312 var _backgroundVideo = _interopRequireDefault(__webpack_require__(/*! ./background-video */ "../assets/dev/js/frontend/handlers/section/background-video.js")); 1313 1314 var _handlesPosition = _interopRequireDefault(__webpack_require__(/*! ./handles-position */ "../assets/dev/js/frontend/handlers/section/handles-position.js")); 1315 1316 var _stretchedSection = _interopRequireDefault(__webpack_require__(/*! ./stretched-section */ "../assets/dev/js/frontend/handlers/section/stretched-section.js")); 1317 1318 var _shapes = _interopRequireDefault(__webpack_require__(/*! ./shapes */ "../assets/dev/js/frontend/handlers/section/shapes.js")); 1319 1320 var _default = [_stretchedSection.default, // Must run before BackgroundSlideshow to init the slideshow only after the stretch. 1321 _backgroundSlideshow.default, _backgroundVideo.default, _handlesPosition.default, _shapes.default]; 1322 exports.default = _default; 1323 1324 /***/ }), 1325 1326 /***/ "../assets/dev/js/frontend/handlers/section/shapes.js": 1327 /*!************************************************************!*\ 1328 !*** ../assets/dev/js/frontend/handlers/section/shapes.js ***! 1329 \************************************************************/ 1330 /***/ ((__unused_webpack_module, exports) => { 1331 1332 "use strict"; 1333 1334 1335 Object.defineProperty(exports, "__esModule", ({ 1336 value: true 1337 })); 1338 exports.default = void 0; 1339 1340 class Shapes extends elementorModules.frontend.handlers.Base { 1341 getDefaultSettings() { 1342 return { 1343 selectors: { 1344 container: '> .elementor-shape-%s' 1345 }, 1346 svgURL: elementorFrontend.config.urls.assets + 'shapes/' 1347 }; 1348 } 1349 1350 getDefaultElements() { 1351 const elements = {}, 1352 selectors = this.getSettings('selectors'); 1353 elements.$topContainer = this.$element.find(selectors.container.replace('%s', 'top')); 1354 elements.$bottomContainer = this.$element.find(selectors.container.replace('%s', 'bottom')); 1355 return elements; 1356 } 1357 1358 isActive() { 1359 return elementorFrontend.isEditMode(); 1360 } 1361 1362 getSvgURL(shapeType, fileName) { 1363 let svgURL = this.getSettings('svgURL') + fileName + '.svg'; 1364 1365 if (elementor.config.additional_shapes && shapeType in elementor.config.additional_shapes) { 1366 svgURL = elementor.config.additional_shapes[shapeType]; 1367 1368 if (-1 < fileName.indexOf('-negative')) { 1369 svgURL = svgURL.replace('.svg', '-negative.svg'); 1370 } 1371 } 1372 1373 return svgURL; 1374 } 1375 1376 buildSVG(side) { 1377 const baseSettingKey = 'shape_divider_' + side, 1378 shapeType = this.getElementSettings(baseSettingKey), 1379 $svgContainer = this.elements['$' + side + 'Container']; 1380 $svgContainer.attr('data-shape', shapeType); 1381 1382 if (!shapeType) { 1383 $svgContainer.empty(); // Shape-divider set to 'none' 1384 1385 return; 1386 } 1387 1388 let fileName = shapeType; 1389 1390 if (this.getElementSettings(baseSettingKey + '_negative')) { 1391 fileName += '-negative'; 1392 } 1393 1394 const svgURL = this.getSvgURL(shapeType, fileName); 1395 jQuery.get(svgURL, data => { 1396 $svgContainer.empty().append(data.childNodes[0]); 1397 }); 1398 this.setNegative(side); 1399 } 1400 1401 setNegative(side) { 1402 this.elements['$' + side + 'Container'].attr('data-negative', !!this.getElementSettings('shape_divider_' + side + '_negative')); 1403 } 1404 1405 onInit(...args) { 1406 if (!this.isActive(this.getSettings())) { 1407 return; 1408 } 1409 1410 super.onInit(...args); 1411 ['top', 'bottom'].forEach(side => { 1412 if (this.getElementSettings('shape_divider_' + side)) { 1413 this.buildSVG(side); 1414 } 1415 }); 1416 } 1417 1418 onElementChange(propertyName) { 1419 const shapeChange = propertyName.match(/^shape_divider_(top|bottom)$/); 1420 1421 if (shapeChange) { 1422 this.buildSVG(shapeChange[1]); 1423 return; 1424 } 1425 1426 const negativeChange = propertyName.match(/^shape_divider_(top|bottom)_negative$/); 1427 1428 if (negativeChange) { 1429 this.buildSVG(negativeChange[1]); 1430 this.setNegative(negativeChange[1]); 1431 } 1432 } 1433 1434 } 1435 1436 exports.default = Shapes; 1437 1438 /***/ }), 1439 1440 /***/ "../assets/dev/js/frontend/handlers/section/stretched-section.js": 1441 /*!***********************************************************************!*\ 1442 !*** ../assets/dev/js/frontend/handlers/section/stretched-section.js ***! 1443 \***********************************************************************/ 1444 /***/ ((__unused_webpack_module, exports) => { 1445 1446 "use strict"; 1447 1448 1449 Object.defineProperty(exports, "__esModule", ({ 1450 value: true 1451 })); 1452 exports.default = void 0; 1453 1454 class StretchedSection extends elementorModules.frontend.handlers.Base { 1455 bindEvents() { 1456 const handlerID = this.getUniqueHandlerID(); 1457 elementorFrontend.addListenerOnce(handlerID, 'resize', this.stretch); 1458 elementorFrontend.addListenerOnce(handlerID, 'sticky:stick', this.stretch, this.$element); 1459 elementorFrontend.addListenerOnce(handlerID, 'sticky:unstick', this.stretch, this.$element); 1460 1461 if (elementorFrontend.isEditMode()) { 1462 this.onKitChangeStretchContainerChange = this.onKitChangeStretchContainerChange.bind(this); 1463 elementor.channels.editor.on('kit:change:stretchContainer', this.onKitChangeStretchContainerChange); 1464 } 1465 } 1466 1467 unbindEvents() { 1468 elementorFrontend.removeListeners(this.getUniqueHandlerID(), 'resize', this.stretch); 1469 1470 if (elementorFrontend.isEditMode()) { 1471 elementor.channels.editor.off('kit:change:stretchContainer', this.onKitChangeStretchContainerChange); 1472 } 1473 } 1474 1475 isActive(settings) { 1476 return elementorFrontend.isEditMode() || settings.$element.hasClass('elementor-section-stretched'); 1477 } 1478 1479 initStretch() { 1480 this.stretch = this.stretch.bind(this); 1481 this.stretchElement = new elementorModules.frontend.tools.StretchElement({ 1482 element: this.$element, 1483 selectors: { 1484 container: this.getStretchContainer() 1485 } 1486 }); 1487 } 1488 1489 getStretchContainer() { 1490 return elementorFrontend.getKitSettings('stretched_section_container') || window; 1491 } 1492 1493 stretch() { 1494 if (!this.getElementSettings('stretch_section')) { 1495 return; 1496 } 1497 1498 this.stretchElement.stretch(); 1499 } 1500 1501 onInit(...args) { 1502 if (!this.isActive(this.getSettings())) { 1503 return; 1504 } 1505 1506 this.initStretch(); 1507 super.onInit(...args); 1508 this.stretch(); 1509 } 1510 1511 onElementChange(propertyName) { 1512 if ('stretch_section' === propertyName) { 1513 if (this.getElementSettings('stretch_section')) { 1514 this.stretch(); 1515 } else { 1516 this.stretchElement.reset(); 1517 } 1518 } 1519 } 1520 1521 onKitChangeStretchContainerChange() { 1522 this.stretchElement.setSettings('selectors.container', this.getStretchContainer()); 1523 this.stretch(); 1524 } 1525 1526 } 1527 1528 exports.default = StretchedSection; 1529 1530 /***/ }), 1531 1532 /***/ "../assets/dev/js/frontend/utils/anchors.js": 1533 /*!**************************************************!*\ 1534 !*** ../assets/dev/js/frontend/utils/anchors.js ***! 1535 \**************************************************/ 1536 /***/ ((module) => { 1537 1538 "use strict"; 1539 1540 1541 module.exports = elementorModules.ViewModule.extend({ 1542 getDefaultSettings: function () { 1543 return { 1544 scrollDuration: 500, 1545 selectors: { 1546 links: 'a[href*="#"]', 1547 targets: '.elementor-element, .elementor-menu-anchor', 1548 scrollable: 'html, body' 1549 } 1550 }; 1551 }, 1552 getDefaultElements: function () { 1553 var $ = jQuery, 1554 selectors = this.getSettings('selectors'); 1555 return { 1556 $scrollable: $(selectors.scrollable) 1557 }; 1558 }, 1559 bindEvents: function () { 1560 elementorFrontend.elements.$document.on('click', this.getSettings('selectors.links'), this.handleAnchorLinks); 1561 }, 1562 handleAnchorLinks: function (event) { 1563 var clickedLink = event.currentTarget, 1564 isSamePathname = location.pathname === clickedLink.pathname, 1565 isSameHostname = location.hostname === clickedLink.hostname, 1566 $anchor; 1567 1568 if (!isSameHostname || !isSamePathname || clickedLink.hash.length < 2) { 1569 return; 1570 } 1571 1572 try { 1573 $anchor = jQuery(clickedLink.hash).filter(this.getSettings('selectors.targets')); 1574 } catch (e) { 1575 return; 1576 } 1577 1578 if (!$anchor.length) { 1579 return; 1580 } 1581 1582 var scrollTop = $anchor.offset().top, 1583 $wpAdminBar = elementorFrontend.elements.$wpAdminBar, 1584 $activeStickies = jQuery('.elementor-section.elementor-sticky--active:visible'), 1585 maxStickyHeight = 0; 1586 1587 if ($wpAdminBar.length > 0) { 1588 scrollTop -= $wpAdminBar.height(); 1589 } // Offset height of tallest sticky 1590 1591 1592 if ($activeStickies.length > 0) { 1593 maxStickyHeight = Math.max.apply(null, $activeStickies.map(function () { 1594 return jQuery(this).outerHeight(); 1595 }).get()); 1596 scrollTop -= maxStickyHeight; 1597 } 1598 1599 event.preventDefault(); 1600 scrollTop = elementorFrontend.hooks.applyFilters('frontend/handlers/menu_anchor/scroll_top_distance', scrollTop); 1601 this.elements.$scrollable.animate({ 1602 scrollTop: scrollTop 1603 }, this.getSettings('scrollDuration'), 'linear'); 1604 }, 1605 onInit: function () { 1606 elementorModules.ViewModule.prototype.onInit.apply(this, arguments); 1607 this.bindEvents(); 1608 } 1609 }); 1610 1611 /***/ }), 1612 1613 /***/ "../assets/dev/js/frontend/utils/assets-loader.js": 1614 /*!********************************************************!*\ 1615 !*** ../assets/dev/js/frontend/utils/assets-loader.js ***! 1616 \********************************************************/ 1617 /***/ ((__unused_webpack_module, exports) => { 1618 1619 "use strict"; 1620 1621 1622 Object.defineProperty(exports, "__esModule", ({ 1623 value: true 1624 })); 1625 exports.default = void 0; 1626 1627 class AssetsLoader { 1628 getScriptElement(src) { 1629 const scriptElement = document.createElement('script'); 1630 scriptElement.src = src; 1631 return scriptElement; 1632 } 1633 1634 getStyleElement(src) { 1635 const styleElement = document.createElement('link'); 1636 styleElement.rel = 'stylesheet'; 1637 styleElement.href = src; 1638 return styleElement; 1639 } 1640 1641 load(type, key) { 1642 const assetData = AssetsLoader.assets[type][key]; 1643 1644 if (!assetData.loader) { 1645 assetData.loader = new Promise(resolve => { 1646 const element = 'style' === type ? this.getStyleElement(assetData.src) : this.getScriptElement(assetData.src); 1647 1648 element.onload = () => resolve(true); 1649 1650 const parent = 'head' === assetData.parent ? assetData.parent : 'body'; 1651 document[parent].appendChild(element); 1652 }); 1653 } 1654 1655 return assetData.loader; 1656 } 1657 1658 } 1659 1660 exports.default = AssetsLoader; 1661 const fileSuffix = elementorFrontendConfig.environmentMode.isScriptDebug ? '' : '.min'; 1662 AssetsLoader.assets = { 1663 script: { 1664 dialog: { 1665 src: `${elementorFrontendConfig.urls.assets}lib/dialog/dialog${fileSuffix}.js?ver=4.8.1` 1666 }, 1667 'share-link': { 1668 src: `${elementorFrontendConfig.urls.assets}lib/share-link/share-link${fileSuffix}.js?ver=${elementorFrontendConfig.version}` 1669 }, 1670 swiper: { 1671 src: `${elementorFrontendConfig.urls.assets}lib/swiper/swiper${fileSuffix}.js?ver=5.3.6` 1672 } 1673 }, 1674 style: {} 1675 }; 1676 1677 /***/ }), 1678 1679 /***/ "../assets/dev/js/frontend/utils/lightbox/lightbox-manager.js": 1680 /*!********************************************************************!*\ 1681 !*** ../assets/dev/js/frontend/utils/lightbox/lightbox-manager.js ***! 1682 \********************************************************************/ 1683 /***/ ((__unused_webpack_module, exports, __webpack_require__) => { 1684 1685 "use strict"; 1686 1687 1688 Object.defineProperty(exports, "__esModule", ({ 1689 value: true 1690 })); 1691 exports.default = void 0; 1692 1693 class LightboxManager extends elementorModules.ViewModule { 1694 static getLightbox() { 1695 const lightboxPromise = new Promise(resolveLightbox => { 1696 __webpack_require__.e(/*! import() | lightbox */ "lightbox").then(__webpack_require__.t.bind(__webpack_require__, /*! elementor-frontend/utils/lightbox/lightbox */ "../assets/dev/js/frontend/utils/lightbox/lightbox.js", 23)).then(({ 1697 default: LightboxModule 1698 }) => resolveLightbox(new LightboxModule())); 1699 }), 1700 dialogPromise = elementorFrontend.utils.assetsLoader.load('script', 'dialog'), 1701 shareLinkPromise = elementorFrontend.utils.assetsLoader.load('script', 'share-link'); 1702 return Promise.all([lightboxPromise, dialogPromise, shareLinkPromise]).then(() => lightboxPromise); 1703 } 1704 1705 getDefaultSettings() { 1706 return { 1707 selectors: { 1708 links: 'a, [data-elementor-lightbox]' 1709 } 1710 }; 1711 } 1712 1713 getDefaultElements() { 1714 return { 1715 $links: jQuery(this.getSettings('selectors.links')) 1716 }; 1717 } 1718 1719 isLightboxLink(element) { 1720 // Check for lowercase `a` to make sure it works also for links inside SVGs. 1721 if ('a' === element.tagName.toLowerCase() && (element.hasAttribute('download') || !/^[^?]+\.(png|jpe?g|gif|svg|webp)(\?.*)?$/i.test(element.href)) && !element.dataset.elementorLightboxVideo) { 1722 return false; 1723 } 1724 1725 const generalOpenInLightbox = elementorFrontend.getKitSettings('global_image_lightbox'), 1726 currentLinkOpenInLightbox = element.dataset.elementorOpenLightbox; 1727 return 'yes' === currentLinkOpenInLightbox || generalOpenInLightbox && 'no' !== currentLinkOpenInLightbox; 1728 } 1729 1730 async onLinkClick(event) { 1731 const element = event.currentTarget, 1732 $target = jQuery(event.target), 1733 editMode = elementorFrontend.isEditMode(), 1734 isColorPickingMode = editMode && elementor.$previewContents.find('body').hasClass('elementor-editor__ui-state__color-picker'), 1735 isClickInsideElementor = !!$target.closest('.elementor-edit-area').length; 1736 1737 if (!this.isLightboxLink(element)) { 1738 if (editMode && isClickInsideElementor) { 1739 event.preventDefault(); 1740 } 1741 1742 return; 1743 } 1744 1745 event.preventDefault(); 1746 1747 if (editMode && !elementor.getPreferences('lightbox_in_editor')) { 1748 return; 1749 } // Disable lightbox on color picking mode. 1750 1751 1752 if (isColorPickingMode) { 1753 return; 1754 } 1755 1756 const lightbox = this.isOptimizedAssetsLoading() ? await LightboxManager.getLightbox() : elementorFrontend.utils.lightbox; 1757 lightbox.createLightbox(element); 1758 } 1759 1760 isOptimizedAssetsLoading() { 1761 return elementorFrontend.config.experimentalFeatures.e_optimized_assets_loading; 1762 } 1763 1764 bindEvents() { 1765 elementorFrontend.elements.$document.on('click', this.getSettings('selectors.links'), event => this.onLinkClick(event)); 1766 } 1767 1768 onInit(...args) { 1769 super.onInit(...args); 1770 1771 if (!this.isOptimizedAssetsLoading() || elementorFrontend.isEditMode()) { 1772 return; 1773 } // Detecting lightbox links on init will reduce the time of waiting to the lightbox to be display on slow connections. 1774 1775 1776 this.elements.$links.each((index, element) => { 1777 if (this.isLightboxLink(element)) { 1778 LightboxManager.getLightbox(); // Breaking the iteration when the library loading has already been triggered. 1779 1780 return false; 1781 } 1782 }); 1783 } 1784 1785 } 1786 1787 exports.default = LightboxManager; 1788 1789 /***/ }), 1790 1791 /***/ "../assets/dev/js/frontend/utils/swiper-bc.js": 1792 /*!****************************************************!*\ 1793 !*** ../assets/dev/js/frontend/utils/swiper-bc.js ***! 1794 \****************************************************/ 1795 /***/ ((__unused_webpack_module, exports) => { 1796 1797 "use strict"; 1798 1799 1800 Object.defineProperty(exports, "__esModule", ({ 1801 value: true 1802 })); 1803 exports.default = void 0; 1804 1805 class SwiperBC { 1806 constructor(container, config) { 1807 this.config = config; 1808 1809 if (this.config.breakpoints) { 1810 // The config is passed as a param to allow adjustConfig to be called outside of this wrapper 1811 this.config = this.adjustConfig(config); 1812 } // In case of a legacy behaviour the constructor should return a new Swiper instance instead of a Promise. 1813 1814 1815 if (config.legacy) { 1816 return this.createSwiperInstance(container, this.config); 1817 } 1818 1819 return new Promise(resolve => { 1820 if (!elementorFrontend.config.experimentalFeatures.e_optimized_assets_loading) { 1821 return resolve(this.createSwiperInstance(container, this.config)); 1822 } 1823 1824 elementorFrontend.utils.assetsLoader.load('script', 'swiper').then(() => resolve(this.createSwiperInstance(container, this.config))); 1825 }); 1826 } 1827 1828 createSwiperInstance(container, config) { 1829 // The condition should run only once to prevent an additional overwrite of the SwiperSource. 1830 if (!SwiperBC.isSwiperLoaded && elementorFrontend.config.experimentalFeatures.e_optimized_assets_loading) { 1831 SwiperSource = window.Swiper; 1832 SwiperBC.isSwiperLoaded = true; // Once the SwiperSource has the Swiper lib function, we need to overwrite window.Swiper with the legacySwiper class. 1833 1834 legacySwiper(); 1835 } 1836 1837 SwiperSource.prototype.adjustConfig = this.adjustConfig; 1838 return new SwiperSource(container, config); 1839 } // Backwards compatibility for Elementor Pro <2.9.0 (old Swiper version - <5.0.0) 1840 // In Swiper 5.0.0 and up, breakpoints changed from acting as max-width to acting as min-width 1841 1842 1843 adjustConfig(config) { 1844 // Only reverse the breakpoints if the handle param has been defined 1845 if (!config.handleElementorBreakpoints) { 1846 return config; 1847 } 1848 1849 const elementorBreakpoints = elementorFrontend.config.responsive.activeBreakpoints, 1850 elementorBreakpointValues = elementorFrontend.breakpoints.getBreakpointValues(); 1851 Object.keys(config.breakpoints).forEach(configBPKey => { 1852 const configBPKeyInt = parseInt(configBPKey); 1853 let breakpointToUpdate; // The `configBPKeyInt + 1` is a BC Fix for Elementor Pro Carousels from 2.8.0-2.8.3 used with Elementor >= 2.9.0 1854 1855 if (configBPKeyInt === elementorBreakpoints.mobile.value || configBPKeyInt + 1 === elementorBreakpoints.mobile.value) { 1856 // This handles the mobile breakpoint. Elementor's default sm breakpoint is never actually used, 1857 // so the mobile breakpoint (md) needs to be handled separately and set to the 0 breakpoint (xs) 1858 breakpointToUpdate = 0; 1859 } else if (elementorBreakpoints.widescreen && (configBPKeyInt === elementorBreakpoints.widescreen.value || configBPKeyInt + 1 === elementorBreakpoints.widescreen.value)) { 1860 // Widescreen is a min-width breakpoint. Since in Swiper >5.0 the breakpoint system is min-width based, 1861 // the value we pass to the Swiper instance in this case is the breakpoint from the user, unchanged. 1862 breakpointToUpdate = configBPKeyInt; 1863 } else { 1864 // Find the index of the current config breakpoint in the Elementor Breakpoints array 1865 const currentBPIndexInElementorBPs = elementorBreakpointValues.findIndex(elementorBP => { 1866 // BC Fix for Elementor Pro Carousels from 2.8.0-2.8.3 used with Elementor >= 2.9.0 1867 return configBPKeyInt === elementorBP || configBPKeyInt + 1 === elementorBP; 1868 }); // For all other Swiper config breakpoints, move them one breakpoint down on the breakpoint list, 1869 // according to the array of Elementor's global breakpoints 1870 1871 breakpointToUpdate = elementorBreakpointValues[currentBPIndexInElementorBPs - 1]; 1872 } 1873 1874 config.breakpoints[breakpointToUpdate] = config.breakpoints[configBPKey]; // Then reset the settings in the original breakpoint key to the default values 1875 1876 config.breakpoints[configBPKey] = { 1877 slidesPerView: config.slidesPerView, 1878 slidesPerGroup: config.slidesPerGroup ? config.slidesPerGroup : 1 1879 }; 1880 }); 1881 return config; 1882 } 1883 1884 } // The following code is needed to support Pro version < 3.1.0. 1885 1886 1887 exports.default = SwiperBC; 1888 SwiperBC.isSwiperLoaded = false; // In the legacy behavior, window.Swiper was a class that returns an instance of the Swiper lib function after config adjustments. 1889 1890 function legacySwiper() { 1891 window.Swiper = class { 1892 constructor(container, config) { 1893 config.legacy = true; 1894 return new SwiperBC(container, config); 1895 } 1896 1897 }; 1898 } 1899 1900 let SwiperSource = window.Swiper; // In case that the Swiper lib exists (meaning not in optimized mode) we overwrite the window.Swiper with a class that supports legacy behavior. 1901 1902 if (SwiperSource) { 1903 legacySwiper(); 1904 } 1905 1906 /***/ }), 1907 1908 /***/ "../assets/dev/js/frontend/utils/url-actions.js": 1909 /*!******************************************************!*\ 1910 !*** ../assets/dev/js/frontend/utils/url-actions.js ***! 1911 \******************************************************/ 1912 /***/ ((__unused_webpack_module, exports) => { 1913 1914 "use strict"; 1915 1916 1917 Object.defineProperty(exports, "__esModule", ({ 1918 value: true 1919 })); 1920 exports.default = void 0; 1921 1922 class _default extends elementorModules.ViewModule { 1923 getDefaultSettings() { 1924 return { 1925 selectors: { 1926 links: 'a[href^="%23elementor-action"], a[href^="#elementor-action"]' 1927 } 1928 }; 1929 } 1930 1931 bindEvents() { 1932 elementorFrontend.elements.$document.on('click', this.getSettings('selectors.links'), this.runLinkAction.bind(this)); 1933 } 1934 1935 initActions() { 1936 this.actions = { 1937 lightbox: async settings => { 1938 const lightbox = await elementorFrontend.utils.lightbox; 1939 1940 if (settings.id) { 1941 lightbox.openSlideshow(settings.id, settings.url); 1942 } else { 1943 lightbox.showModal(settings); 1944 } 1945 } 1946 }; 1947 } 1948 1949 addAction(name, callback) { 1950 this.actions[name] = callback; 1951 } 1952 1953 runAction(url, ...restArgs) { 1954 url = decodeURIComponent(url); 1955 const actionMatch = url.match(/action=(.+?)&/), 1956 settingsMatch = url.match(/settings=(.+)/); 1957 1958 if (!actionMatch) { 1959 return; 1960 } 1961 1962 const action = this.actions[actionMatch[1]]; 1963 1964 if (!action) { 1965 return; 1966 } 1967 1968 let settings = {}; 1969 1970 if (settingsMatch) { 1971 settings = JSON.parse(atob(settingsMatch[1])); 1972 } 1973 1974 action(settings, ...restArgs); 1975 } 1976 1977 runLinkAction(event) { 1978 event.preventDefault(); 1979 this.runAction(jQuery(event.currentTarget).attr('href'), event); 1980 } 1981 1982 runHashAction() { 1983 if (location.hash) { 1984 this.runAction(location.hash); 1985 } 1986 } 1987 1988 createActionHash(action, settings) { 1989 // We need to encode the hash tag (#) here, in order to support share links for a variety of providers 1990 return encodeURIComponent(`#elementor-action:action=${action}&settings=${btoa(JSON.stringify(settings))}`); 1991 } 1992 1993 onInit() { 1994 super.onInit(); 1995 this.initActions(); 1996 elementorFrontend.on('components:init', this.runHashAction.bind(this)); 1997 } 1998 1999 } 2000 2001 exports.default = _default; 2002 2003 /***/ }), 2004 2005 /***/ "../assets/dev/js/frontend/utils/utils.js": 2006 /*!************************************************!*\ 2007 !*** ../assets/dev/js/frontend/utils/utils.js ***! 2008 \************************************************/ 2009 /***/ ((__unused_webpack_module, exports) => { 2010 2011 "use strict"; 2012 2013 2014 Object.defineProperty(exports, "__esModule", ({ 2015 value: true 2016 })); 2017 exports.escapeHTML = void 0; 2018 2019 // Escape HTML special chars to prevent XSS. 2020 const escapeHTML = str => { 2021 const specialChars = { 2022 '&': '&', 2023 '<': '<', 2024 '>': '>', 2025 "'": ''', 2026 '"': '"' 2027 }; 2028 return str.replace(/[&<>'"]/g, tag => specialChars[tag] || tag); 2029 }; 2030 2031 exports.escapeHTML = escapeHTML; 2032 2033 /***/ }), 2034 2035 /***/ "../assets/dev/js/frontend/utils/video-api/base-loader.js": 2036 /*!****************************************************************!*\ 2037 !*** ../assets/dev/js/frontend/utils/video-api/base-loader.js ***! 2038 \****************************************************************/ 2039 /***/ ((__unused_webpack_module, exports) => { 2040 2041 "use strict"; 2042 2043 2044 Object.defineProperty(exports, "__esModule", ({ 2045 value: true 2046 })); 2047 exports.default = void 0; 2048 2049 class BaseLoader extends elementorModules.ViewModule { 2050 getDefaultSettings() { 2051 return { 2052 isInserted: false, 2053 selectors: { 2054 firstScript: 'script:first' 2055 } 2056 }; 2057 } 2058 2059 getDefaultElements() { 2060 return { 2061 $firstScript: jQuery(this.getSettings('selectors.firstScript')) 2062 }; 2063 } 2064 2065 insertAPI() { 2066 this.elements.$firstScript.before(jQuery('<script>', { 2067 src: this.getApiURL() 2068 })); 2069 this.setSettings('isInserted', true); 2070 } 2071 2072 getVideoIDFromURL(url) { 2073 const videoIDParts = url.match(this.getURLRegex()); 2074 return videoIDParts && videoIDParts[1]; 2075 } 2076 2077 onApiReady(callback) { 2078 if (!this.getSettings('isInserted')) { 2079 this.insertAPI(); 2080 } 2081 2082 if (this.isApiLoaded()) { 2083 callback(this.getApiObject()); 2084 } else { 2085 // If not ready check again by timeout.. 2086 setTimeout(() => { 2087 this.onApiReady(callback); 2088 }, 350); 2089 } 2090 } 2091 2092 getAutoplayURL(videoURL) { 2093 return videoURL.replace('&autoplay=0', '') + '&autoplay=1'; 2094 } 2095 2096 } 2097 2098 exports.default = BaseLoader; 2099 2100 /***/ }), 2101 2102 /***/ "../assets/dev/js/frontend/utils/video-api/vimeo-loader.js": 2103 /*!*****************************************************************!*\ 2104 !*** ../assets/dev/js/frontend/utils/video-api/vimeo-loader.js ***! 2105 \*****************************************************************/ 2106 /***/ ((__unused_webpack_module, exports, __webpack_require__) => { 2107 2108 "use strict"; 2109 2110 2111 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); 2112 2113 Object.defineProperty(exports, "__esModule", ({ 2114 value: true 2115 })); 2116 exports.default = void 0; 2117 2118 var _baseLoader = _interopRequireDefault(__webpack_require__(/*! ./base-loader */ "../assets/dev/js/frontend/utils/video-api/base-loader.js")); 2119 2120 class VimeoLoader extends _baseLoader.default { 2121 getApiURL() { 2122 return 'https://player.vimeo.com/api/player.js'; 2123 } 2124 2125 getURLRegex() { 2126 return /^(?:https?:\/\/)?(?:www|player\.)?(?:vimeo\.com\/)?(?:video\/|external\/)?(\d+)([^.?&#"'>]?)/; 2127 } 2128 2129 isApiLoaded() { 2130 return window.Vimeo; 2131 } 2132 2133 getApiObject() { 2134 return Vimeo; 2135 } 2136 2137 getAutoplayURL(videoURL) { 2138 videoURL = super.getAutoplayURL(videoURL); // Vimeo requires the '#t=' param to be last in the URL. 2139 2140 const timeMatch = videoURL.match(/#t=[^&]*/); 2141 return videoURL.replace(timeMatch[0], '') + timeMatch; 2142 } 2143 2144 } 2145 2146 exports.default = VimeoLoader; 2147 2148 /***/ }), 2149 2150 /***/ "../assets/dev/js/frontend/utils/video-api/youtube-loader.js": 2151 /*!*******************************************************************!*\ 2152 !*** ../assets/dev/js/frontend/utils/video-api/youtube-loader.js ***! 2153 \*******************************************************************/ 2154 /***/ ((__unused_webpack_module, exports, __webpack_require__) => { 2155 2156 "use strict"; 2157 2158 2159 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); 2160 2161 Object.defineProperty(exports, "__esModule", ({ 2162 value: true 2163 })); 2164 exports.default = void 0; 2165 2166 var _baseLoader = _interopRequireDefault(__webpack_require__(/*! ./base-loader */ "../assets/dev/js/frontend/utils/video-api/base-loader.js")); 2167 2168 class YoutubeLoader extends _baseLoader.default { 2169 getApiURL() { 2170 return 'https://www.youtube.com/iframe_api'; 2171 } 2172 2173 getURLRegex() { 2174 return /^(?:https?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?vi?=|(?:embed|v|vi|user)\/))([^?&"'>]+)/; 2175 } 2176 2177 isApiLoaded() { 2178 return window.YT && YT.loaded; 2179 } 2180 2181 getApiObject() { 2182 return YT; 2183 } 2184 2185 } 2186 2187 exports.default = YoutubeLoader; 2188 2189 /***/ }), 2190 2191 /***/ "../assets/dev/js/public-path.js": 2192 /*!***************************************!*\ 2193 !*** ../assets/dev/js/public-path.js ***! 2194 \***************************************/ 2195 /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 2196 2197 "use strict"; 2198 2199 2200 /* eslint-disable camelcase */ 2201 __webpack_require__.p = elementorFrontendConfig.urls.assets + 'js/'; 2202 2203 /***/ }), 2204 2205 /***/ "../assets/dev/js/utils/breakpoints.js": 2206 /*!*********************************************!*\ 2207 !*** ../assets/dev/js/utils/breakpoints.js ***! 2208 \*********************************************/ 2209 /***/ ((__unused_webpack_module, exports) => { 2210 2211 "use strict"; 2212 2213 2214 Object.defineProperty(exports, "__esModule", ({ 2215 value: true 2216 })); 2217 exports.default = void 0; 2218 2219 /** 2220 * Breakpoints 2221 * 2222 * This utility class contains helper functions relating to Elementor's breakpoints system. 2223 * 2224 * @since 3.4.0 2225 */ 2226 class Breakpoints extends elementorModules.Module { 2227 constructor(responsiveConfig) { 2228 super(); // The passed config is either `elementor.config.responsive` or `elementorFrontend.config.responsive` 2229 2230 this.responsiveConfig = responsiveConfig; 2231 } 2232 /** 2233 * Get Active Breakpoints List 2234 * 2235 * Returns a flat array containing the active breakpoints/devices. By default, it returns the li 2236 * the list ordered from smallest to largest breakpoint. If `true` is passed as a parameter, it reverses the order. 2237 * 2238 * @since 3.4.0 2239 * 2240 * @param {Object} args 2241 */ 2242 2243 2244 getActiveBreakpointsList(args = {}) { 2245 const defaultArgs = { 2246 largeToSmall: false, 2247 withDesktop: false 2248 }; 2249 args = { ...defaultArgs, 2250 ...args 2251 }; 2252 const breakpointKeys = Object.keys(this.responsiveConfig.activeBreakpoints); 2253 2254 if (args.withDesktop) { 2255 // If there is an active 'widescreen' breakpoint, insert the artificial 'desktop' device below it. 2256 const widescreenIndex = breakpointKeys.indexOf('widescreen'), 2257 indexToInsertDesktopDevice = -1 === widescreenIndex ? breakpointKeys.length : breakpointKeys.length - 1; 2258 breakpointKeys.splice(indexToInsertDesktopDevice, 0, 'desktop'); 2259 } 2260 2261 if (args.largeToSmall) { 2262 breakpointKeys.reverse(); 2263 } 2264 2265 return breakpointKeys; 2266 } 2267 /** 2268 * Get Active Breakpoint Values 2269 * 2270 * Returns a flat array containing the list of active breakpoint values, from smallest to largest. 2271 * 2272 * @since 3.4.0 2273 */ 2274 2275 2276 getBreakpointValues() { 2277 const { 2278 activeBreakpoints 2279 } = this.responsiveConfig, 2280 breakpointValues = []; 2281 Object.values(activeBreakpoints).forEach(breakpointConfig => { 2282 breakpointValues.push(breakpointConfig.value); 2283 }); 2284 return breakpointValues; 2285 } 2286 /** 2287 * Get Desktop Previous Device Key 2288 * 2289 * Returns the key of the device directly under desktop (can be 'tablet', 'tablet_extra', 'laptop'). 2290 * 2291 * @since 3.4.0 2292 * 2293 * @returns {string} 2294 */ 2295 2296 2297 getDesktopPreviousDeviceKey() { 2298 let desktopPreviousDevice = ''; 2299 const { 2300 activeBreakpoints 2301 } = this.responsiveConfig, 2302 breakpointKeys = Object.keys(activeBreakpoints), 2303 numOfDevices = breakpointKeys.length; 2304 2305 if ('min' === activeBreakpoints[breakpointKeys[numOfDevices - 1]].direction) { 2306 // If the widescreen breakpoint is active, the device that's previous to desktop is the last one before 2307 // widescreen. 2308 desktopPreviousDevice = breakpointKeys[numOfDevices - 2]; 2309 } else { 2310 // If the widescreen breakpoint isn't active, we just take the last device returned by the config. 2311 desktopPreviousDevice = breakpointKeys[numOfDevices - 1]; 2312 } 2313 2314 return desktopPreviousDevice; 2315 } 2316 /** 2317 * Get Device Minimum Breakpoint 2318 * 2319 * Returns the minimum point in the device's display range. For each device, the minimum point of its display range 2320 * is the max point of the device below it + 1px. For example, if the active devices are mobile, tablet, 2321 * and desktop, and the mobile breakpoint is 767px, the minimum display point for tablet devices is 768px. 2322 * 2323 * @since 3.4.0 2324 * 2325 * @returns {number|*} 2326 */ 2327 2328 2329 getDesktopMinPoint() { 2330 const { 2331 activeBreakpoints 2332 } = this.responsiveConfig, 2333 desktopPreviousDevice = this.getDesktopPreviousDeviceKey(); 2334 return activeBreakpoints[desktopPreviousDevice].value + 1; 2335 } 2336 /** 2337 * Get Device Minimum Breakpoint 2338 * 2339 * Returns the minimum point in the device's display range. For each device, the minimum point of its display range 2340 * is the max point of the device below it + 1px. For example, if the active devices are mobile, tablet, 2341 * and desktop, and the mobile breakpoint is 767px, the minimum display point for tablet devices is 768px. 2342 * 2343 * @since 3.4.0 2344 * 2345 * @param device 2346 * @returns {number|*} 2347 */ 2348 2349 2350 getDeviceMinBreakpoint(device) { 2351 if ('desktop' === device) { 2352 return this.getDesktopMinPoint(); 2353 } 2354 2355 const { 2356 activeBreakpoints 2357 } = this.responsiveConfig, 2358 breakpointNames = Object.keys(activeBreakpoints); 2359 let minBreakpoint; 2360 2361 if (breakpointNames[0] === device) { 2362 // For the lowest breakpoint, the min point is always 320. 2363 minBreakpoint = 320; 2364 } else if ('widescreen' === device) { 2365 // Widescreen only has a minimum point. In this case, the breakpoint 2366 // value in the Breakpoints config is itself the device min point. 2367 if (activeBreakpoints[device]) { 2368 minBreakpoint = activeBreakpoints[device].value; 2369 } else { 2370 // If the widescreen breakpoint does not exist in the active breakpoints config (for example, in the 2371 // case this method runs as the breakpoint is being added), get the value from the full config. 2372 minBreakpoint = this.responsiveConfig.breakpoints.widescreen; 2373 } 2374 } else { 2375 const deviceNameIndex = breakpointNames.indexOf(device), 2376 previousIndex = deviceNameIndex - 1; 2377 minBreakpoint = activeBreakpoints[breakpointNames[previousIndex]].value + 1; 2378 } 2379 2380 return minBreakpoint; 2381 } 2382 /** 2383 * Get Active Match Regex 2384 * 2385 * Returns a regular expression containing all active breakpoints prefixed with an underscore. 2386 * 2387 * @returns {RegExp} 2388 */ 2389 2390 2391 getActiveMatchRegex() { 2392 return new RegExp(this.getActiveBreakpointsList().map(device => '_' + device).join('|') + '$'); 2393 } 2394 2395 } 2396 2397 exports.default = Breakpoints; 2398 2399 /***/ }), 2400 2401 /***/ "../assets/dev/js/utils/hooks.js": 2402 /*!***************************************!*\ 2403 !*** ../assets/dev/js/utils/hooks.js ***! 2404 \***************************************/ 2405 /***/ ((module) => { 2406 2407 "use strict"; 2408 2409 /** 2410 * Handles managing all events for whatever you plug it into. Priorities for hooks are based on lowest to highest in 2411 * that, lowest priority hooks are fired first. 2412 */ 2413 2414 var EventManager = function () { 2415 var slice = Array.prototype.slice, 2416 MethodsAvailable; 2417 /** 2418 * Contains the hooks that get registered with this EventManager. The array for storage utilizes a "flat" 2419 * object literal such that looking up the hook utilizes the native object literal hash. 2420 */ 2421 2422 var STORAGE = { 2423 actions: {}, 2424 filters: {} 2425 }; 2426 /** 2427 * Removes the specified hook by resetting the value of it. 2428 * 2429 * @param type Type of hook, either 'actions' or 'filters' 2430 * @param hook The hook (namespace.identifier) to remove 2431 * 2432 * @private 2433 */ 2434 2435 function _removeHook(type, hook, callback, context) { 2436 var handlers, handler, i; 2437 2438 if (!STORAGE[type][hook]) { 2439 return; 2440 } 2441 2442 if (!callback) { 2443 STORAGE[type][hook] = []; 2444 } else { 2445 handlers = STORAGE[type][hook]; 2446 2447 if (!context) { 2448 for (i = handlers.length; i--;) { 2449 if (handlers[i].callback === callback) { 2450 handlers.splice(i, 1); 2451 } 2452 } 2453 } else { 2454 for (i = handlers.length; i--;) { 2455 handler = handlers[i]; 2456 2457 if (handler.callback === callback && handler.context === context) { 2458 handlers.splice(i, 1); 2459 } 2460 } 2461 } 2462 } 2463 } 2464 /** 2465 * Use an insert sort for keeping our hooks organized based on priority. This function is ridiculously faster 2466 * than bubble sort, etc: http://jsperf.com/javascript-sort 2467 * 2468 * @param hooks The custom array containing all of the appropriate hooks to perform an insert sort on. 2469 * @private 2470 */ 2471 2472 2473 function _hookInsertSort(hooks) { 2474 var tmpHook, j, prevHook; 2475 2476 for (var i = 1, len = hooks.length; i < len; i++) { 2477 tmpHook = hooks[i]; 2478 j = i; 2479 2480 while ((prevHook = hooks[j - 1]) && prevHook.priority > tmpHook.priority) { 2481 hooks[j] = hooks[j - 1]; 2482 --j; 2483 } 2484 2485 hooks[j] = tmpHook; 2486 } 2487 2488 return hooks; 2489 } 2490 /** 2491 * Adds the hook to the appropriate storage container 2492 * 2493 * @param type 'actions' or 'filters' 2494 * @param hook The hook (namespace.identifier) to add to our event manager 2495 * @param callback The function that will be called when the hook is executed. 2496 * @param priority The priority of this hook. Must be an integer. 2497 * @param [context] A value to be used for this 2498 * @private 2499 */ 2500 2501 2502 function _addHook(type, hook, callback, priority, context) { 2503 var hookObject = { 2504 callback: callback, 2505 priority: priority, 2506 context: context 2507 }; // Utilize 'prop itself' : http://jsperf.com/hasownproperty-vs-in-vs-undefined/19 2508 2509 var hooks = STORAGE[type][hook]; 2510 2511 if (hooks) { 2512 // TEMP FIX BUG 2513 var hasSameCallback = false; 2514 jQuery.each(hooks, function () { 2515 if (this.callback === callback) { 2516 hasSameCallback = true; 2517 return false; 2518 } 2519 }); 2520 2521 if (hasSameCallback) { 2522 return; 2523 } // END TEMP FIX BUG 2524 2525 2526 hooks.push(hookObject); 2527 hooks = _hookInsertSort(hooks); 2528 } else { 2529 hooks = [hookObject]; 2530 } 2531 2532 STORAGE[type][hook] = hooks; 2533 } 2534 /** 2535 * Runs the specified hook. If it is an action, the value is not modified but if it is a filter, it is. 2536 * 2537 * @param type 'actions' or 'filters' 2538 * @param hook The hook ( namespace.identifier ) to be ran. 2539 * @param args Arguments to pass to the action/filter. If it's a filter, args is actually a single parameter. 2540 * @private 2541 */ 2542 2543 2544 function _runHook(type, hook, args) { 2545 var handlers = STORAGE[type][hook], 2546 i, 2547 len; 2548 2549 if (!handlers) { 2550 return 'filters' === type ? args[0] : false; 2551 } 2552 2553 len = handlers.length; 2554 2555 if ('filters' === type) { 2556 for (i = 0; i < len; i++) { 2557 args[0] = handlers[i].callback.apply(handlers[i].context, args); 2558 } 2559 } else { 2560 for (i = 0; i < len; i++) { 2561 handlers[i].callback.apply(handlers[i].context, args); 2562 } 2563 } 2564 2565 return 'filters' === type ? args[0] : true; 2566 } 2567 /** 2568 * Adds an action to the event manager. 2569 * 2570 * @param action Must contain namespace.identifier 2571 * @param callback Must be a valid callback function before this action is added 2572 * @param [priority=10] Used to control when the function is executed in relation to other callbacks bound to the same hook 2573 * @param [context] Supply a value to be used for this 2574 */ 2575 2576 2577 function addAction(action, callback, priority, context) { 2578 if ('string' === typeof action && 'function' === typeof callback) { 2579 priority = parseInt(priority || 10, 10); 2580 2581 _addHook('actions', action, callback, priority, context); 2582 } 2583 2584 return MethodsAvailable; 2585 } 2586 /** 2587 * Performs an action if it exists. You can pass as many arguments as you want to this function; the only rule is 2588 * that the first argument must always be the action. 2589 */ 2590 2591 2592 function doAction() { 2593 var args = slice.call(arguments); 2594 var action = args.shift(); 2595 2596 if ('string' === typeof action) { 2597 _runHook('actions', action, args); 2598 } 2599 2600 return MethodsAvailable; 2601 } 2602 /** 2603 * Removes the specified action if it contains a namespace.identifier & exists. 2604 * 2605 * @param action The action to remove 2606 * @param [callback] Callback function to remove 2607 */ 2608 2609 2610 function removeAction(action, callback) { 2611 if ('string' === typeof action) { 2612 _removeHook('actions', action, callback); 2613 } 2614 2615 return MethodsAvailable; 2616 } 2617 /** 2618 * Adds a filter to the event manager. 2619 * 2620 * @param filter Must contain namespace.identifier 2621 * @param callback Must be a valid callback function before this action is added 2622 * @param [priority=10] Used to control when the function is executed in relation to other callbacks bound to the same hook 2623 * @param [context] Supply a value to be used for this 2624 */ 2625 2626 2627 function addFilter(filter, callback, priority, context) { 2628 if ('string' === typeof filter && 'function' === typeof callback) { 2629 priority = parseInt(priority || 10, 10); 2630 2631 _addHook('filters', filter, callback, priority, context); 2632 } 2633 2634 return MethodsAvailable; 2635 } 2636 /** 2637 * Performs a filter if it exists. You should only ever pass 1 argument to be filtered. The only rule is that 2638 * the first argument must always be the filter. 2639 */ 2640 2641 2642 function applyFilters() { 2643 var args = slice.call(arguments); 2644 var filter = args.shift(); 2645 2646 if ('string' === typeof filter) { 2647 return _runHook('filters', filter, args); 2648 } 2649 2650 return MethodsAvailable; 2651 } 2652 /** 2653 * Removes the specified filter if it contains a namespace.identifier & exists. 2654 * 2655 * @param filter The action to remove 2656 * @param [callback] Callback function to remove 2657 */ 2658 2659 2660 function removeFilter(filter, callback) { 2661 if ('string' === typeof filter) { 2662 _removeHook('filters', filter, callback); 2663 } 2664 2665 return MethodsAvailable; 2666 } 2667 /** 2668 * Maintain a reference to the object scope so our public methods never get confusing. 2669 */ 2670 2671 2672 MethodsAvailable = { 2673 removeFilter: removeFilter, 2674 applyFilters: applyFilters, 2675 addFilter: addFilter, 2676 removeAction: removeAction, 2677 doAction: doAction, 2678 addAction: addAction 2679 }; // return all of the publicly available methods 2680 2681 return MethodsAvailable; 2682 }; 2683 2684 module.exports = EventManager; 2685 2686 /***/ }), 2687 2688 /***/ "../core/common/assets/js/utils/environment.js": 2689 /*!*****************************************************!*\ 2690 !*** ../core/common/assets/js/utils/environment.js ***! 2691 \*****************************************************/ 2692 /***/ ((__unused_webpack_module, exports) => { 2693 2694 "use strict"; 2695 2696 2697 Object.defineProperty(exports, "__esModule", ({ 2698 value: true 2699 })); 2700 exports.default = void 0; 2701 2702 const matchUserAgent = UserAgentStr => { 2703 return userAgent.indexOf(UserAgentStr) >= 0; 2704 }, 2705 userAgent = navigator.userAgent, 2706 // Solution influenced by https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser 2707 // Opera 8.0+ 2708 isOpera = !!window.opr && !!opr.addons || !!window.opera || matchUserAgent(' OPR/'), 2709 // Firefox 1.0+ 2710 isFirefox = matchUserAgent('Firefox'), 2711 // Safari 3.0+ "[object HTMLElementConstructor]" 2712 isSafari = /^((?!chrome|android).)*safari/i.test(userAgent) || /constructor/i.test(window.HTMLElement) || (p => { 2713 return '[object SafariRemoteNotification]' === p.toString(); 2714 })(!window.safari || typeof safari !== 'undefined' && safari.pushNotification), 2715 // Internet Explorer 6-11 2716 isIE = /Trident|MSIE/.test(userAgent) && ( 2717 /*@cc_on!@*/ 2718 false || !!document.documentMode), 2719 // Edge 20+ 2720 isEdge = !isIE && !!window.StyleMedia || matchUserAgent('Edg'), 2721 // Google Chrome (Not accurate) 2722 isChrome = !!window.chrome && matchUserAgent('Chrome') && !(isEdge || isOpera), 2723 // Blink engine 2724 isBlink = matchUserAgent('Chrome') && !!window.CSS, 2725 // Apple Webkit engine 2726 isAppleWebkit = matchUserAgent('AppleWebKit') && !isBlink, 2727 environment = { 2728 appleWebkit: isAppleWebkit, 2729 blink: isBlink, 2730 chrome: isChrome, 2731 edge: isEdge, 2732 firefox: isFirefox, 2733 ie: isIE, 2734 mac: matchUserAgent('Macintosh'), 2735 opera: isOpera, 2736 safari: isSafari, 2737 webkit: matchUserAgent('AppleWebKit') 2738 }; 2739 2740 var _default = environment; 2741 exports.default = _default; 2742 2743 /***/ }), 2744 2745 /***/ "../core/common/assets/js/utils/storage.js": 2746 /*!*************************************************!*\ 2747 !*** ../core/common/assets/js/utils/storage.js ***! 2748 \*************************************************/ 2749 /***/ ((__unused_webpack_module, exports) => { 2750 2751 "use strict"; 2752 2753 2754 Object.defineProperty(exports, "__esModule", ({ 2755 value: true 2756 })); 2757 exports.default = void 0; 2758 2759 class _default extends elementorModules.Module { 2760 get(key, options) { 2761 options = options || {}; 2762 let storage; 2763 2764 try { 2765 storage = options.session ? sessionStorage : localStorage; 2766 } catch (e) { 2767 return key ? undefined : {}; 2768 } 2769 2770 let elementorStorage = storage.getItem('elementor'); 2771 2772 if (elementorStorage) { 2773 elementorStorage = JSON.parse(elementorStorage); 2774 } else { 2775 elementorStorage = {}; 2776 } 2777 2778 if (!elementorStorage.__expiration) { 2779 elementorStorage.__expiration = {}; 2780 } 2781 2782 const expiration = elementorStorage.__expiration; 2783 let expirationToCheck = []; 2784 2785 if (key) { 2786 if (expiration[key]) { 2787 expirationToCheck = [key]; 2788 } 2789 } else { 2790 expirationToCheck = Object.keys(expiration); 2791 } 2792 2793 let entryExpired = false; 2794 expirationToCheck.forEach(expirationKey => { 2795 if (new Date(expiration[expirationKey]) < new Date()) { 2796 delete elementorStorage[expirationKey]; 2797 delete expiration[expirationKey]; 2798 entryExpired = true; 2799 } 2800 }); 2801 2802 if (entryExpired) { 2803 this.save(elementorStorage, options.session); 2804 } 2805 2806 if (key) { 2807 return elementorStorage[key]; 2808 } 2809 2810 return elementorStorage; 2811 } 2812 2813 set(key, value, options) { 2814 options = options || {}; 2815 const elementorStorage = this.get(null, options); 2816 elementorStorage[key] = value; 2817 2818 if (options.lifetimeInSeconds) { 2819 const date = new Date(); 2820 date.setTime(date.getTime() + options.lifetimeInSeconds * 1000); 2821 elementorStorage.__expiration[key] = date.getTime(); 2822 } 2823 2824 this.save(elementorStorage, options.session); 2825 } 2826 2827 save(object, session) { 2828 let storage; 2829 2830 try { 2831 storage = session ? sessionStorage : localStorage; 2832 } catch (e) { 2833 return; 2834 } 2835 2836 storage.setItem('elementor', JSON.stringify(object)); 2837 } 2838 2839 } 2840 2841 exports.default = _default; 2842 2843 /***/ }), 2844 2845 /***/ "../modules/shapes/assets/js/frontend/frontend.js": 2846 /*!********************************************************!*\ 2847 !*** ../modules/shapes/assets/js/frontend/frontend.js ***! 2848 \********************************************************/ 2849 /***/ ((__unused_webpack_module, exports, __webpack_require__) => { 2850 2851 "use strict"; 2852 2853 2854 Object.defineProperty(exports, "__esModule", ({ 2855 value: true 2856 })); 2857 exports.default = void 0; 2858 2859 class _default extends elementorModules.Module { 2860 constructor() { 2861 super(); 2862 elementorFrontend.elementsHandler.attachHandler('text-path', () => __webpack_require__.e(/*! import() | text-path */ "text-path").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/text-path */ "../modules/shapes/assets/js/frontend/handlers/text-path.js"))); 2863 } 2864 2865 } 2866 2867 exports.default = _default; 2868 2869 /***/ }) 2870 2871 }, 2872 /******/ __webpack_require__ => { // webpackRuntimeModules 2873 /******/ "use strict"; 2874 /******/ 2875 /******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) 2876 /******/ __webpack_require__.O(0, ["frontend-modules"], () => (__webpack_exec__("../assets/dev/js/frontend/frontend.js"))); 2877 /******/ var __webpack_exports__ = __webpack_require__.O(); 2878 /******/ } 2879 ]); 2880 //# sourceMappingURL=frontend.js.map