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

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

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