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