PluginProbe
Elementor Website Builder – more than just a page builder / 3.7.0
Elementor Website Builder – more than just a page builder v3.7.0
4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 4.0.7 All 451 releases
elementor / assets / js / frontend.js

frontend.js in Elementor Website Builder – more than just a page builder 3.7.0, at assets/js/frontend.js

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