PluginProbe
Elementor Website Builder – more than just a page builder / 3.6.2
Elementor Website Builder – more than just a page builder v3.6.2
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.6.2, at assets/js/frontend.js

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