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