PluginProbe
Elementor Website Builder – more than just a page builder / 3.10.1
Elementor Website Builder – more than just a page builder v3.10.1
4.3.0 4.3.0-beta3 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 All 453 releases
elementor / assets / js / frontend.js

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

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