PluginProbe
Elementor Website Builder – more than just a page builder / 3.11.5
Elementor Website Builder – more than just a page builder v3.11.5
4.3.4 4.3.3 4.3.2 4.3.1 4.3.0 4.3.0-beta3 4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 All 457 releases
elementor / assets / js / frontend.js

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

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