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

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

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