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

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