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

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

2,148 lines 77.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*! elementor - v3.14.0 - 12-06-2023 */
2 (self["webpackChunkelementor"] = self["webpackChunkelementor"] || []).push([["preloaded-modules"],{
3
4 /***/ "../assets/dev/js/frontend/handlers/accordion.js":
5 /*!*******************************************************!*\
6 !*** ../assets/dev/js/frontend/handlers/accordion.js ***!
7 \*******************************************************/
8 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
9
10 "use strict";
11
12
13 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
14 Object.defineProperty(exports, "__esModule", ({
15 value: true
16 }));
17 exports["default"] = void 0;
18 var _baseTabs = _interopRequireDefault(__webpack_require__(/*! ./base-tabs */ "../assets/dev/js/frontend/handlers/base-tabs.js"));
19 class Accordion extends _baseTabs.default {
20 getDefaultSettings() {
21 const defaultSettings = super.getDefaultSettings();
22 return {
23 ...defaultSettings,
24 showTabFn: 'slideDown',
25 hideTabFn: 'slideUp'
26 };
27 }
28 }
29 exports["default"] = Accordion;
30
31 /***/ }),
32
33 /***/ "../assets/dev/js/frontend/handlers/alert.js":
34 /*!***************************************************!*\
35 !*** ../assets/dev/js/frontend/handlers/alert.js ***!
36 \***************************************************/
37 /***/ ((__unused_webpack_module, exports) => {
38
39 "use strict";
40
41
42 Object.defineProperty(exports, "__esModule", ({
43 value: true
44 }));
45 exports["default"] = void 0;
46 class Alert extends elementorModules.frontend.handlers.Base {
47 getDefaultSettings() {
48 return {
49 selectors: {
50 dismissButton: '.elementor-alert-dismiss'
51 }
52 };
53 }
54 getDefaultElements() {
55 const selectors = this.getSettings('selectors');
56 return {
57 $dismissButton: this.$element.find(selectors.dismissButton)
58 };
59 }
60 bindEvents() {
61 this.elements.$dismissButton.on('click', this.onDismissButtonClick.bind(this));
62 }
63 onDismissButtonClick() {
64 this.$element.fadeOut();
65 }
66 }
67 exports["default"] = Alert;
68
69 /***/ }),
70
71 /***/ "../assets/dev/js/frontend/handlers/base-tabs.js":
72 /*!*******************************************************!*\
73 !*** ../assets/dev/js/frontend/handlers/base-tabs.js ***!
74 \*******************************************************/
75 /***/ ((__unused_webpack_module, exports) => {
76
77 "use strict";
78
79
80 Object.defineProperty(exports, "__esModule", ({
81 value: true
82 }));
83 exports["default"] = void 0;
84 class baseTabs extends elementorModules.frontend.handlers.Base {
85 getDefaultSettings() {
86 return {
87 selectors: {
88 tablist: '[role="tablist"]',
89 tabTitle: '.elementor-tab-title',
90 tabContent: '.elementor-tab-content'
91 },
92 classes: {
93 active: 'elementor-active'
94 },
95 showTabFn: 'show',
96 hideTabFn: 'hide',
97 toggleSelf: true,
98 hidePrevious: true,
99 autoExpand: true,
100 keyDirection: {
101 ArrowLeft: elementorFrontendConfig.is_rtl ? 1 : -1,
102 ArrowUp: -1,
103 ArrowRight: elementorFrontendConfig.is_rtl ? -1 : 1,
104 ArrowDown: 1
105 }
106 };
107 }
108 getDefaultElements() {
109 const selectors = this.getSettings('selectors');
110 return {
111 $tabTitles: this.findElement(selectors.tabTitle),
112 $tabContents: this.findElement(selectors.tabContent)
113 };
114 }
115 activateDefaultTab() {
116 const settings = this.getSettings();
117 if (!settings.autoExpand || 'editor' === settings.autoExpand && !this.isEdit) {
118 return;
119 }
120 const defaultActiveTab = this.getEditSettings('activeItemIndex') || 1,
121 originalToggleMethods = {
122 showTabFn: settings.showTabFn,
123 hideTabFn: settings.hideTabFn
124 };
125
126 // Toggle tabs without animation to avoid jumping
127 this.setSettings({
128 showTabFn: 'show',
129 hideTabFn: 'hide'
130 });
131 this.changeActiveTab(defaultActiveTab);
132
133 // Return back original toggle effects
134 this.setSettings(originalToggleMethods);
135 }
136 handleKeyboardNavigation(event) {
137 const tab = event.currentTarget,
138 $tabList = jQuery(tab.closest(this.getSettings('selectors').tablist)),
139 // eslint-disable-next-line @wordpress/no-unused-vars-before-return
140 $tabs = $tabList.find(this.getSettings('selectors').tabTitle),
141 isVertical = 'vertical' === $tabList.attr('aria-orientation');
142 switch (event.key) {
143 case 'ArrowLeft':
144 case 'ArrowRight':
145 if (isVertical) {
146 return;
147 }
148 break;
149 case 'ArrowUp':
150 case 'ArrowDown':
151 if (!isVertical) {
152 return;
153 }
154 event.preventDefault();
155 break;
156 case 'Home':
157 event.preventDefault();
158 $tabs.first().trigger('focus');
159 return;
160 case 'End':
161 event.preventDefault();
162 $tabs.last().trigger('focus');
163 return;
164 default:
165 return;
166 }
167 const tabIndex = tab.getAttribute('data-tab') - 1,
168 direction = this.getSettings('keyDirection')[event.key],
169 nextTab = $tabs[tabIndex + direction];
170 if (nextTab) {
171 nextTab.focus();
172 } else if (-1 === tabIndex + direction) {
173 $tabs.last().trigger('focus');
174 } else {
175 $tabs.first().trigger('focus');
176 }
177 }
178 deactivateActiveTab(tabIndex) {
179 const settings = this.getSettings(),
180 activeClass = settings.classes.active,
181 activeFilter = tabIndex ? '[data-tab="' + tabIndex + '"]' : '.' + activeClass,
182 $activeTitle = this.elements.$tabTitles.filter(activeFilter),
183 $activeContent = this.elements.$tabContents.filter(activeFilter);
184 $activeTitle.add($activeContent).removeClass(activeClass);
185 $activeTitle.attr({
186 tabindex: '-1',
187 'aria-selected': 'false',
188 'aria-expanded': 'false'
189 });
190 $activeContent[settings.hideTabFn]();
191 $activeContent.attr('hidden', 'hidden');
192 }
193 activateTab(tabIndex) {
194 const settings = this.getSettings(),
195 activeClass = settings.classes.active,
196 $requestedTitle = this.elements.$tabTitles.filter('[data-tab="' + tabIndex + '"]'),
197 $requestedContent = this.elements.$tabContents.filter('[data-tab="' + tabIndex + '"]'),
198 animationDuration = 'show' === settings.showTabFn ? 0 : 400;
199 $requestedTitle.add($requestedContent).addClass(activeClass);
200 $requestedTitle.attr({
201 tabindex: '0',
202 'aria-selected': 'true',
203 'aria-expanded': 'true'
204 });
205 $requestedContent[settings.showTabFn](animationDuration, () => elementorFrontend.elements.$window.trigger('elementor-pro/motion-fx/recalc'));
206 $requestedContent.removeAttr('hidden');
207 }
208 isActiveTab(tabIndex) {
209 return this.elements.$tabTitles.filter('[data-tab="' + tabIndex + '"]').hasClass(this.getSettings('classes.active'));
210 }
211 bindEvents() {
212 this.elements.$tabTitles.on({
213 keydown: event => {
214 // Support for old markup that includes an `<a>` tag in the tab
215 if (jQuery(event.target).is('a') && `Enter` === event.key) {
216 event.preventDefault();
217 }
218
219 // We listen to keydowon event for these keys in order to prevent undesired page scrolling
220 if (['End', 'Home', 'ArrowUp', 'ArrowDown'].includes(event.key)) {
221 this.handleKeyboardNavigation(event);
222 }
223 },
224 keyup: event => {
225 switch (event.code) {
226 case 'ArrowLeft':
227 case 'ArrowRight':
228 this.handleKeyboardNavigation(event);
229 break;
230 case 'Enter':
231 case 'Space':
232 event.preventDefault();
233 this.changeActiveTab(event.currentTarget.getAttribute('data-tab'));
234 break;
235 }
236 },
237 click: event => {
238 event.preventDefault();
239 this.changeActiveTab(event.currentTarget.getAttribute('data-tab'));
240 }
241 });
242 }
243 onInit() {
244 super.onInit(...arguments);
245 this.activateDefaultTab();
246 }
247 onEditSettingsChange(propertyName) {
248 if ('activeItemIndex' === propertyName) {
249 this.activateDefaultTab();
250 }
251 }
252 changeActiveTab(tabIndex) {
253 const isActiveTab = this.isActiveTab(tabIndex),
254 settings = this.getSettings();
255 if ((settings.toggleSelf || !isActiveTab) && settings.hidePrevious) {
256 this.deactivateActiveTab();
257 }
258 if (!settings.hidePrevious && isActiveTab) {
259 this.deactivateActiveTab(tabIndex);
260 }
261 if (!isActiveTab) {
262 this.activateTab(tabIndex);
263 }
264 }
265 }
266 exports["default"] = baseTabs;
267
268 /***/ }),
269
270 /***/ "../assets/dev/js/frontend/handlers/counter.js":
271 /*!*****************************************************!*\
272 !*** ../assets/dev/js/frontend/handlers/counter.js ***!
273 \*****************************************************/
274 /***/ ((__unused_webpack_module, exports) => {
275
276 "use strict";
277
278
279 Object.defineProperty(exports, "__esModule", ({
280 value: true
281 }));
282 exports["default"] = void 0;
283 class Counter extends elementorModules.frontend.handlers.Base {
284 getDefaultSettings() {
285 return {
286 selectors: {
287 counterNumber: '.elementor-counter-number'
288 }
289 };
290 }
291 getDefaultElements() {
292 const selectors = this.getSettings('selectors');
293 return {
294 $counterNumber: this.$element.find(selectors.counterNumber)
295 };
296 }
297 onInit() {
298 super.onInit();
299 this.intersectionObserver = elementorModules.utils.Scroll.scrollObserver({
300 callback: event => {
301 if (event.isInViewport) {
302 this.intersectionObserver.unobserve(this.elements.$counterNumber[0]);
303 const data = this.elements.$counterNumber.data(),
304 decimalDigits = data.toValue.toString().match(/\.(.*)/);
305 if (decimalDigits) {
306 data.rounding = decimalDigits[1].length;
307 }
308 this.elements.$counterNumber.numerator(data);
309 }
310 }
311 });
312 this.intersectionObserver.observe(this.elements.$counterNumber[0]);
313 }
314 }
315 exports["default"] = Counter;
316
317 /***/ }),
318
319 /***/ "../assets/dev/js/frontend/handlers/image-carousel.js":
320 /*!************************************************************!*\
321 !*** ../assets/dev/js/frontend/handlers/image-carousel.js ***!
322 \************************************************************/
323 /***/ ((__unused_webpack_module, exports) => {
324
325 "use strict";
326
327
328 Object.defineProperty(exports, "__esModule", ({
329 value: true
330 }));
331 exports["default"] = void 0;
332 class ImageCarousel extends elementorModules.frontend.handlers.CarouselBase {
333 getDefaultSettings() {
334 const settings = super.getDefaultSettings();
335 settings.selectors.carousel = '.elementor-image-carousel-wrapper';
336 return settings;
337 }
338 }
339 exports["default"] = ImageCarousel;
340
341 /***/ }),
342
343 /***/ "../assets/dev/js/frontend/handlers/progress.js":
344 /*!******************************************************!*\
345 !*** ../assets/dev/js/frontend/handlers/progress.js ***!
346 \******************************************************/
347 /***/ ((__unused_webpack_module, exports) => {
348
349 "use strict";
350
351
352 Object.defineProperty(exports, "__esModule", ({
353 value: true
354 }));
355 exports["default"] = void 0;
356 class Progress extends elementorModules.frontend.handlers.Base {
357 getDefaultSettings() {
358 return {
359 selectors: {
360 progressNumber: '.elementor-progress-bar'
361 }
362 };
363 }
364 getDefaultElements() {
365 const selectors = this.getSettings('selectors');
366 return {
367 $progressNumber: this.$element.find(selectors.progressNumber)
368 };
369 }
370 onInit() {
371 super.onInit();
372 elementorFrontend.waypoint(this.elements.$progressNumber, () => {
373 const $progressbar = this.elements.$progressNumber;
374 $progressbar.css('width', $progressbar.data('max') + '%');
375 });
376 }
377 }
378 exports["default"] = Progress;
379
380 /***/ }),
381
382 /***/ "../assets/dev/js/frontend/handlers/tabs.js":
383 /*!**************************************************!*\
384 !*** ../assets/dev/js/frontend/handlers/tabs.js ***!
385 \**************************************************/
386 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
387
388 "use strict";
389
390
391 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
392 Object.defineProperty(exports, "__esModule", ({
393 value: true
394 }));
395 exports["default"] = void 0;
396 var _baseTabs = _interopRequireDefault(__webpack_require__(/*! ./base-tabs */ "../assets/dev/js/frontend/handlers/base-tabs.js"));
397 class Tabs extends _baseTabs.default {
398 getDefaultSettings() {
399 const defaultSettings = super.getDefaultSettings();
400 return {
401 ...defaultSettings,
402 toggleSelf: false
403 };
404 }
405 }
406 exports["default"] = Tabs;
407
408 /***/ }),
409
410 /***/ "../assets/dev/js/frontend/handlers/text-editor.js":
411 /*!*********************************************************!*\
412 !*** ../assets/dev/js/frontend/handlers/text-editor.js ***!
413 \*********************************************************/
414 /***/ ((__unused_webpack_module, exports) => {
415
416 "use strict";
417
418
419 Object.defineProperty(exports, "__esModule", ({
420 value: true
421 }));
422 exports["default"] = void 0;
423 class TextEditor extends elementorModules.frontend.handlers.Base {
424 getDefaultSettings() {
425 return {
426 selectors: {
427 paragraph: 'p:first'
428 },
429 classes: {
430 dropCap: 'elementor-drop-cap',
431 dropCapLetter: 'elementor-drop-cap-letter'
432 }
433 };
434 }
435 getDefaultElements() {
436 const selectors = this.getSettings('selectors'),
437 classes = this.getSettings('classes'),
438 $dropCap = jQuery('<span>', {
439 class: classes.dropCap
440 }),
441 $dropCapLetter = jQuery('<span>', {
442 class: classes.dropCapLetter
443 });
444 $dropCap.append($dropCapLetter);
445 return {
446 $paragraph: this.$element.find(selectors.paragraph),
447 $dropCap,
448 $dropCapLetter
449 };
450 }
451 wrapDropCap() {
452 const isDropCapEnabled = this.getElementSettings('drop_cap');
453 if (!isDropCapEnabled) {
454 // If there is an old drop cap inside the paragraph
455 if (this.dropCapLetter) {
456 this.elements.$dropCap.remove();
457 this.elements.$paragraph.prepend(this.dropCapLetter);
458 this.dropCapLetter = '';
459 }
460 return;
461 }
462 const $paragraph = this.elements.$paragraph;
463 if (!$paragraph.length) {
464 return;
465 }
466 const paragraphContent = $paragraph.html().replace(/&nbsp;/g, ' '),
467 firstLetterMatch = paragraphContent.match(/^ *([^ ] ?)/);
468 if (!firstLetterMatch) {
469 return;
470 }
471 const firstLetter = firstLetterMatch[1],
472 trimmedFirstLetter = firstLetter.trim();
473
474 // Don't apply drop cap when the content starting with an HTML tag
475 if ('<' === trimmedFirstLetter) {
476 return;
477 }
478 this.dropCapLetter = firstLetter;
479 this.elements.$dropCapLetter.text(trimmedFirstLetter);
480 const restoredParagraphContent = paragraphContent.slice(firstLetter.length).replace(/^ */, match => {
481 return new Array(match.length + 1).join('&nbsp;');
482 });
483 $paragraph.html(restoredParagraphContent).prepend(this.elements.$dropCap);
484 }
485 onInit() {
486 super.onInit(...arguments);
487 this.wrapDropCap();
488 }
489 onElementChange(propertyName) {
490 if ('drop_cap' === propertyName) {
491 this.wrapDropCap();
492 }
493 }
494 }
495 exports["default"] = TextEditor;
496
497 /***/ }),
498
499 /***/ "../assets/dev/js/frontend/handlers/toggle.js":
500 /*!****************************************************!*\
501 !*** ../assets/dev/js/frontend/handlers/toggle.js ***!
502 \****************************************************/
503 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
504
505 "use strict";
506
507
508 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
509 Object.defineProperty(exports, "__esModule", ({
510 value: true
511 }));
512 exports["default"] = void 0;
513 var _baseTabs = _interopRequireDefault(__webpack_require__(/*! ./base-tabs */ "../assets/dev/js/frontend/handlers/base-tabs.js"));
514 class Toggle extends _baseTabs.default {
515 getDefaultSettings() {
516 const defaultSettings = super.getDefaultSettings();
517 return {
518 ...defaultSettings,
519 showTabFn: 'slideDown',
520 hideTabFn: 'slideUp',
521 hidePrevious: false,
522 autoExpand: 'editor'
523 };
524 }
525 }
526 exports["default"] = Toggle;
527
528 /***/ }),
529
530 /***/ "../assets/dev/js/frontend/handlers/video.js":
531 /*!***************************************************!*\
532 !*** ../assets/dev/js/frontend/handlers/video.js ***!
533 \***************************************************/
534 /***/ ((__unused_webpack_module, exports) => {
535
536 "use strict";
537
538
539 Object.defineProperty(exports, "__esModule", ({
540 value: true
541 }));
542 exports["default"] = void 0;
543 class Video extends elementorModules.frontend.handlers.Base {
544 getDefaultSettings() {
545 return {
546 selectors: {
547 imageOverlay: '.elementor-custom-embed-image-overlay',
548 video: '.elementor-video',
549 videoIframe: '.elementor-video-iframe',
550 playIcon: '.elementor-custom-embed-play'
551 }
552 };
553 }
554 getDefaultElements() {
555 const selectors = this.getSettings('selectors');
556 return {
557 $imageOverlay: this.$element.find(selectors.imageOverlay),
558 $video: this.$element.find(selectors.video),
559 $videoIframe: this.$element.find(selectors.videoIframe),
560 $playIcon: this.$element.find(selectors.playIcon)
561 };
562 }
563 handleVideo() {
564 if (this.getElementSettings('lightbox')) {
565 return;
566 }
567 if ('youtube' === this.getElementSettings('video_type')) {
568 this.apiProvider.onApiReady(apiObject => {
569 this.elements.$imageOverlay.remove();
570 this.prepareYTVideo(apiObject, true);
571 });
572 } else {
573 this.elements.$imageOverlay.remove();
574 this.playVideo();
575 }
576 }
577 playVideo() {
578 if (this.elements.$video.length) {
579 // This.youtubePlayer exists only for YouTube videos, and its play function is different.
580 if (this.youtubePlayer) {
581 this.youtubePlayer.playVideo();
582 } else {
583 this.elements.$video[0].play();
584 }
585 return;
586 }
587 const $videoIframe = this.elements.$videoIframe,
588 lazyLoad = $videoIframe.data('lazy-load');
589 if (lazyLoad) {
590 $videoIframe.attr('src', lazyLoad);
591 }
592 $videoIframe[0].src = this.apiProvider.getAutoplayURL($videoIframe[0].src);
593 }
594 async animateVideo() {
595 const lightbox = await elementorFrontend.utils.lightbox;
596 lightbox.setEntranceAnimation(this.getCurrentDeviceSetting('lightbox_content_animation'));
597 }
598 async handleAspectRatio() {
599 const lightbox = await elementorFrontend.utils.lightbox;
600 lightbox.setVideoAspectRatio(this.getElementSettings('aspect_ratio'));
601 }
602 async hideLightbox() {
603 const lightbox = await elementorFrontend.utils.lightbox;
604 lightbox.getModal().hide();
605 }
606 prepareYTVideo(YT, onOverlayClick) {
607 const elementSettings = this.getElementSettings(),
608 playerOptions = {
609 videoId: this.videoID,
610 events: {
611 onReady: () => {
612 if (elementSettings.mute) {
613 this.youtubePlayer.mute();
614 }
615 if (elementSettings.autoplay || onOverlayClick) {
616 this.youtubePlayer.playVideo();
617 }
618 },
619 onStateChange: event => {
620 if (event.data === YT.PlayerState.ENDED && elementSettings.loop) {
621 this.youtubePlayer.seekTo(elementSettings.start || 0);
622 }
623 }
624 },
625 playerVars: {
626 controls: elementSettings.controls ? 1 : 0,
627 rel: elementSettings.rel ? 1 : 0,
628 playsinline: elementSettings.play_on_mobile ? 1 : 0,
629 modestbranding: elementSettings.modestbranding ? 1 : 0,
630 autoplay: elementSettings.autoplay ? 1 : 0,
631 start: elementSettings.start,
632 end: elementSettings.end
633 }
634 };
635
636 // To handle CORS issues, when the default host is changed, the origin parameter has to be set.
637 if (elementSettings.yt_privacy) {
638 playerOptions.host = 'https://www.youtube-nocookie.com';
639 playerOptions.origin = window.location.hostname;
640 }
641 this.youtubePlayer = new YT.Player(this.elements.$video[0], playerOptions);
642 }
643 bindEvents() {
644 this.elements.$imageOverlay.on('click', this.handleVideo.bind(this));
645 this.elements.$playIcon.on('keydown', event => {
646 const playKeys = [13,
647 // Enter key.
648 32 // Space bar key.
649 ];
650
651 if (playKeys.includes(event.keyCode)) {
652 this.handleVideo();
653 }
654 });
655 }
656 onInit() {
657 super.onInit();
658 const elementSettings = this.getElementSettings();
659 if (elementorFrontend.utils[elementSettings.video_type]) {
660 this.apiProvider = elementorFrontend.utils[elementSettings.video_type];
661 } else {
662 this.apiProvider = elementorFrontend.utils.baseVideoLoader;
663 }
664 if ('youtube' !== elementSettings.video_type) {
665 // Currently the only API integration in the Video widget is for the YT API
666 return;
667 }
668 this.videoID = this.apiProvider.getVideoIDFromURL(elementSettings.youtube_url);
669
670 // If there is an image overlay, the YouTube video prep method will be triggered on click
671 if (!this.videoID) {
672 return;
673 }
674
675 // If the user is using an image overlay, loading the API happens on overlay click instead of on init.
676 if (elementSettings.show_image_overlay && elementSettings.image_overlay.url) {
677 return;
678 }
679 if (elementSettings.lazy_load) {
680 this.intersectionObserver = elementorModules.utils.Scroll.scrollObserver({
681 callback: event => {
682 if (event.isInViewport) {
683 this.intersectionObserver.unobserve(this.elements.$video.parent()[0]);
684 this.apiProvider.onApiReady(apiObject => this.prepareYTVideo(apiObject));
685 }
686 }
687 });
688
689 // We observe the parent, since the video container has a height of 0.
690 this.intersectionObserver.observe(this.elements.$video.parent()[0]);
691 return;
692 }
693
694 // When Optimized asset loading is set to off, the video type is set to 'Youtube', and 'Privacy Mode' is set
695 // to 'On', there might be a conflict with other videos that are loaded WITHOUT privacy mode, such as a
696 // video bBackground in a section. In these cases, to avoid the conflict, a timeout is added to postpone the
697 // initialization of the Youtube API object.
698 if (!elementorFrontend.config.experimentalFeatures.e_optimized_assets_loading) {
699 setTimeout(() => {
700 this.apiProvider.onApiReady(apiObject => this.prepareYTVideo(apiObject));
701 }, 0);
702 } else {
703 this.apiProvider.onApiReady(apiObject => this.prepareYTVideo(apiObject));
704 }
705 }
706 onElementChange(propertyName) {
707 if (0 === propertyName.indexOf('lightbox_content_animation')) {
708 this.animateVideo();
709 return;
710 }
711 const isLightBoxEnabled = this.getElementSettings('lightbox');
712 if ('lightbox' === propertyName && !isLightBoxEnabled) {
713 this.hideLightbox();
714 return;
715 }
716 if ('aspect_ratio' === propertyName && isLightBoxEnabled) {
717 this.handleAspectRatio();
718 }
719 }
720 }
721 exports["default"] = Video;
722
723 /***/ }),
724
725 /***/ "../assets/dev/js/frontend/preloaded-modules.js":
726 /*!******************************************************!*\
727 !*** ../assets/dev/js/frontend/preloaded-modules.js ***!
728 \******************************************************/
729 /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
730
731 "use strict";
732
733
734 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
735 var _accordion = _interopRequireDefault(__webpack_require__(/*! ./handlers/accordion */ "../assets/dev/js/frontend/handlers/accordion.js"));
736 var _alert = _interopRequireDefault(__webpack_require__(/*! ./handlers/alert */ "../assets/dev/js/frontend/handlers/alert.js"));
737 var _counter = _interopRequireDefault(__webpack_require__(/*! ./handlers/counter */ "../assets/dev/js/frontend/handlers/counter.js"));
738 var _progress = _interopRequireDefault(__webpack_require__(/*! ./handlers/progress */ "../assets/dev/js/frontend/handlers/progress.js"));
739 var _tabs = _interopRequireDefault(__webpack_require__(/*! ./handlers/tabs */ "../assets/dev/js/frontend/handlers/tabs.js"));
740 var _toggle = _interopRequireDefault(__webpack_require__(/*! ./handlers/toggle */ "../assets/dev/js/frontend/handlers/toggle.js"));
741 var _video = _interopRequireDefault(__webpack_require__(/*! ./handlers/video */ "../assets/dev/js/frontend/handlers/video.js"));
742 var _imageCarousel = _interopRequireDefault(__webpack_require__(/*! ./handlers/image-carousel */ "../assets/dev/js/frontend/handlers/image-carousel.js"));
743 var _textEditor = _interopRequireDefault(__webpack_require__(/*! ./handlers/text-editor */ "../assets/dev/js/frontend/handlers/text-editor.js"));
744 var _nestedTabs = _interopRequireDefault(__webpack_require__(/*! elementor/modules/nested-tabs/assets/js/frontend/handlers/nested-tabs */ "../modules/nested-tabs/assets/js/frontend/handlers/nested-tabs.js"));
745 var _nestedAccordion = _interopRequireDefault(__webpack_require__(/*! elementor/modules/nested-accordion/assets/js/frontend/handlers/nested-accordion */ "../modules/nested-accordion/assets/js/frontend/handlers/nested-accordion.js"));
746 var _lightbox = _interopRequireDefault(__webpack_require__(/*! elementor-frontend/utils/lightbox/lightbox */ "../assets/dev/js/frontend/utils/lightbox/lightbox.js"));
747 elementorFrontend.elements.$window.on('elementor/frontend/init', () => {
748 elementorFrontend.elementsHandler.elementsHandlers = {
749 'accordion.default': _accordion.default,
750 'alert.default': _alert.default,
751 'counter.default': _counter.default,
752 'progress.default': _progress.default,
753 'tabs.default': _tabs.default,
754 'nested-tabs.default': _nestedTabs.default,
755 'nested-accordion.default': _nestedAccordion.default,
756 'toggle.default': _toggle.default,
757 'video.default': _video.default,
758 'image-carousel.default': _imageCarousel.default,
759 'text-editor.default': _textEditor.default
760 };
761 elementorFrontend.on('components:init', () => {
762 // We first need to delete the property because by default it's a getter function that cannot be overwritten.
763 delete elementorFrontend.utils.lightbox;
764 elementorFrontend.utils.lightbox = new _lightbox.default();
765 });
766 });
767
768 /***/ }),
769
770 /***/ "../assets/dev/js/frontend/utils/icons/e-icons.js":
771 /*!********************************************************!*\
772 !*** ../assets/dev/js/frontend/utils/icons/e-icons.js ***!
773 \********************************************************/
774 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
775
776 "use strict";
777
778
779 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
780 Object.defineProperty(exports, "__esModule", ({
781 value: true
782 }));
783 exports.zoomOutBold = exports.zoomInBold = exports.twitter = exports.shareArrow = exports.pinterest = exports.loading = exports.frameMinimize = exports.frameExpand = exports.facebook = exports.downloadBold = exports.close = exports.chevronRight = exports.chevronLeft = void 0;
784 var _manager = _interopRequireDefault(__webpack_require__(/*! ./manager */ "../assets/dev/js/frontend/utils/icons/manager.js"));
785 // This file is automatically generated, please don't change anything in this file.
786
787 const iconsManager = new _manager.default('eicon');
788 const chevronLeft = {
789 get element() {
790 const svgData = {
791 path: 'M646 125C629 125 613 133 604 142L308 442C296 454 292 471 292 487 292 504 296 521 308 533L604 854C617 867 629 875 646 875 663 875 679 871 692 858 704 846 713 829 713 812 713 796 708 779 692 767L438 487 692 225C700 217 708 204 708 187 708 171 704 154 692 142 675 129 663 125 646 125Z',
792 width: 1000,
793 height: 1000
794 };
795 return iconsManager.createSvgElement('chevron-left', svgData);
796 }
797 };
798 exports.chevronLeft = chevronLeft;
799 const chevronRight = {
800 get element() {
801 const svgData = {
802 path: 'M696 533C708 521 713 504 713 487 713 471 708 454 696 446L400 146C388 133 375 125 354 125 338 125 325 129 313 142 300 154 292 171 292 187 292 204 296 221 308 233L563 492 304 771C292 783 288 800 288 817 288 833 296 850 308 863 321 871 338 875 354 875 371 875 388 867 400 854L696 533Z',
803 width: 1000,
804 height: 1000
805 };
806 return iconsManager.createSvgElement('chevron-right', svgData);
807 }
808 };
809 exports.chevronRight = chevronRight;
810 const close = {
811 get element() {
812 const svgData = {
813 path: 'M742 167L500 408 258 167C246 154 233 150 217 150 196 150 179 158 167 167 154 179 150 196 150 212 150 229 154 242 171 254L408 500 167 742C138 771 138 800 167 829 196 858 225 858 254 829L496 587 738 829C750 842 767 846 783 846 800 846 817 842 829 829 842 817 846 804 846 783 846 767 842 750 829 737L588 500 833 258C863 229 863 200 833 171 804 137 775 137 742 167Z',
814 width: 1000,
815 height: 1000
816 };
817 return iconsManager.createSvgElement('close', svgData);
818 }
819 };
820 exports.close = close;
821 const downloadBold = {
822 get element() {
823 const svgData = {
824 path: 'M572 42H428C405 42 385 61 385 85V385H228C197 385 180 424 203 447L475 719C489 732 511 732 524 719L797 447C819 424 803 385 771 385H614V85C615 61 595 42 572 42ZM958 915V715C958 691 939 672 915 672H653L565 760C529 796 471 796 435 760L347 672H85C61 672 42 691 42 715V915C42 939 61 958 85 958H915C939 958 958 939 958 915ZM736 873C736 853 720 837 700 837 681 837 665 853 665 873 665 892 681 908 700 908 720 908 736 892 736 873ZM815 837C835 837 851 853 851 873 851 892 835 908 815 908 795 908 779 892 779 873 779 853 795 837 815 837Z',
825 width: 1000,
826 height: 1000
827 };
828 return iconsManager.createSvgElement('download-bold', svgData);
829 }
830 };
831 exports.downloadBold = downloadBold;
832 const facebook = {
833 get element() {
834 const svgData = {
835 path: 'M858 42H142C88 42 42 87 42 142V863C42 913 88 958 142 958H421V646H292V500H421V387C421 258 496 192 613 192 667 192 725 200 725 200V325H663C600 325 579 362 579 404V500H721L700 646H583V958H863C917 958 963 913 963 858V142C958 87 913 42 858 42L858 42Z',
836 width: 1000,
837 height: 1000
838 };
839 return iconsManager.createSvgElement('facebook', svgData);
840 }
841 };
842 exports.facebook = facebook;
843 const frameExpand = {
844 get element() {
845 const svgData = {
846 path: 'M863 583C890 583 914 605 916 632L917 637V863L916 868C914 893 893 914 868 916L863 917H638L632 916C607 914 586 893 584 868L583 863 584 857C586 832 607 811 632 809L638 808H808V637L809 632C811 605 835 583 863 583ZM138 583C165 583 189 605 191 632L192 637V808H363C390 808 414 830 416 857L417 863C417 890 395 914 368 916L363 917H138C110 917 86 895 84 868L83 863V637C83 607 108 583 138 583ZM863 83C890 83 914 105 916 132L917 137V362C917 392 893 417 863 417 835 417 811 395 809 368L808 362V192H638C610 192 586 170 584 143L583 137C583 110 605 86 632 84L638 83H863ZM363 83L368 84C393 86 414 107 416 132L417 137 416 143C414 168 393 189 368 191L363 192H192V362L191 368C189 395 165 417 138 417S86 395 84 368L83 362V137L84 132C86 107 107 86 132 84L138 83H363Z',
847 width: 1000,
848 height: 1000
849 };
850 return iconsManager.createSvgElement('frame-expand', svgData);
851 }
852 };
853 exports.frameExpand = frameExpand;
854 const frameMinimize = {
855 get element() {
856 const svgData = {
857 path: 'M363 583C392 583 413 604 417 633L417 637V863C417 892 392 917 363 917 333 917 313 896 308 867L308 863V692H138C108 692 88 671 83 642L83 637C83 608 104 587 133 583L138 583H363ZM638 583C608 583 588 604 583 633L583 637V863C583 892 608 917 638 917 667 917 688 896 692 867L692 863V692H863C892 692 913 671 917 642L917 637C917 608 896 587 867 583L863 583H638ZM363 417C392 417 413 396 417 367L417 362V137C417 108 392 83 363 83 333 83 313 104 308 133L308 137V308H138C108 308 88 329 83 358L83 362C83 392 104 412 133 417L138 417H363ZM638 417C608 417 588 396 583 367L583 362V137C583 108 608 83 638 83 667 83 688 104 692 133L692 137V308H863C892 308 913 329 917 358L917 362C917 392 896 412 867 417L863 417H638Z',
858 width: 1000,
859 height: 1000
860 };
861 return iconsManager.createSvgElement('frame-minimize', svgData);
862 }
863 };
864 exports.frameMinimize = frameMinimize;
865 const loading = {
866 get element() {
867 const svgData = {
868 path: 'M500 975V858C696 858 858 696 858 500S696 142 500 142 142 304 142 500H25C25 237 238 25 500 25S975 237 975 500 763 975 500 975Z',
869 width: 1000,
870 height: 1000
871 };
872 return iconsManager.createSvgElement('loading', svgData);
873 }
874 };
875 exports.loading = loading;
876 const pinterest = {
877 get element() {
878 const svgData = {
879 path: 'M950 496C950 746 746 950 496 950 450 950 404 942 363 929 379 900 408 850 421 808 425 787 450 700 450 700 467 729 508 754 554 754 692 754 792 629 792 471 792 321 671 208 513 208 317 208 213 342 213 483 213 550 250 633 304 658 313 662 317 662 321 654 321 650 329 617 333 604 333 600 333 596 329 592 313 567 296 525 296 487 288 387 367 292 496 292 608 292 688 367 688 475 688 600 625 683 546 683 500 683 467 646 479 600 492 546 517 487 517 450 517 417 500 387 458 387 413 387 375 433 375 496 375 537 388 562 388 562S342 754 333 787C325 825 329 883 333 917 163 854 42 687 42 496 42 246 246 42 496 42S950 246 950 496Z',
880 width: 1000,
881 height: 1000
882 };
883 return iconsManager.createSvgElement('pinterest', svgData);
884 }
885 };
886 exports.pinterest = pinterest;
887 const shareArrow = {
888 get element() {
889 const svgData = {
890 path: 'M946 383L667 133C642 112 604 129 604 162V292C238 296 71 637 42 812 238 587 363 521 604 517V658C604 692 642 708 667 687L946 442C963 425 963 400 946 383Z',
891 width: 1000,
892 height: 1000
893 };
894 return iconsManager.createSvgElement('share-arrow', svgData);
895 }
896 };
897 exports.shareArrow = shareArrow;
898 const twitter = {
899 get element() {
900 const svgData = {
901 path: 'M863 312C863 321 863 329 863 337 863 587 675 871 329 871 221 871 125 842 42 787 58 787 71 792 88 792 175 792 254 762 321 712 238 712 171 658 146 583 158 583 171 587 183 587 200 587 217 583 233 579 146 562 83 487 83 396V387C108 400 138 408 167 412 117 379 83 321 83 254 83 221 92 187 108 158 200 271 342 346 496 354 492 342 492 325 492 312 492 208 575 125 679 125 733 125 783 146 817 183 858 175 900 158 938 137 925 179 896 217 854 242 892 237 929 229 963 212 933 250 900 283 863 312Z',
902 width: 1000,
903 height: 1000
904 };
905 return iconsManager.createSvgElement('twitter', svgData);
906 }
907 };
908 exports.twitter = twitter;
909 const zoomInBold = {
910 get element() {
911 const svgData = {
912 path: 'M388 383V312C388 283 413 258 442 258 471 258 496 283 496 312V383H567C596 383 621 408 621 437S596 492 567 492H496V562C496 592 471 617 442 617 413 617 388 592 388 562V492H317C288 492 263 467 263 437S288 383 317 383H388ZM654 733C592 779 517 804 438 804 233 804 71 642 71 437S233 71 438 71 804 233 804 437C804 521 779 596 733 654L896 817C917 837 917 871 896 892 875 913 842 913 821 892L654 733ZM438 696C579 696 696 579 696 437S579 179 438 179 179 296 179 437 296 696 438 696Z',
913 width: 1000,
914 height: 1000
915 };
916 return iconsManager.createSvgElement('zoom-in-bold', svgData);
917 }
918 };
919 exports.zoomInBold = zoomInBold;
920 const zoomOutBold = {
921 get element() {
922 const svgData = {
923 path: 'M750 683L946 879C963 896 963 929 946 946 929 963 896 967 879 946L683 750C617 804 533 833 438 833 221 833 42 654 42 437S221 42 438 42 833 221 833 437C833 529 800 612 750 683ZM296 392H575C600 392 621 412 621 442 621 467 600 487 575 487H296C271 487 250 467 250 442 250 412 271 392 296 392ZM438 737C604 737 738 604 738 437S604 137 438 137 138 271 138 437 271 737 438 737Z',
924 width: 1000,
925 height: 1000
926 };
927 return iconsManager.createSvgElement('zoom-out-bold', svgData);
928 }
929 };
930 exports.zoomOutBold = zoomOutBold;
931
932 /***/ }),
933
934 /***/ "../assets/dev/js/frontend/utils/icons/manager.js":
935 /*!********************************************************!*\
936 !*** ../assets/dev/js/frontend/utils/icons/manager.js ***!
937 \********************************************************/
938 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
939
940 "use strict";
941
942
943 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
944 Object.defineProperty(exports, "__esModule", ({
945 value: true
946 }));
947 exports["default"] = void 0;
948 var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../node_modules/@babel/runtime/helpers/defineProperty.js"));
949 class IconsManager {
950 constructor(elementsPrefix) {
951 this.prefix = `${elementsPrefix}-`;
952 this.createSvgSymbolsContainer();
953 }
954 createSvgElement(name, _ref) {
955 let {
956 path,
957 width,
958 height
959 } = _ref;
960 const iconName = this.prefix + name,
961 iconSelector = '#' + this.prefix + name;
962
963 // Create symbol if not exist yet.
964 if (!IconsManager.iconsUsageList.includes(iconName)) {
965 if (!IconsManager.symbolsContainer.querySelector(iconSelector)) {
966 const symbol = this.createSymbolElement({
967 id: iconName,
968 path,
969 width,
970 height
971 });
972 IconsManager.symbolsContainer.appendChild(symbol);
973 }
974 IconsManager.iconsUsageList.push(iconName);
975 }
976 return this.createSvgIconElement({
977 iconName,
978 iconSelector
979 });
980 }
981 createSvgNode(tag, _ref2) {
982 let {
983 props = {},
984 attrs = {}
985 } = _ref2;
986 const node = document.createElementNS('http://www.w3.org/2000/svg', tag);
987 Object.keys(props).map(key => node[key] = props[key]);
988 Object.keys(attrs).map(key => node.setAttributeNS(null, key, attrs[key]));
989 return node;
990 }
991 createSvgIconElement(_ref3) {
992 let {
993 iconName,
994 iconSelector
995 } = _ref3;
996 return this.createSvgNode('svg', {
997 props: {
998 innerHTML: '<use xlink:href="' + iconSelector + '" />'
999 },
1000 attrs: {
1001 class: 'e-font-icon-svg e-' + iconName
1002 }
1003 });
1004 }
1005 createSvgSymbolsContainer() {
1006 if (!IconsManager.symbolsContainer) {
1007 const symbolsContainerId = 'e-font-icon-svg-symbols';
1008 IconsManager.symbolsContainer = document.getElementById(symbolsContainerId);
1009 if (!IconsManager.symbolsContainer) {
1010 IconsManager.symbolsContainer = this.createSvgNode('svg', {
1011 attrs: {
1012 style: 'display: none;',
1013 class: symbolsContainerId
1014 }
1015 });
1016 document.body.appendChild(IconsManager.symbolsContainer);
1017 }
1018 }
1019 }
1020 createSymbolElement(_ref4) {
1021 let {
1022 id,
1023 path,
1024 width,
1025 height
1026 } = _ref4;
1027 return this.createSvgNode('symbol', {
1028 props: {
1029 innerHTML: '<path d="' + path + '"></path>',
1030 id
1031 },
1032 attrs: {
1033 viewBox: '0 0 ' + width + ' ' + height
1034 }
1035 });
1036 }
1037 }
1038 exports["default"] = IconsManager;
1039 (0, _defineProperty2.default)(IconsManager, "symbolsContainer", void 0);
1040 (0, _defineProperty2.default)(IconsManager, "iconsUsageList", []);
1041
1042 /***/ }),
1043
1044 /***/ "../assets/dev/js/frontend/utils/lightbox/lightbox.js":
1045 /*!************************************************************!*\
1046 !*** ../assets/dev/js/frontend/utils/lightbox/lightbox.js ***!
1047 \************************************************************/
1048 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1049
1050 "use strict";
1051
1052
1053 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
1054 var _screenfull = _interopRequireDefault(__webpack_require__(/*! ./screenfull */ "../assets/dev/js/frontend/utils/lightbox/screenfull.js"));
1055 var _eIcons = __webpack_require__(/*! @elementor/e-icons */ "../assets/dev/js/frontend/utils/icons/e-icons.js");
1056 module.exports = elementorModules.ViewModule.extend({
1057 oldAspectRatio: null,
1058 oldAnimation: null,
1059 swiper: null,
1060 player: null,
1061 isFontIconSvgExperiment: elementorFrontend.config.experimentalFeatures.e_font_icon_svg,
1062 getDefaultSettings() {
1063 return {
1064 classes: {
1065 aspectRatio: 'elementor-aspect-ratio-%s',
1066 item: 'elementor-lightbox-item',
1067 image: 'elementor-lightbox-image',
1068 videoContainer: 'elementor-video-container',
1069 videoWrapper: 'elementor-fit-aspect-ratio',
1070 playButton: 'elementor-custom-embed-play',
1071 playButtonIcon: 'fa',
1072 playing: 'elementor-playing',
1073 hidden: 'elementor-hidden',
1074 invisible: 'elementor-invisible',
1075 preventClose: 'elementor-lightbox-prevent-close',
1076 slideshow: {
1077 container: elementorFrontend.config.swiperClass,
1078 slidesWrapper: 'swiper-wrapper',
1079 prevButton: 'elementor-swiper-button elementor-swiper-button-prev',
1080 nextButton: 'elementor-swiper-button elementor-swiper-button-next',
1081 prevButtonIcon: 'eicon-chevron-left',
1082 nextButtonIcon: 'eicon-chevron-right',
1083 slide: 'swiper-slide',
1084 header: 'elementor-slideshow__header',
1085 footer: 'elementor-slideshow__footer',
1086 title: 'elementor-slideshow__title',
1087 description: 'elementor-slideshow__description',
1088 counter: 'elementor-slideshow__counter',
1089 iconExpand: 'eicon-frame-expand',
1090 iconShrink: 'eicon-frame-minimize',
1091 iconZoomIn: 'eicon-zoom-in-bold',
1092 iconZoomOut: 'eicon-zoom-out-bold',
1093 iconShare: 'eicon-share-arrow',
1094 shareMenu: 'elementor-slideshow__share-menu',
1095 shareLinks: 'elementor-slideshow__share-links',
1096 hideUiVisibility: 'elementor-slideshow--ui-hidden',
1097 shareMode: 'elementor-slideshow--share-mode',
1098 fullscreenMode: 'elementor-slideshow--fullscreen-mode',
1099 zoomMode: 'elementor-slideshow--zoom-mode'
1100 }
1101 },
1102 selectors: {
1103 image: '.elementor-lightbox-image',
1104 links: 'a, [data-elementor-lightbox]',
1105 slideshow: {
1106 activeSlide: '.swiper-slide-active',
1107 prevSlide: '.swiper-slide-prev',
1108 nextSlide: '.swiper-slide-next'
1109 }
1110 },
1111 modalOptions: {
1112 id: 'elementor-lightbox',
1113 entranceAnimation: 'zoomIn',
1114 videoAspectRatio: 169,
1115 position: {
1116 enable: false
1117 }
1118 }
1119 };
1120 },
1121 getModal() {
1122 if (!module.exports.modal) {
1123 this.initModal();
1124 }
1125 return module.exports.modal;
1126 },
1127 initModal() {
1128 const closeIcon = {};
1129
1130 // If the experiment is active the closeIcon should be an entire SVG element otherwise it should pass the eicon class name.
1131 if (this.isFontIconSvgExperiment) {
1132 closeIcon.iconElement = _eIcons.close.element;
1133 } else {
1134 closeIcon.iconClass = 'eicon-close';
1135 }
1136 const modal = module.exports.modal = elementorFrontend.getDialogsManager().createWidget('lightbox', {
1137 className: 'elementor-lightbox',
1138 closeButton: true,
1139 closeButtonOptions: {
1140 ...closeIcon,
1141 attributes: {
1142 role: 'button',
1143 tabindex: 0,
1144 'aria-label': elementorFrontend.config.i18n.close + ' (Esc)'
1145 }
1146 },
1147 selectors: {
1148 preventClose: '.' + this.getSettings('classes.preventClose')
1149 },
1150 hide: {
1151 onClick: true
1152 }
1153 });
1154 modal.on('hide', function () {
1155 modal.setMessage('');
1156 });
1157 },
1158 showModal(options) {
1159 if (options.url && !options.url.startsWith('http')) {
1160 return;
1161 }
1162 this.elements.$closeButton = this.getModal().getElements('closeButton');
1163 this.$buttons = this.elements.$closeButton;
1164 this.focusedButton = null;
1165 const self = this,
1166 defaultOptions = self.getDefaultSettings().modalOptions;
1167 self.id = options.id;
1168 self.setSettings('modalOptions', jQuery.extend(defaultOptions, options.modalOptions));
1169 const modal = self.getModal();
1170 modal.setID(self.getSettings('modalOptions.id'));
1171 modal.onShow = function () {
1172 DialogsManager.getWidgetType('lightbox').prototype.onShow.apply(modal, arguments);
1173 self.setEntranceAnimation();
1174 };
1175 modal.onHide = function () {
1176 DialogsManager.getWidgetType('lightbox').prototype.onHide.apply(modal, arguments);
1177 modal.getElements('message').removeClass('animated');
1178 if (_screenfull.default.isFullscreen) {
1179 self.deactivateFullscreen();
1180 }
1181 self.unbindHotKeys();
1182 };
1183 switch (options.type) {
1184 case 'video':
1185 self.setVideoContent(options);
1186 break;
1187 case 'image':
1188 {
1189 const slides = [{
1190 image: options.url,
1191 index: 0,
1192 title: options.title,
1193 description: options.description,
1194 hash: options.hash
1195 }];
1196 options.slideshow = {
1197 slides,
1198 swiper: {
1199 loop: false,
1200 pagination: false
1201 }
1202 };
1203 self.setSlideshowContent(options.slideshow);
1204 break;
1205 }
1206 case 'slideshow':
1207 self.setSlideshowContent(options.slideshow);
1208 break;
1209 default:
1210 self.setHTMLContent(options.html);
1211 }
1212 modal.show();
1213 },
1214 createLightbox(element) {
1215 let lightboxData = {};
1216 if (element.dataset.elementorLightbox) {
1217 lightboxData = JSON.parse(element.dataset.elementorLightbox);
1218 }
1219 if (lightboxData.type && 'slideshow' !== lightboxData.type) {
1220 this.showModal(lightboxData);
1221 return;
1222 }
1223 if (!element.dataset.elementorLightboxSlideshow) {
1224 const slideshowID = 'single-img';
1225 this.showModal({
1226 type: 'image',
1227 id: slideshowID,
1228 url: element.href,
1229 hash: element.getAttribute('data-e-action-hash'),
1230 title: element.dataset.elementorLightboxTitle,
1231 description: element.dataset.elementorLightboxDescription,
1232 modalOptions: {
1233 id: 'elementor-lightbox-slideshow-' + slideshowID
1234 }
1235 });
1236 return;
1237 }
1238 const initialSlideURL = element.dataset.elementorLightboxVideo || element.href;
1239 this.openSlideshow(element.dataset.elementorLightboxSlideshow, initialSlideURL);
1240 },
1241 setHTMLContent(html) {
1242 if (window.elementorCommon) {
1243 elementorDevTools.deprecation.deprecated('elementorFrontend.utils.lightbox.setHTMLContent()', '3.1.4');
1244 }
1245 this.getModal().setMessage(html);
1246 },
1247 setVideoContent(options) {
1248 const $ = jQuery;
1249 let $videoElement;
1250 if ('hosted' === options.videoType) {
1251 const videoParams = $.extend({
1252 src: options.url,
1253 autoplay: ''
1254 }, options.videoParams);
1255 $videoElement = $('<video>', videoParams);
1256 } else {
1257 let apiProvider;
1258 if (-1 !== options.url.indexOf('vimeo.com')) {
1259 apiProvider = elementorFrontend.utils.vimeo;
1260 } else if (options.url.match(/^(?:https?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com|youtube-nocookie\.com)/)) {
1261 apiProvider = elementorFrontend.utils.youtube;
1262 } else {
1263 return;
1264 }
1265 $videoElement = $('<iframe>', {
1266 src: apiProvider.getAutoplayURL(options.url),
1267 allowfullscreen: 1
1268 });
1269 }
1270 const classes = this.getSettings('classes'),
1271 $videoContainer = $('<div>', {
1272 class: `${classes.videoContainer} ${classes.preventClose}`
1273 }),
1274 $videoWrapper = $('<div>', {
1275 class: classes.videoWrapper
1276 });
1277 $videoWrapper.append($videoElement);
1278 $videoContainer.append($videoWrapper);
1279 const modal = this.getModal();
1280 modal.setMessage($videoContainer);
1281 this.setVideoAspectRatio();
1282 const onHideMethod = modal.onHide;
1283 modal.onHide = function () {
1284 onHideMethod();
1285 this.$buttons = jQuery();
1286 this.focusedButton = null;
1287 modal.getElements('message').removeClass('elementor-fit-aspect-ratio');
1288 };
1289 },
1290 getShareLinks() {
1291 const {
1292 i18n
1293 } = elementorFrontend.config,
1294 socialNetworks = {
1295 facebook: {
1296 label: i18n.shareOnFacebook,
1297 iconElement: _eIcons.facebook
1298 },
1299 twitter: {
1300 label: i18n.shareOnTwitter,
1301 iconElement: _eIcons.twitter
1302 },
1303 pinterest: {
1304 label: i18n.pinIt,
1305 iconElement: _eIcons.pinterest
1306 }
1307 },
1308 $ = jQuery,
1309 classes = this.getSettings('classes'),
1310 selectors = this.getSettings('selectors'),
1311 $linkList = $('<div>', {
1312 class: classes.slideshow.shareLinks
1313 }),
1314 $activeSlide = this.getSlide('active'),
1315 $image = $activeSlide.find(selectors.image),
1316 videoUrl = $activeSlide.data('elementor-slideshow-video');
1317 let itemUrl;
1318 if (videoUrl) {
1319 itemUrl = videoUrl;
1320 } else {
1321 itemUrl = $image.attr('src');
1322 }
1323 $.each(socialNetworks, (key, data) => {
1324 const networkLabel = data.label,
1325 $link = $('<a>', {
1326 href: this.createShareLink(key, itemUrl, $activeSlide.attr('data-e-action-hash')),
1327 target: '_blank'
1328 }).text(networkLabel),
1329 $socialNetworkIconElement = this.isFontIconSvgExperiment ? $(data.iconElement.element) : $('<i>', {
1330 class: 'eicon-' + key,
1331 'aria-hidden': 'true'
1332 });
1333 $link.prepend($socialNetworkIconElement);
1334 $linkList.append($link);
1335 });
1336 if (!videoUrl) {
1337 const $downloadIcon = this.isFontIconSvgExperiment ? $(_eIcons.downloadBold.element) : $('<i>', {
1338 class: 'eicon-download-bold'
1339 });
1340 $downloadIcon.attr('aria-label', i18n.download);
1341 $linkList.append($('<a>', {
1342 href: itemUrl,
1343 download: ''
1344 }).text(i18n.downloadImage).prepend($downloadIcon));
1345 }
1346 return $linkList;
1347 },
1348 createShareLink(networkName, itemUrl) {
1349 let hash = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
1350 const options = {};
1351 if ('pinterest' === networkName) {
1352 options.image = encodeURIComponent(itemUrl);
1353 } else {
1354 options.url = encodeURIComponent(location.href.replace(/#.*/, '') + hash);
1355 }
1356 return ShareLink.getNetworkLink(networkName, options);
1357 },
1358 getSlideshowHeader() {
1359 const {
1360 i18n
1361 } = elementorFrontend.config,
1362 $ = jQuery,
1363 showCounter = 'yes' === elementorFrontend.getKitSettings('lightbox_enable_counter'),
1364 showFullscreen = 'yes' === elementorFrontend.getKitSettings('lightbox_enable_fullscreen'),
1365 showZoom = 'yes' === elementorFrontend.getKitSettings('lightbox_enable_zoom'),
1366 showShare = 'yes' === elementorFrontend.getKitSettings('lightbox_enable_share'),
1367 classes = this.getSettings('classes'),
1368 slideshowClasses = classes.slideshow,
1369 elements = this.elements;
1370 if (!(showCounter || showFullscreen || showZoom || showShare)) {
1371 return;
1372 }
1373 elements.$header = $('<header>', {
1374 class: slideshowClasses.header + ' ' + classes.preventClose
1375 });
1376 if (showShare) {
1377 const iconElement = this.isFontIconSvgExperiment ? _eIcons.shareArrow.element : '<i>';
1378 elements.$iconShare = $(iconElement, {
1379 class: slideshowClasses.iconShare,
1380 role: 'button',
1381 tabindex: 0,
1382 'aria-label': i18n.share,
1383 'aria-expanded': false
1384 }).append($('<span>'));
1385 const $shareLinks = $('<div>');
1386 $shareLinks.on('click', e => {
1387 e.stopPropagation();
1388 });
1389 elements.$shareMenu = $('<div>', {
1390 class: slideshowClasses.shareMenu
1391 }).append($shareLinks);
1392 elements.$iconShare.add(elements.$shareMenu).on('click', this.toggleShareMenu);
1393 elements.$header.append(elements.$iconShare, elements.$shareMenu);
1394 this.$buttons = this.$buttons.add(elements.$iconShare);
1395 }
1396 if (showZoom) {
1397 const iconElement = this.isFontIconSvgExperiment ? _eIcons.zoomInBold.element : '<i>',
1398 showZoomElements = [],
1399 showZoomAttrs = {
1400 role: 'switch',
1401 tabindex: 0,
1402 'aria-checked': false,
1403 'aria-label': i18n.zoom
1404 },
1405 zoomAttrs = {
1406 ...showZoomAttrs
1407 };
1408 if (!this.isFontIconSvgExperiment) {
1409 zoomAttrs.class = slideshowClasses.iconZoomIn;
1410 }
1411 elements.$iconZoom = $(iconElement).attr(zoomAttrs).on('click', this.toggleZoomMode);
1412 showZoomElements.push(elements.$iconZoom);
1413 if (this.isFontIconSvgExperiment) {
1414 elements.$iconZoomOut = $(_eIcons.zoomOutBold.element).attr(showZoomAttrs).addClass(classes.hidden).on('click', this.toggleZoomMode);
1415 showZoomElements.push(elements.$iconZoomOut);
1416 }
1417 elements.$header.append(showZoomElements);
1418 this.$buttons = this.$buttons.add(showZoomElements);
1419 }
1420 if (showFullscreen) {
1421 const iconElement = this.isFontIconSvgExperiment ? _eIcons.frameExpand.element : '<i>',
1422 fullScreenElements = [],
1423 fullScreenAttrs = {
1424 role: 'switch',
1425 tabindex: 0,
1426 'aria-checked': false,
1427 'aria-label': i18n.fullscreen
1428 },
1429 expandAttrs = {
1430 ...fullScreenAttrs
1431 };
1432
1433 // Only if the experiment is not active, we use the class-name in order to render the icon.
1434 if (!this.isFontIconSvgExperiment) {
1435 expandAttrs.class = slideshowClasses.iconExpand;
1436 }
1437 elements.$iconExpand = $(iconElement).append($('<span>'), $('<span>')).attr(expandAttrs).on('click', this.toggleFullscreen);
1438 fullScreenElements.push(elements.$iconExpand);
1439 if (this.isFontIconSvgExperiment) {
1440 elements.$iconMinimize = $(_eIcons.frameMinimize.element).attr(fullScreenAttrs).addClass(classes.hidden).on('click', this.toggleFullscreen);
1441 fullScreenElements.push(elements.$iconMinimize);
1442 }
1443 elements.$header.append(fullScreenElements);
1444 this.$buttons = this.$buttons.add(fullScreenElements);
1445 }
1446 if (showCounter) {
1447 elements.$counter = $('<span>', {
1448 class: slideshowClasses.counter
1449 });
1450 elements.$header.append(elements.$counter);
1451 }
1452 return elements.$header;
1453 },
1454 toggleFullscreen() {
1455 if (_screenfull.default.isFullscreen) {
1456 this.deactivateFullscreen();
1457 } else if (_screenfull.default.isEnabled) {
1458 this.activateFullscreen();
1459 }
1460 },
1461 toggleZoomMode() {
1462 if (1 !== this.swiper.zoom.scale) {
1463 this.deactivateZoom();
1464 } else {
1465 this.activateZoom();
1466 }
1467 },
1468 toggleShareMenu() {
1469 if (this.shareMode) {
1470 this.deactivateShareMode();
1471 } else {
1472 this.elements.$shareMenu.html(this.getShareLinks());
1473 this.activateShareMode();
1474 }
1475 },
1476 activateShareMode() {
1477 const classes = this.getSettings('classes');
1478 this.elements.$container.addClass(classes.slideshow.shareMode);
1479 this.elements.$iconShare.attr('aria-expanded', true);
1480
1481 // Prevent swiper interactions while in share mode
1482 this.swiper.detachEvents();
1483
1484 // Temporarily replace tabbable buttons with share-menu items
1485 this.$originalButtons = this.$buttons;
1486 this.$buttons = this.elements.$iconShare.add(this.elements.$shareMenu.find('a'));
1487 this.shareMode = true;
1488 },
1489 deactivateShareMode() {
1490 const classes = this.getSettings('classes');
1491 this.elements.$container.removeClass(classes.slideshow.shareMode);
1492 this.elements.$iconShare.attr('aria-expanded', false);
1493 this.swiper.attachEvents();
1494 this.$buttons = this.$originalButtons;
1495 this.shareMode = false;
1496 },
1497 activateFullscreen() {
1498 const classes = this.getSettings('classes');
1499 _screenfull.default.request(this.elements.$container.parents('.dialog-widget')[0]);
1500 if (this.isFontIconSvgExperiment) {
1501 this.elements.$iconExpand.addClass(classes.hidden).attr('aria-checked', 'false');
1502 this.elements.$iconMinimize.removeClass(classes.hidden).attr('aria-checked', 'true');
1503 } else {
1504 this.elements.$iconExpand.removeClass(classes.slideshow.iconExpand).addClass(classes.slideshow.iconShrink).attr('aria-checked', 'true');
1505 }
1506 this.elements.$container.addClass(classes.slideshow.fullscreenMode);
1507 },
1508 deactivateFullscreen() {
1509 const classes = this.getSettings('classes');
1510 _screenfull.default.exit();
1511 if (this.isFontIconSvgExperiment) {
1512 this.elements.$iconExpand.removeClass(classes.hidden).attr('aria-checked', 'true');
1513 this.elements.$iconMinimize.addClass(classes.hidden).attr('aria-checked', 'false');
1514 } else {
1515 this.elements.$iconExpand.removeClass(classes.slideshow.iconShrink).addClass(classes.slideshow.iconExpand).attr('aria-checked', 'false');
1516 }
1517 this.elements.$container.removeClass(classes.slideshow.fullscreenMode);
1518 },
1519 activateZoom() {
1520 const swiper = this.swiper,
1521 elements = this.elements,
1522 classes = this.getSettings('classes');
1523 swiper.zoom.in();
1524 swiper.allowSlideNext = false;
1525 swiper.allowSlidePrev = false;
1526 swiper.allowTouchMove = false;
1527 elements.$container.addClass(classes.slideshow.zoomMode);
1528 if (this.isFontIconSvgExperiment) {
1529 elements.$iconZoom.addClass(classes.hidden).attr('aria-checked', 'false');
1530 elements.$iconZoomOut.removeClass(classes.hidden).attr('aria-checked', 'true');
1531 } else {
1532 elements.$iconZoom.removeClass(classes.slideshow.iconZoomIn).addClass(classes.slideshow.iconZoomOut);
1533 }
1534 },
1535 deactivateZoom() {
1536 const swiper = this.swiper,
1537 elements = this.elements,
1538 classes = this.getSettings('classes');
1539 swiper.zoom.out();
1540 swiper.allowSlideNext = true;
1541 swiper.allowSlidePrev = true;
1542 swiper.allowTouchMove = true;
1543 elements.$container.removeClass(classes.slideshow.zoomMode);
1544 if (this.isFontIconSvgExperiment) {
1545 elements.$iconZoom.removeClass(classes.hidden).attr('aria-checked', 'true');
1546 elements.$iconZoomOut.addClass(classes.hidden).attr('aria-checked', 'false');
1547 } else {
1548 elements.$iconZoom.removeClass(classes.slideshow.iconZoomOut).addClass(classes.slideshow.iconZoomIn);
1549 }
1550 },
1551 getSlideshowFooter() {
1552 const $ = jQuery,
1553 classes = this.getSettings('classes'),
1554 $footer = $('<footer>', {
1555 class: classes.slideshow.footer + ' ' + classes.preventClose
1556 }),
1557 $title = $('<div>', {
1558 class: classes.slideshow.title
1559 }),
1560 $description = $('<div>', {
1561 class: classes.slideshow.description
1562 });
1563 $footer.append($title, $description);
1564 return $footer;
1565 },
1566 setSlideshowContent(options) {
1567 const {
1568 i18n
1569 } = elementorFrontend.config,
1570 $ = jQuery,
1571 isSingleSlide = 1 === options.slides.length,
1572 hasTitle = '' !== elementorFrontend.getKitSettings('lightbox_title_src'),
1573 hasDescription = '' !== elementorFrontend.getKitSettings('lightbox_description_src'),
1574 showFooter = hasTitle || hasDescription,
1575 classes = this.getSettings('classes'),
1576 slideshowClasses = classes.slideshow,
1577 $container = $('<div>', {
1578 class: slideshowClasses.container
1579 }),
1580 $slidesWrapper = $('<div>', {
1581 class: slideshowClasses.slidesWrapper
1582 });
1583 let $prevButton, $nextButton;
1584 options.slides.forEach(slide => {
1585 let slideClass = slideshowClasses.slide + ' ' + classes.item;
1586 if (slide.video) {
1587 slideClass += ' ' + classes.video;
1588 }
1589 const $slide = $('<div>', {
1590 class: slideClass
1591 });
1592 if (slide.video) {
1593 $slide.attr('data-elementor-slideshow-video', slide.video);
1594 const playVideoLoadingElement = this.isFontIconSvgExperiment ? _eIcons.loading.element : '<i>',
1595 $playIcon = $('<div>', {
1596 class: classes.playButton
1597 }).html($(playVideoLoadingElement).attr('aria-label', i18n.playVideo).addClass(classes.playButtonIcon));
1598 $slide.append($playIcon);
1599 } else {
1600 const $zoomContainer = $('<div>', {
1601 class: 'swiper-zoom-container'
1602 }),
1603 $slidePlaceholder = $('<div class="swiper-lazy-preloader"></div>'),
1604 imageAttributes = {
1605 'data-src': slide.image,
1606 class: classes.image + ' ' + classes.preventClose + ' swiper-lazy'
1607 };
1608 if (slide.title) {
1609 imageAttributes['data-title'] = slide.title;
1610 imageAttributes.alt = slide.title;
1611 }
1612 if (slide.description) {
1613 imageAttributes['data-description'] = slide.description;
1614 imageAttributes.alt += ' - ' + slide.description;
1615 }
1616 const $slideImage = $('<img>', imageAttributes);
1617 $zoomContainer.append([$slideImage, $slidePlaceholder]);
1618 $slide.append($zoomContainer);
1619 }
1620 if (slide.hash) {
1621 $slide.attr('data-e-action-hash', slide.hash);
1622 }
1623 $slidesWrapper.append($slide);
1624 });
1625 this.elements.$container = $container;
1626 this.elements.$header = this.getSlideshowHeader();
1627 $container.prepend(this.elements.$header).append($slidesWrapper);
1628 if (!isSingleSlide) {
1629 const $prevButtonIcon = this.isFontIconSvgExperiment ? $(_eIcons.chevronLeft.element) : $('<i>', {
1630 class: slideshowClasses.prevButtonIcon,
1631 'aria-hidden': 'true'
1632 }),
1633 $nextButtonIcon = this.isFontIconSvgExperiment ? $(_eIcons.chevronRight.element) : $('<i>', {
1634 class: slideshowClasses.nextButtonIcon,
1635 'aria-hidden': 'true'
1636 }),
1637 $prevButtonLabel = $('<span>', {
1638 class: 'screen-reader-text'
1639 }).html(i18n.previous),
1640 $nextButtonLabel = $('<span>', {
1641 class: 'screen-reader-text'
1642 }).html(i18n.next);
1643 $prevButton = $('<div>', {
1644 class: slideshowClasses.prevButton + ' ' + classes.preventClose
1645 }).append($prevButtonIcon, $prevButtonLabel);
1646 $nextButton = $('<div>', {
1647 class: slideshowClasses.nextButton + ' ' + classes.preventClose
1648 }).append($nextButtonIcon, $nextButtonLabel);
1649 $container.append($nextButton, $prevButton);
1650 this.$buttons = this.$buttons.add($nextButton).add($prevButton);
1651 }
1652 if (showFooter) {
1653 this.elements.$footer = this.getSlideshowFooter();
1654 $container.append(this.elements.$footer);
1655 }
1656 this.setSettings('hideUiTimeout', '');
1657 $container.on('click mousemove keypress', this.showLightboxUi);
1658 const modal = this.getModal();
1659 modal.setMessage($container);
1660 const onShowMethod = modal.onShow;
1661 modal.onShow = async () => {
1662 onShowMethod();
1663 const swiperOptions = {
1664 pagination: {
1665 el: '.' + slideshowClasses.counter,
1666 type: 'fraction'
1667 },
1668 on: {
1669 slideChangeTransitionEnd: this.onSlideChange
1670 },
1671 lazy: {
1672 loadPrevNext: true
1673 },
1674 zoom: true,
1675 spaceBetween: 100,
1676 grabCursor: true,
1677 runCallbacksOnInit: false,
1678 loop: true,
1679 keyboard: true,
1680 handleElementorBreakpoints: true
1681 };
1682 if (!isSingleSlide) {
1683 swiperOptions.navigation = {
1684 prevEl: $prevButton[0],
1685 nextEl: $nextButton[0]
1686 };
1687 }
1688 if (options.swiper) {
1689 $.extend(swiperOptions, options.swiper);
1690 }
1691 const Swiper = elementorFrontend.utils.swiper;
1692 this.swiper = await new Swiper($container, swiperOptions);
1693
1694 // Expose the swiper instance in the frontend
1695 $container.data('swiper', this.swiper);
1696 this.setVideoAspectRatio();
1697 this.playSlideVideo();
1698 if (showFooter) {
1699 this.updateFooterText();
1700 }
1701 this.bindHotKeys();
1702 this.makeButtonsAccessible();
1703 };
1704 },
1705 makeButtonsAccessible() {
1706 this.$buttons.attr('tabindex', 0).on('keypress', event => {
1707 const ENTER_KEY = 13,
1708 SPACE_KEY = 32;
1709 if (ENTER_KEY === event.which || SPACE_KEY === event.which) {
1710 jQuery(event.currentTarget).trigger('click');
1711 }
1712 });
1713 },
1714 showLightboxUi() {
1715 const slideshowClasses = this.getSettings('classes').slideshow;
1716 this.elements.$container.removeClass(slideshowClasses.hideUiVisibility);
1717 clearTimeout(this.getSettings('hideUiTimeout'));
1718 this.setSettings('hideUiTimeout', setTimeout(() => {
1719 if (!this.shareMode) {
1720 this.elements.$container.addClass(slideshowClasses.hideUiVisibility);
1721 }
1722 }, 3500));
1723 },
1724 bindHotKeys() {
1725 this.getModal().getElements('window').on('keydown', this.activeKeyDown);
1726 },
1727 unbindHotKeys() {
1728 this.getModal().getElements('window').off('keydown', this.activeKeyDown);
1729 },
1730 activeKeyDown(event) {
1731 this.showLightboxUi();
1732 const TAB_KEY = 9;
1733 if (event.which === TAB_KEY) {
1734 const $buttons = this.$buttons;
1735 let focusedButton,
1736 isFirst = false,
1737 isLast = false;
1738 $buttons.each(index => {
1739 const item = $buttons[index];
1740 if (jQuery(item).is(':focus')) {
1741 focusedButton = item;
1742 isFirst = 0 === index;
1743 isLast = $buttons.length - 1 === index;
1744 return false;
1745 }
1746 });
1747 if (event.shiftKey) {
1748 if (isFirst) {
1749 event.preventDefault();
1750 $buttons.last().trigger('focus');
1751 }
1752 } else if (isLast || !focusedButton) {
1753 event.preventDefault();
1754 $buttons.first().trigger('focus');
1755 }
1756 }
1757 },
1758 setVideoAspectRatio(aspectRatio) {
1759 aspectRatio = aspectRatio || this.getSettings('modalOptions.videoAspectRatio');
1760 const $widgetContent = this.getModal().getElements('widgetContent'),
1761 oldAspectRatio = this.oldAspectRatio,
1762 aspectRatioClass = this.getSettings('classes.aspectRatio');
1763 this.oldAspectRatio = aspectRatio;
1764 if (oldAspectRatio) {
1765 $widgetContent.removeClass(aspectRatioClass.replace('%s', oldAspectRatio));
1766 }
1767 if (aspectRatio) {
1768 $widgetContent.addClass(aspectRatioClass.replace('%s', aspectRatio));
1769 }
1770 },
1771 getSlide(slideState) {
1772 return jQuery(this.swiper.slides).filter(this.getSettings('selectors.slideshow.' + slideState + 'Slide'));
1773 },
1774 updateFooterText() {
1775 if (!this.elements.$footer) {
1776 return;
1777 }
1778 const classes = this.getSettings('classes'),
1779 $activeSlide = this.getSlide('active'),
1780 $image = $activeSlide.find('.elementor-lightbox-image'),
1781 titleText = $image.data('title'),
1782 descriptionText = $image.data('description'),
1783 $title = this.elements.$footer.find('.' + classes.slideshow.title),
1784 $description = this.elements.$footer.find('.' + classes.slideshow.description);
1785 $title.text(titleText || '');
1786 $description.text(descriptionText || '');
1787 },
1788 playSlideVideo() {
1789 const $activeSlide = this.getSlide('active'),
1790 videoURL = $activeSlide.data('elementor-slideshow-video');
1791 if (!videoURL) {
1792 return;
1793 }
1794 const classes = this.getSettings('classes'),
1795 $videoContainer = jQuery('<div>', {
1796 class: classes.videoContainer + ' ' + classes.invisible
1797 }),
1798 $videoWrapper = jQuery('<div>', {
1799 class: classes.videoWrapper
1800 }),
1801 $playIcon = $activeSlide.children('.' + classes.playButton);
1802 let videoType, apiProvider;
1803 $videoContainer.append($videoWrapper);
1804 $activeSlide.append($videoContainer);
1805 if (-1 !== videoURL.indexOf('vimeo.com')) {
1806 videoType = 'vimeo';
1807 apiProvider = elementorFrontend.utils.vimeo;
1808 } else if (videoURL.match(/^(?:https?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com)/)) {
1809 videoType = 'youtube';
1810 apiProvider = elementorFrontend.utils.youtube;
1811 }
1812 const videoID = apiProvider.getVideoIDFromURL(videoURL);
1813 apiProvider.onApiReady(apiObject => {
1814 if ('youtube' === videoType) {
1815 this.prepareYTVideo(apiObject, videoID, $videoContainer, $videoWrapper, $playIcon);
1816 } else if ('vimeo' === videoType) {
1817 this.prepareVimeoVideo(apiObject, videoURL, $videoContainer, $videoWrapper, $playIcon);
1818 }
1819 });
1820 $playIcon.addClass(classes.playing).removeClass(classes.hidden);
1821 },
1822 prepareYTVideo(YT, videoID, $videoContainer, $videoWrapper, $playIcon) {
1823 const classes = this.getSettings('classes'),
1824 $videoPlaceholderElement = jQuery('<div>');
1825 let startStateCode = YT.PlayerState.PLAYING;
1826 $videoWrapper.append($videoPlaceholderElement);
1827
1828 // Since version 67, Chrome doesn't fire the `PLAYING` state at start time
1829 if (window.chrome) {
1830 startStateCode = YT.PlayerState.UNSTARTED;
1831 }
1832 $videoContainer.addClass('elementor-loading' + ' ' + classes.invisible);
1833 this.player = new YT.Player($videoPlaceholderElement[0], {
1834 videoId: videoID,
1835 events: {
1836 onReady: () => {
1837 $playIcon.addClass(classes.hidden);
1838 $videoContainer.removeClass(classes.invisible);
1839 this.player.playVideo();
1840 },
1841 onStateChange: event => {
1842 if (event.data === startStateCode) {
1843 $videoContainer.removeClass('elementor-loading' + ' ' + classes.invisible);
1844 }
1845 }
1846 },
1847 playerVars: {
1848 controls: 0,
1849 rel: 0
1850 }
1851 });
1852 },
1853 prepareVimeoVideo(Vimeo, videoURL, $videoContainer, $videoWrapper, $playIcon) {
1854 const classes = this.getSettings('classes'),
1855 vimeoOptions = {
1856 url: videoURL,
1857 autoplay: true,
1858 transparent: false,
1859 playsinline: false
1860 };
1861 this.player = new Vimeo.Player($videoWrapper, vimeoOptions);
1862 this.player.ready().then(() => {
1863 $playIcon.addClass(classes.hidden);
1864 $videoContainer.removeClass(classes.invisible);
1865 });
1866 },
1867 setEntranceAnimation(animation) {
1868 animation = animation || elementorFrontend.getCurrentDeviceSetting(this.getSettings('modalOptions'), 'entranceAnimation');
1869 const $widgetMessage = this.getModal().getElements('message');
1870 if (this.oldAnimation) {
1871 $widgetMessage.removeClass(this.oldAnimation);
1872 }
1873 this.oldAnimation = animation;
1874 if (animation) {
1875 $widgetMessage.addClass('animated ' + animation);
1876 }
1877 },
1878 openSlideshow(slideshowID, initialSlideURL) {
1879 const $allSlideshowLinks = jQuery(this.getSettings('selectors.links')).filter((index, element) => {
1880 const $element = jQuery(element);
1881 return slideshowID === element.dataset.elementorLightboxSlideshow && !$element.parent('.swiper-slide-duplicate').length && !$element.parents('.slick-cloned').length;
1882 });
1883 const slides = [];
1884 let initialSlideIndex = 0;
1885 $allSlideshowLinks.each(function () {
1886 const slideVideo = this.dataset.elementorLightboxVideo;
1887 let slideIndex = this.dataset.elementorLightboxIndex;
1888 if (undefined === slideIndex) {
1889 slideIndex = $allSlideshowLinks.index(this);
1890 }
1891 if (initialSlideURL === this.href || slideVideo && initialSlideURL === slideVideo) {
1892 initialSlideIndex = slideIndex;
1893 }
1894 const slideData = {
1895 image: this.href,
1896 index: slideIndex,
1897 title: this.dataset.elementorLightboxTitle,
1898 description: this.dataset.elementorLightboxDescription,
1899 hash: this.getAttribute('data-e-action-hash')
1900 };
1901 if (slideVideo) {
1902 slideData.video = slideVideo;
1903 }
1904 slides.push(slideData);
1905 });
1906 slides.sort((a, b) => a.index - b.index);
1907 this.showModal({
1908 type: 'slideshow',
1909 id: slideshowID,
1910 modalOptions: {
1911 id: 'elementor-lightbox-slideshow-' + slideshowID
1912 },
1913 slideshow: {
1914 slides,
1915 swiper: {
1916 initialSlide: +initialSlideIndex
1917 }
1918 }
1919 });
1920 },
1921 onSlideChange() {
1922 this.getSlide('prev').add(this.getSlide('next')).add(this.getSlide('active')).find('.' + this.getSettings('classes.videoWrapper')).remove();
1923 this.playSlideVideo();
1924 this.updateFooterText();
1925 }
1926 });
1927
1928 /***/ }),
1929
1930 /***/ "../assets/dev/js/frontend/utils/lightbox/screenfull.js":
1931 /*!**************************************************************!*\
1932 !*** ../assets/dev/js/frontend/utils/lightbox/screenfull.js ***!
1933 \**************************************************************/
1934 /***/ ((module) => {
1935
1936 "use strict";
1937
1938
1939 (function () {
1940 'use strict';
1941
1942 var document = typeof window !== 'undefined' && typeof window.document !== 'undefined' ? window.document : {};
1943 var isCommonjs = true && module.exports;
1944 var fn = function () {
1945 var val;
1946 var fnMap = [['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'],
1947 // New WebKit
1948 ['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'],
1949 // Old WebKit
1950 ['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'], ['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'], ['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']];
1951 var i = 0;
1952 var l = fnMap.length;
1953 var ret = {};
1954 for (; i < l; i++) {
1955 val = fnMap[i];
1956 if (val && val[1] in document) {
1957 var valLength = val.length;
1958 for (i = 0; i < valLength; i++) {
1959 ret[fnMap[0][i]] = val[i];
1960 }
1961 return ret;
1962 }
1963 }
1964 return false;
1965 }();
1966 var eventNameMap = {
1967 change: fn.fullscreenchange,
1968 error: fn.fullscreenerror
1969 };
1970 var screenfull = {
1971 request(element) {
1972 return new Promise(function (resolve, reject) {
1973 var onFullScreenEntered = function () {
1974 this.off('change', onFullScreenEntered);
1975 resolve();
1976 }.bind(this);
1977 this.on('change', onFullScreenEntered);
1978 element = element || document.documentElement;
1979 Promise.resolve(element[fn.requestFullscreen]()).catch(reject);
1980 }.bind(this));
1981 },
1982 exit() {
1983 return new Promise(function (resolve, reject) {
1984 if (!this.isFullscreen) {
1985 resolve();
1986 return;
1987 }
1988 var onFullScreenExit = function () {
1989 this.off('change', onFullScreenExit);
1990 resolve();
1991 }.bind(this);
1992 this.on('change', onFullScreenExit);
1993 Promise.resolve(document[fn.exitFullscreen]()).catch(reject);
1994 }.bind(this));
1995 },
1996 toggle(element) {
1997 return this.isFullscreen ? this.exit() : this.request(element);
1998 },
1999 onchange(callback) {
2000 this.on('change', callback);
2001 },
2002 onerror(callback) {
2003 this.on('error', callback);
2004 },
2005 on(event, callback) {
2006 var eventName = eventNameMap[event];
2007 if (eventName) {
2008 document.addEventListener(eventName, callback, false);
2009 }
2010 },
2011 off(event, callback) {
2012 var eventName = eventNameMap[event];
2013 if (eventName) {
2014 document.removeEventListener(eventName, callback, false);
2015 }
2016 },
2017 raw: fn
2018 };
2019 if (!fn) {
2020 if (isCommonjs) {
2021 module.exports = {
2022 isEnabled: false
2023 };
2024 } else {
2025 window.screenfull = {
2026 isEnabled: false
2027 };
2028 }
2029 return;
2030 }
2031 Object.defineProperties(screenfull, {
2032 isFullscreen: {
2033 get() {
2034 return Boolean(document[fn.fullscreenElement]);
2035 }
2036 },
2037 element: {
2038 enumerable: true,
2039 get() {
2040 return document[fn.fullscreenElement];
2041 }
2042 },
2043 isEnabled: {
2044 enumerable: true,
2045 get() {
2046 // Coerce to boolean in case of old WebKit
2047 return Boolean(document[fn.fullscreenEnabled]);
2048 }
2049 }
2050 });
2051 if (isCommonjs) {
2052 module.exports = screenfull;
2053 } else {
2054 window.screenfull = screenfull;
2055 }
2056 })();
2057
2058 /***/ }),
2059
2060 /***/ "../node_modules/@babel/runtime/helpers/defineProperty.js":
2061 /*!****************************************************************!*\
2062 !*** ../node_modules/@babel/runtime/helpers/defineProperty.js ***!
2063 \****************************************************************/
2064 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2065
2066 var toPropertyKey = __webpack_require__(/*! ./toPropertyKey.js */ "../node_modules/@babel/runtime/helpers/toPropertyKey.js");
2067 function _defineProperty(obj, key, value) {
2068 key = toPropertyKey(key);
2069 if (key in obj) {
2070 Object.defineProperty(obj, key, {
2071 value: value,
2072 enumerable: true,
2073 configurable: true,
2074 writable: true
2075 });
2076 } else {
2077 obj[key] = value;
2078 }
2079 return obj;
2080 }
2081 module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports;
2082
2083 /***/ }),
2084
2085 /***/ "../node_modules/@babel/runtime/helpers/toPrimitive.js":
2086 /*!*************************************************************!*\
2087 !*** ../node_modules/@babel/runtime/helpers/toPrimitive.js ***!
2088 \*************************************************************/
2089 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2090
2091 var _typeof = (__webpack_require__(/*! ./typeof.js */ "../node_modules/@babel/runtime/helpers/typeof.js")["default"]);
2092 function _toPrimitive(input, hint) {
2093 if (_typeof(input) !== "object" || input === null) return input;
2094 var prim = input[Symbol.toPrimitive];
2095 if (prim !== undefined) {
2096 var res = prim.call(input, hint || "default");
2097 if (_typeof(res) !== "object") return res;
2098 throw new TypeError("@@toPrimitive must return a primitive value.");
2099 }
2100 return (hint === "string" ? String : Number)(input);
2101 }
2102 module.exports = _toPrimitive, module.exports.__esModule = true, module.exports["default"] = module.exports;
2103
2104 /***/ }),
2105
2106 /***/ "../node_modules/@babel/runtime/helpers/toPropertyKey.js":
2107 /*!***************************************************************!*\
2108 !*** ../node_modules/@babel/runtime/helpers/toPropertyKey.js ***!
2109 \***************************************************************/
2110 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2111
2112 var _typeof = (__webpack_require__(/*! ./typeof.js */ "../node_modules/@babel/runtime/helpers/typeof.js")["default"]);
2113 var toPrimitive = __webpack_require__(/*! ./toPrimitive.js */ "../node_modules/@babel/runtime/helpers/toPrimitive.js");
2114 function _toPropertyKey(arg) {
2115 var key = toPrimitive(arg, "string");
2116 return _typeof(key) === "symbol" ? key : String(key);
2117 }
2118 module.exports = _toPropertyKey, module.exports.__esModule = true, module.exports["default"] = module.exports;
2119
2120 /***/ }),
2121
2122 /***/ "../node_modules/@babel/runtime/helpers/typeof.js":
2123 /*!********************************************************!*\
2124 !*** ../node_modules/@babel/runtime/helpers/typeof.js ***!
2125 \********************************************************/
2126 /***/ ((module) => {
2127
2128 function _typeof(obj) {
2129 "@babel/helpers - typeof";
2130
2131 return (module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
2132 return typeof obj;
2133 } : function (obj) {
2134 return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
2135 }, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(obj);
2136 }
2137 module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports;
2138
2139 /***/ })
2140
2141 },
2142 /******/ __webpack_require__ => { // webpackRuntimeModules
2143 /******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
2144 /******/ __webpack_require__.O(0, ["frontend","frontend-modules"], () => (__webpack_exec__("../assets/dev/js/frontend/preloaded-modules.js")));
2145 /******/ var __webpack_exports__ = __webpack_require__.O();
2146 /******/ }
2147 ]);
2148 //# sourceMappingURL=preloaded-modules.js.map