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

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

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