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

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

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