PluginProbe
Elementor Website Builder – more than just a page builder / 3.13.3
Elementor Website Builder – more than just a page builder v3.13.3
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 / preloaded-modules.js

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

2,146 lines 77.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*! elementor - v3.13.3 - 22-05-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 _lightbox = _interopRequireDefault(__webpack_require__(/*! elementor-frontend/utils/lightbox/lightbox */ "../assets/dev/js/frontend/utils/lightbox/lightbox.js"));
746 elementorFrontend.elements.$window.on('elementor/frontend/init', () => {
747 elementorFrontend.elementsHandler.elementsHandlers = {
748 'accordion.default': _accordion.default,
749 'alert.default': _alert.default,
750 'counter.default': _counter.default,
751 'progress.default': _progress.default,
752 'tabs.default': _tabs.default,
753 'nested-tabs.default': _nestedTabs.default,
754 'toggle.default': _toggle.default,
755 'video.default': _video.default,
756 'image-carousel.default': _imageCarousel.default,
757 'text-editor.default': _textEditor.default
758 };
759 elementorFrontend.on('components:init', () => {
760 // We first need to delete the property because by default it's a getter function that cannot be overwritten.
761 delete elementorFrontend.utils.lightbox;
762 elementorFrontend.utils.lightbox = new _lightbox.default();
763 });
764 });
765
766 /***/ }),
767
768 /***/ "../assets/dev/js/frontend/utils/icons/e-icons.js":
769 /*!********************************************************!*\
770 !*** ../assets/dev/js/frontend/utils/icons/e-icons.js ***!
771 \********************************************************/
772 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
773
774 "use strict";
775
776
777 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
778 Object.defineProperty(exports, "__esModule", ({
779 value: true
780 }));
781 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;
782 var _manager = _interopRequireDefault(__webpack_require__(/*! ./manager */ "../assets/dev/js/frontend/utils/icons/manager.js"));
783 // This file is automatically generated, please don't change anything in this file.
784
785 const iconsManager = new _manager.default('eicon');
786 const chevronLeft = {
787 get element() {
788 const svgData = {
789 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',
790 width: 1000,
791 height: 1000
792 };
793 return iconsManager.createSvgElement('chevron-left', svgData);
794 }
795 };
796 exports.chevronLeft = chevronLeft;
797 const chevronRight = {
798 get element() {
799 const svgData = {
800 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',
801 width: 1000,
802 height: 1000
803 };
804 return iconsManager.createSvgElement('chevron-right', svgData);
805 }
806 };
807 exports.chevronRight = chevronRight;
808 const close = {
809 get element() {
810 const svgData = {
811 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',
812 width: 1000,
813 height: 1000
814 };
815 return iconsManager.createSvgElement('close', svgData);
816 }
817 };
818 exports.close = close;
819 const downloadBold = {
820 get element() {
821 const svgData = {
822 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',
823 width: 1000,
824 height: 1000
825 };
826 return iconsManager.createSvgElement('download-bold', svgData);
827 }
828 };
829 exports.downloadBold = downloadBold;
830 const facebook = {
831 get element() {
832 const svgData = {
833 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',
834 width: 1000,
835 height: 1000
836 };
837 return iconsManager.createSvgElement('facebook', svgData);
838 }
839 };
840 exports.facebook = facebook;
841 const frameExpand = {
842 get element() {
843 const svgData = {
844 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',
845 width: 1000,
846 height: 1000
847 };
848 return iconsManager.createSvgElement('frame-expand', svgData);
849 }
850 };
851 exports.frameExpand = frameExpand;
852 const frameMinimize = {
853 get element() {
854 const svgData = {
855 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',
856 width: 1000,
857 height: 1000
858 };
859 return iconsManager.createSvgElement('frame-minimize', svgData);
860 }
861 };
862 exports.frameMinimize = frameMinimize;
863 const loading = {
864 get element() {
865 const svgData = {
866 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',
867 width: 1000,
868 height: 1000
869 };
870 return iconsManager.createSvgElement('loading', svgData);
871 }
872 };
873 exports.loading = loading;
874 const pinterest = {
875 get element() {
876 const svgData = {
877 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',
878 width: 1000,
879 height: 1000
880 };
881 return iconsManager.createSvgElement('pinterest', svgData);
882 }
883 };
884 exports.pinterest = pinterest;
885 const shareArrow = {
886 get element() {
887 const svgData = {
888 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',
889 width: 1000,
890 height: 1000
891 };
892 return iconsManager.createSvgElement('share-arrow', svgData);
893 }
894 };
895 exports.shareArrow = shareArrow;
896 const twitter = {
897 get element() {
898 const svgData = {
899 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',
900 width: 1000,
901 height: 1000
902 };
903 return iconsManager.createSvgElement('twitter', svgData);
904 }
905 };
906 exports.twitter = twitter;
907 const zoomInBold = {
908 get element() {
909 const svgData = {
910 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',
911 width: 1000,
912 height: 1000
913 };
914 return iconsManager.createSvgElement('zoom-in-bold', svgData);
915 }
916 };
917 exports.zoomInBold = zoomInBold;
918 const zoomOutBold = {
919 get element() {
920 const svgData = {
921 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',
922 width: 1000,
923 height: 1000
924 };
925 return iconsManager.createSvgElement('zoom-out-bold', svgData);
926 }
927 };
928 exports.zoomOutBold = zoomOutBold;
929
930 /***/ }),
931
932 /***/ "../assets/dev/js/frontend/utils/icons/manager.js":
933 /*!********************************************************!*\
934 !*** ../assets/dev/js/frontend/utils/icons/manager.js ***!
935 \********************************************************/
936 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
937
938 "use strict";
939
940
941 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
942 Object.defineProperty(exports, "__esModule", ({
943 value: true
944 }));
945 exports["default"] = void 0;
946 var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../node_modules/@babel/runtime/helpers/defineProperty.js"));
947 class IconsManager {
948 constructor(elementsPrefix) {
949 this.prefix = `${elementsPrefix}-`;
950 this.createSvgSymbolsContainer();
951 }
952 createSvgElement(name, _ref) {
953 let {
954 path,
955 width,
956 height
957 } = _ref;
958 const iconName = this.prefix + name,
959 iconSelector = '#' + this.prefix + name;
960
961 // Create symbol if not exist yet.
962 if (!IconsManager.iconsUsageList.includes(iconName)) {
963 if (!IconsManager.symbolsContainer.querySelector(iconSelector)) {
964 const symbol = this.createSymbolElement({
965 id: iconName,
966 path,
967 width,
968 height
969 });
970 IconsManager.symbolsContainer.appendChild(symbol);
971 }
972 IconsManager.iconsUsageList.push(iconName);
973 }
974 return this.createSvgIconElement({
975 iconName,
976 iconSelector
977 });
978 }
979 createSvgNode(tag, _ref2) {
980 let {
981 props = {},
982 attrs = {}
983 } = _ref2;
984 const node = document.createElementNS('http://www.w3.org/2000/svg', tag);
985 Object.keys(props).map(key => node[key] = props[key]);
986 Object.keys(attrs).map(key => node.setAttributeNS(null, key, attrs[key]));
987 return node;
988 }
989 createSvgIconElement(_ref3) {
990 let {
991 iconName,
992 iconSelector
993 } = _ref3;
994 return this.createSvgNode('svg', {
995 props: {
996 innerHTML: '<use xlink:href="' + iconSelector + '" />'
997 },
998 attrs: {
999 class: 'e-font-icon-svg e-' + iconName
1000 }
1001 });
1002 }
1003 createSvgSymbolsContainer() {
1004 if (!IconsManager.symbolsContainer) {
1005 const symbolsContainerId = 'e-font-icon-svg-symbols';
1006 IconsManager.symbolsContainer = document.getElementById(symbolsContainerId);
1007 if (!IconsManager.symbolsContainer) {
1008 IconsManager.symbolsContainer = this.createSvgNode('svg', {
1009 attrs: {
1010 style: 'display: none;',
1011 class: symbolsContainerId
1012 }
1013 });
1014 document.body.appendChild(IconsManager.symbolsContainer);
1015 }
1016 }
1017 }
1018 createSymbolElement(_ref4) {
1019 let {
1020 id,
1021 path,
1022 width,
1023 height
1024 } = _ref4;
1025 return this.createSvgNode('symbol', {
1026 props: {
1027 innerHTML: '<path d="' + path + '"></path>',
1028 id
1029 },
1030 attrs: {
1031 viewBox: '0 0 ' + width + ' ' + height
1032 }
1033 });
1034 }
1035 }
1036 exports["default"] = IconsManager;
1037 (0, _defineProperty2.default)(IconsManager, "symbolsContainer", void 0);
1038 (0, _defineProperty2.default)(IconsManager, "iconsUsageList", []);
1039
1040 /***/ }),
1041
1042 /***/ "../assets/dev/js/frontend/utils/lightbox/lightbox.js":
1043 /*!************************************************************!*\
1044 !*** ../assets/dev/js/frontend/utils/lightbox/lightbox.js ***!
1045 \************************************************************/
1046 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1047
1048 "use strict";
1049
1050
1051 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
1052 var _screenfull = _interopRequireDefault(__webpack_require__(/*! ./screenfull */ "../assets/dev/js/frontend/utils/lightbox/screenfull.js"));
1053 var _eIcons = __webpack_require__(/*! @elementor/e-icons */ "../assets/dev/js/frontend/utils/icons/e-icons.js");
1054 module.exports = elementorModules.ViewModule.extend({
1055 oldAspectRatio: null,
1056 oldAnimation: null,
1057 swiper: null,
1058 player: null,
1059 isFontIconSvgExperiment: elementorFrontend.config.experimentalFeatures.e_font_icon_svg,
1060 getDefaultSettings() {
1061 return {
1062 classes: {
1063 aspectRatio: 'elementor-aspect-ratio-%s',
1064 item: 'elementor-lightbox-item',
1065 image: 'elementor-lightbox-image',
1066 videoContainer: 'elementor-video-container',
1067 videoWrapper: 'elementor-fit-aspect-ratio',
1068 playButton: 'elementor-custom-embed-play',
1069 playButtonIcon: 'fa',
1070 playing: 'elementor-playing',
1071 hidden: 'elementor-hidden',
1072 invisible: 'elementor-invisible',
1073 preventClose: 'elementor-lightbox-prevent-close',
1074 slideshow: {
1075 container: elementorFrontend.config.swiperClass,
1076 slidesWrapper: 'swiper-wrapper',
1077 prevButton: 'elementor-swiper-button elementor-swiper-button-prev',
1078 nextButton: 'elementor-swiper-button elementor-swiper-button-next',
1079 prevButtonIcon: 'eicon-chevron-left',
1080 nextButtonIcon: 'eicon-chevron-right',
1081 slide: 'swiper-slide',
1082 header: 'elementor-slideshow__header',
1083 footer: 'elementor-slideshow__footer',
1084 title: 'elementor-slideshow__title',
1085 description: 'elementor-slideshow__description',
1086 counter: 'elementor-slideshow__counter',
1087 iconExpand: 'eicon-frame-expand',
1088 iconShrink: 'eicon-frame-minimize',
1089 iconZoomIn: 'eicon-zoom-in-bold',
1090 iconZoomOut: 'eicon-zoom-out-bold',
1091 iconShare: 'eicon-share-arrow',
1092 shareMenu: 'elementor-slideshow__share-menu',
1093 shareLinks: 'elementor-slideshow__share-links',
1094 hideUiVisibility: 'elementor-slideshow--ui-hidden',
1095 shareMode: 'elementor-slideshow--share-mode',
1096 fullscreenMode: 'elementor-slideshow--fullscreen-mode',
1097 zoomMode: 'elementor-slideshow--zoom-mode'
1098 }
1099 },
1100 selectors: {
1101 image: '.elementor-lightbox-image',
1102 links: 'a, [data-elementor-lightbox]',
1103 slideshow: {
1104 activeSlide: '.swiper-slide-active',
1105 prevSlide: '.swiper-slide-prev',
1106 nextSlide: '.swiper-slide-next'
1107 }
1108 },
1109 modalOptions: {
1110 id: 'elementor-lightbox',
1111 entranceAnimation: 'zoomIn',
1112 videoAspectRatio: 169,
1113 position: {
1114 enable: false
1115 }
1116 }
1117 };
1118 },
1119 getModal() {
1120 if (!module.exports.modal) {
1121 this.initModal();
1122 }
1123 return module.exports.modal;
1124 },
1125 initModal() {
1126 const closeIcon = {};
1127
1128 // If the experiment is active the closeIcon should be an entire SVG element otherwise it should pass the eicon class name.
1129 if (this.isFontIconSvgExperiment) {
1130 closeIcon.iconElement = _eIcons.close.element;
1131 } else {
1132 closeIcon.iconClass = 'eicon-close';
1133 }
1134 const modal = module.exports.modal = elementorFrontend.getDialogsManager().createWidget('lightbox', {
1135 className: 'elementor-lightbox',
1136 closeButton: true,
1137 closeButtonOptions: {
1138 ...closeIcon,
1139 attributes: {
1140 role: 'button',
1141 tabindex: 0,
1142 'aria-label': elementorFrontend.config.i18n.close + ' (Esc)'
1143 }
1144 },
1145 selectors: {
1146 preventClose: '.' + this.getSettings('classes.preventClose')
1147 },
1148 hide: {
1149 onClick: true
1150 }
1151 });
1152 modal.on('hide', function () {
1153 modal.setMessage('');
1154 });
1155 },
1156 showModal(options) {
1157 if (options.url && !options.url.startsWith('http')) {
1158 return;
1159 }
1160 this.elements.$closeButton = this.getModal().getElements('closeButton');
1161 this.$buttons = this.elements.$closeButton;
1162 this.focusedButton = null;
1163 const self = this,
1164 defaultOptions = self.getDefaultSettings().modalOptions;
1165 self.id = options.id;
1166 self.setSettings('modalOptions', jQuery.extend(defaultOptions, options.modalOptions));
1167 const modal = self.getModal();
1168 modal.setID(self.getSettings('modalOptions.id'));
1169 modal.onShow = function () {
1170 DialogsManager.getWidgetType('lightbox').prototype.onShow.apply(modal, arguments);
1171 self.setEntranceAnimation();
1172 };
1173 modal.onHide = function () {
1174 DialogsManager.getWidgetType('lightbox').prototype.onHide.apply(modal, arguments);
1175 modal.getElements('message').removeClass('animated');
1176 if (_screenfull.default.isFullscreen) {
1177 self.deactivateFullscreen();
1178 }
1179 self.unbindHotKeys();
1180 };
1181 switch (options.type) {
1182 case 'video':
1183 self.setVideoContent(options);
1184 break;
1185 case 'image':
1186 {
1187 const slides = [{
1188 image: options.url,
1189 index: 0,
1190 title: options.title,
1191 description: options.description,
1192 hash: options.hash
1193 }];
1194 options.slideshow = {
1195 slides,
1196 swiper: {
1197 loop: false,
1198 pagination: false
1199 }
1200 };
1201 self.setSlideshowContent(options.slideshow);
1202 break;
1203 }
1204 case 'slideshow':
1205 self.setSlideshowContent(options.slideshow);
1206 break;
1207 default:
1208 self.setHTMLContent(options.html);
1209 }
1210 modal.show();
1211 },
1212 createLightbox(element) {
1213 let lightboxData = {};
1214 if (element.dataset.elementorLightbox) {
1215 lightboxData = JSON.parse(element.dataset.elementorLightbox);
1216 }
1217 if (lightboxData.type && 'slideshow' !== lightboxData.type) {
1218 this.showModal(lightboxData);
1219 return;
1220 }
1221 if (!element.dataset.elementorLightboxSlideshow) {
1222 const slideshowID = 'single-img';
1223 this.showModal({
1224 type: 'image',
1225 id: slideshowID,
1226 url: element.href,
1227 hash: element.getAttribute('data-e-action-hash'),
1228 title: element.dataset.elementorLightboxTitle,
1229 description: element.dataset.elementorLightboxDescription,
1230 modalOptions: {
1231 id: 'elementor-lightbox-slideshow-' + slideshowID
1232 }
1233 });
1234 return;
1235 }
1236 const initialSlideURL = element.dataset.elementorLightboxVideo || element.href;
1237 this.openSlideshow(element.dataset.elementorLightboxSlideshow, initialSlideURL);
1238 },
1239 setHTMLContent(html) {
1240 if (window.elementorCommon) {
1241 elementorDevTools.deprecation.deprecated('elementorFrontend.utils.lightbox.setHTMLContent', '3.1.4');
1242 }
1243 this.getModal().setMessage(html);
1244 },
1245 setVideoContent(options) {
1246 const $ = jQuery;
1247 let $videoElement;
1248 if ('hosted' === options.videoType) {
1249 const videoParams = $.extend({
1250 src: options.url,
1251 autoplay: ''
1252 }, options.videoParams);
1253 $videoElement = $('<video>', videoParams);
1254 } else {
1255 let apiProvider;
1256 if (-1 !== options.url.indexOf('vimeo.com')) {
1257 apiProvider = elementorFrontend.utils.vimeo;
1258 } else if (options.url.match(/^(?:https?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com|youtube-nocookie\.com)/)) {
1259 apiProvider = elementorFrontend.utils.youtube;
1260 } else {
1261 return;
1262 }
1263 $videoElement = $('<iframe>', {
1264 src: apiProvider.getAutoplayURL(options.url),
1265 allowfullscreen: 1
1266 });
1267 }
1268 const classes = this.getSettings('classes'),
1269 $videoContainer = $('<div>', {
1270 class: `${classes.videoContainer} ${classes.preventClose}`
1271 }),
1272 $videoWrapper = $('<div>', {
1273 class: classes.videoWrapper
1274 });
1275 $videoWrapper.append($videoElement);
1276 $videoContainer.append($videoWrapper);
1277 const modal = this.getModal();
1278 modal.setMessage($videoContainer);
1279 this.setVideoAspectRatio();
1280 const onHideMethod = modal.onHide;
1281 modal.onHide = function () {
1282 onHideMethod();
1283 this.$buttons = jQuery();
1284 this.focusedButton = null;
1285 modal.getElements('message').removeClass('elementor-fit-aspect-ratio');
1286 };
1287 },
1288 getShareLinks() {
1289 const {
1290 i18n
1291 } = elementorFrontend.config,
1292 socialNetworks = {
1293 facebook: {
1294 label: i18n.shareOnFacebook,
1295 iconElement: _eIcons.facebook
1296 },
1297 twitter: {
1298 label: i18n.shareOnTwitter,
1299 iconElement: _eIcons.twitter
1300 },
1301 pinterest: {
1302 label: i18n.pinIt,
1303 iconElement: _eIcons.pinterest
1304 }
1305 },
1306 $ = jQuery,
1307 classes = this.getSettings('classes'),
1308 selectors = this.getSettings('selectors'),
1309 $linkList = $('<div>', {
1310 class: classes.slideshow.shareLinks
1311 }),
1312 $activeSlide = this.getSlide('active'),
1313 $image = $activeSlide.find(selectors.image),
1314 videoUrl = $activeSlide.data('elementor-slideshow-video');
1315 let itemUrl;
1316 if (videoUrl) {
1317 itemUrl = videoUrl;
1318 } else {
1319 itemUrl = $image.attr('src');
1320 }
1321 $.each(socialNetworks, (key, data) => {
1322 const networkLabel = data.label,
1323 $link = $('<a>', {
1324 href: this.createShareLink(key, itemUrl, $activeSlide.attr('data-e-action-hash')),
1325 target: '_blank'
1326 }).text(networkLabel),
1327 $socialNetworkIconElement = this.isFontIconSvgExperiment ? $(data.iconElement.element) : $('<i>', {
1328 class: 'eicon-' + key,
1329 'aria-hidden': 'true'
1330 });
1331 $link.prepend($socialNetworkIconElement);
1332 $linkList.append($link);
1333 });
1334 if (!videoUrl) {
1335 const $downloadIcon = this.isFontIconSvgExperiment ? $(_eIcons.downloadBold.element) : $('<i>', {
1336 class: 'eicon-download-bold'
1337 });
1338 $downloadIcon.attr('aria-label', i18n.download);
1339 $linkList.append($('<a>', {
1340 href: itemUrl,
1341 download: ''
1342 }).text(i18n.downloadImage).prepend($downloadIcon));
1343 }
1344 return $linkList;
1345 },
1346 createShareLink(networkName, itemUrl) {
1347 let hash = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
1348 const options = {};
1349 if ('pinterest' === networkName) {
1350 options.image = encodeURIComponent(itemUrl);
1351 } else {
1352 options.url = encodeURIComponent(location.href.replace(/#.*/, '') + hash);
1353 }
1354 return ShareLink.getNetworkLink(networkName, options);
1355 },
1356 getSlideshowHeader() {
1357 const {
1358 i18n
1359 } = elementorFrontend.config,
1360 $ = jQuery,
1361 showCounter = 'yes' === elementorFrontend.getKitSettings('lightbox_enable_counter'),
1362 showFullscreen = 'yes' === elementorFrontend.getKitSettings('lightbox_enable_fullscreen'),
1363 showZoom = 'yes' === elementorFrontend.getKitSettings('lightbox_enable_zoom'),
1364 showShare = 'yes' === elementorFrontend.getKitSettings('lightbox_enable_share'),
1365 classes = this.getSettings('classes'),
1366 slideshowClasses = classes.slideshow,
1367 elements = this.elements;
1368 if (!(showCounter || showFullscreen || showZoom || showShare)) {
1369 return;
1370 }
1371 elements.$header = $('<header>', {
1372 class: slideshowClasses.header + ' ' + classes.preventClose
1373 });
1374 if (showShare) {
1375 const iconElement = this.isFontIconSvgExperiment ? _eIcons.shareArrow.element : '<i>';
1376 elements.$iconShare = $(iconElement, {
1377 class: slideshowClasses.iconShare,
1378 role: 'button',
1379 tabindex: 0,
1380 'aria-label': i18n.share,
1381 'aria-expanded': false
1382 }).append($('<span>'));
1383 const $shareLinks = $('<div>');
1384 $shareLinks.on('click', e => {
1385 e.stopPropagation();
1386 });
1387 elements.$shareMenu = $('<div>', {
1388 class: slideshowClasses.shareMenu
1389 }).append($shareLinks);
1390 elements.$iconShare.add(elements.$shareMenu).on('click', this.toggleShareMenu);
1391 elements.$header.append(elements.$iconShare, elements.$shareMenu);
1392 this.$buttons = this.$buttons.add(elements.$iconShare);
1393 }
1394 if (showZoom) {
1395 const iconElement = this.isFontIconSvgExperiment ? _eIcons.zoomInBold.element : '<i>',
1396 showZoomElements = [],
1397 showZoomAttrs = {
1398 role: 'switch',
1399 tabindex: 0,
1400 'aria-checked': false,
1401 'aria-label': i18n.zoom
1402 },
1403 zoomAttrs = {
1404 ...showZoomAttrs
1405 };
1406 if (!this.isFontIconSvgExperiment) {
1407 zoomAttrs.class = slideshowClasses.iconZoomIn;
1408 }
1409 elements.$iconZoom = $(iconElement).attr(zoomAttrs).on('click', this.toggleZoomMode);
1410 showZoomElements.push(elements.$iconZoom);
1411 if (this.isFontIconSvgExperiment) {
1412 elements.$iconZoomOut = $(_eIcons.zoomOutBold.element).attr(showZoomAttrs).addClass(classes.hidden).on('click', this.toggleZoomMode);
1413 showZoomElements.push(elements.$iconZoomOut);
1414 }
1415 elements.$header.append(showZoomElements);
1416 this.$buttons = this.$buttons.add(showZoomElements);
1417 }
1418 if (showFullscreen) {
1419 const iconElement = this.isFontIconSvgExperiment ? _eIcons.frameExpand.element : '<i>',
1420 fullScreenElements = [],
1421 fullScreenAttrs = {
1422 role: 'switch',
1423 tabindex: 0,
1424 'aria-checked': false,
1425 'aria-label': i18n.fullscreen
1426 },
1427 expandAttrs = {
1428 ...fullScreenAttrs
1429 };
1430
1431 // Only if the experiment is not active, we use the class-name in order to render the icon.
1432 if (!this.isFontIconSvgExperiment) {
1433 expandAttrs.class = slideshowClasses.iconExpand;
1434 }
1435 elements.$iconExpand = $(iconElement).append($('<span>'), $('<span>')).attr(expandAttrs).on('click', this.toggleFullscreen);
1436 fullScreenElements.push(elements.$iconExpand);
1437 if (this.isFontIconSvgExperiment) {
1438 elements.$iconMinimize = $(_eIcons.frameMinimize.element).attr(fullScreenAttrs).addClass(classes.hidden).on('click', this.toggleFullscreen);
1439 fullScreenElements.push(elements.$iconMinimize);
1440 }
1441 elements.$header.append(fullScreenElements);
1442 this.$buttons = this.$buttons.add(fullScreenElements);
1443 }
1444 if (showCounter) {
1445 elements.$counter = $('<span>', {
1446 class: slideshowClasses.counter
1447 });
1448 elements.$header.append(elements.$counter);
1449 }
1450 return elements.$header;
1451 },
1452 toggleFullscreen() {
1453 if (_screenfull.default.isFullscreen) {
1454 this.deactivateFullscreen();
1455 } else if (_screenfull.default.isEnabled) {
1456 this.activateFullscreen();
1457 }
1458 },
1459 toggleZoomMode() {
1460 if (1 !== this.swiper.zoom.scale) {
1461 this.deactivateZoom();
1462 } else {
1463 this.activateZoom();
1464 }
1465 },
1466 toggleShareMenu() {
1467 if (this.shareMode) {
1468 this.deactivateShareMode();
1469 } else {
1470 this.elements.$shareMenu.html(this.getShareLinks());
1471 this.activateShareMode();
1472 }
1473 },
1474 activateShareMode() {
1475 const classes = this.getSettings('classes');
1476 this.elements.$container.addClass(classes.slideshow.shareMode);
1477 this.elements.$iconShare.attr('aria-expanded', true);
1478
1479 // Prevent swiper interactions while in share mode
1480 this.swiper.detachEvents();
1481
1482 // Temporarily replace tabbable buttons with share-menu items
1483 this.$originalButtons = this.$buttons;
1484 this.$buttons = this.elements.$iconShare.add(this.elements.$shareMenu.find('a'));
1485 this.shareMode = true;
1486 },
1487 deactivateShareMode() {
1488 const classes = this.getSettings('classes');
1489 this.elements.$container.removeClass(classes.slideshow.shareMode);
1490 this.elements.$iconShare.attr('aria-expanded', false);
1491 this.swiper.attachEvents();
1492 this.$buttons = this.$originalButtons;
1493 this.shareMode = false;
1494 },
1495 activateFullscreen() {
1496 const classes = this.getSettings('classes');
1497 _screenfull.default.request(this.elements.$container.parents('.dialog-widget')[0]);
1498 if (this.isFontIconSvgExperiment) {
1499 this.elements.$iconExpand.addClass(classes.hidden).attr('aria-checked', 'false');
1500 this.elements.$iconMinimize.removeClass(classes.hidden).attr('aria-checked', 'true');
1501 } else {
1502 this.elements.$iconExpand.removeClass(classes.slideshow.iconExpand).addClass(classes.slideshow.iconShrink).attr('aria-checked', 'true');
1503 }
1504 this.elements.$container.addClass(classes.slideshow.fullscreenMode);
1505 },
1506 deactivateFullscreen() {
1507 const classes = this.getSettings('classes');
1508 _screenfull.default.exit();
1509 if (this.isFontIconSvgExperiment) {
1510 this.elements.$iconExpand.removeClass(classes.hidden).attr('aria-checked', 'true');
1511 this.elements.$iconMinimize.addClass(classes.hidden).attr('aria-checked', 'false');
1512 } else {
1513 this.elements.$iconExpand.removeClass(classes.slideshow.iconShrink).addClass(classes.slideshow.iconExpand).attr('aria-checked', 'false');
1514 }
1515 this.elements.$container.removeClass(classes.slideshow.fullscreenMode);
1516 },
1517 activateZoom() {
1518 const swiper = this.swiper,
1519 elements = this.elements,
1520 classes = this.getSettings('classes');
1521 swiper.zoom.in();
1522 swiper.allowSlideNext = false;
1523 swiper.allowSlidePrev = false;
1524 swiper.allowTouchMove = false;
1525 elements.$container.addClass(classes.slideshow.zoomMode);
1526 if (this.isFontIconSvgExperiment) {
1527 elements.$iconZoom.addClass(classes.hidden).attr('aria-checked', 'false');
1528 elements.$iconZoomOut.removeClass(classes.hidden).attr('aria-checked', 'true');
1529 } else {
1530 elements.$iconZoom.removeClass(classes.slideshow.iconZoomIn).addClass(classes.slideshow.iconZoomOut);
1531 }
1532 },
1533 deactivateZoom() {
1534 const swiper = this.swiper,
1535 elements = this.elements,
1536 classes = this.getSettings('classes');
1537 swiper.zoom.out();
1538 swiper.allowSlideNext = true;
1539 swiper.allowSlidePrev = true;
1540 swiper.allowTouchMove = true;
1541 elements.$container.removeClass(classes.slideshow.zoomMode);
1542 if (this.isFontIconSvgExperiment) {
1543 elements.$iconZoom.removeClass(classes.hidden).attr('aria-checked', 'true');
1544 elements.$iconZoomOut.addClass(classes.hidden).attr('aria-checked', 'false');
1545 } else {
1546 elements.$iconZoom.removeClass(classes.slideshow.iconZoomOut).addClass(classes.slideshow.iconZoomIn);
1547 }
1548 },
1549 getSlideshowFooter() {
1550 const $ = jQuery,
1551 classes = this.getSettings('classes'),
1552 $footer = $('<footer>', {
1553 class: classes.slideshow.footer + ' ' + classes.preventClose
1554 }),
1555 $title = $('<div>', {
1556 class: classes.slideshow.title
1557 }),
1558 $description = $('<div>', {
1559 class: classes.slideshow.description
1560 });
1561 $footer.append($title, $description);
1562 return $footer;
1563 },
1564 setSlideshowContent(options) {
1565 const {
1566 i18n
1567 } = elementorFrontend.config,
1568 $ = jQuery,
1569 isSingleSlide = 1 === options.slides.length,
1570 hasTitle = '' !== elementorFrontend.getKitSettings('lightbox_title_src'),
1571 hasDescription = '' !== elementorFrontend.getKitSettings('lightbox_description_src'),
1572 showFooter = hasTitle || hasDescription,
1573 classes = this.getSettings('classes'),
1574 slideshowClasses = classes.slideshow,
1575 $container = $('<div>', {
1576 class: slideshowClasses.container
1577 }),
1578 $slidesWrapper = $('<div>', {
1579 class: slideshowClasses.slidesWrapper
1580 });
1581 let $prevButton, $nextButton;
1582 options.slides.forEach(slide => {
1583 let slideClass = slideshowClasses.slide + ' ' + classes.item;
1584 if (slide.video) {
1585 slideClass += ' ' + classes.video;
1586 }
1587 const $slide = $('<div>', {
1588 class: slideClass
1589 });
1590 if (slide.video) {
1591 $slide.attr('data-elementor-slideshow-video', slide.video);
1592 const playVideoLoadingElement = this.isFontIconSvgExperiment ? _eIcons.loading.element : '<i>',
1593 $playIcon = $('<div>', {
1594 class: classes.playButton
1595 }).html($(playVideoLoadingElement).attr('aria-label', i18n.playVideo).addClass(classes.playButtonIcon));
1596 $slide.append($playIcon);
1597 } else {
1598 const $zoomContainer = $('<div>', {
1599 class: 'swiper-zoom-container'
1600 }),
1601 $slidePlaceholder = $('<div class="swiper-lazy-preloader"></div>'),
1602 imageAttributes = {
1603 'data-src': slide.image,
1604 class: classes.image + ' ' + classes.preventClose + ' swiper-lazy'
1605 };
1606 if (slide.title) {
1607 imageAttributes['data-title'] = slide.title;
1608 imageAttributes.alt = slide.title;
1609 }
1610 if (slide.description) {
1611 imageAttributes['data-description'] = slide.description;
1612 imageAttributes.alt += ' - ' + slide.description;
1613 }
1614 const $slideImage = $('<img>', imageAttributes);
1615 $zoomContainer.append([$slideImage, $slidePlaceholder]);
1616 $slide.append($zoomContainer);
1617 }
1618 if (slide.hash) {
1619 $slide.attr('data-e-action-hash', slide.hash);
1620 }
1621 $slidesWrapper.append($slide);
1622 });
1623 this.elements.$container = $container;
1624 this.elements.$header = this.getSlideshowHeader();
1625 $container.prepend(this.elements.$header).append($slidesWrapper);
1626 if (!isSingleSlide) {
1627 const $prevButtonIcon = this.isFontIconSvgExperiment ? $(_eIcons.chevronLeft.element) : $('<i>', {
1628 class: slideshowClasses.prevButtonIcon,
1629 'aria-hidden': 'true'
1630 }),
1631 $nextButtonIcon = this.isFontIconSvgExperiment ? $(_eIcons.chevronRight.element) : $('<i>', {
1632 class: slideshowClasses.nextButtonIcon,
1633 'aria-hidden': 'true'
1634 }),
1635 $prevButtonLabel = $('<span>', {
1636 class: 'screen-reader-text'
1637 }).html(i18n.previous),
1638 $nextButtonLabel = $('<span>', {
1639 class: 'screen-reader-text'
1640 }).html(i18n.next);
1641 $prevButton = $('<div>', {
1642 class: slideshowClasses.prevButton + ' ' + classes.preventClose
1643 }).append($prevButtonIcon, $prevButtonLabel);
1644 $nextButton = $('<div>', {
1645 class: slideshowClasses.nextButton + ' ' + classes.preventClose
1646 }).append($nextButtonIcon, $nextButtonLabel);
1647 $container.append($nextButton, $prevButton);
1648 this.$buttons = this.$buttons.add($nextButton).add($prevButton);
1649 }
1650 if (showFooter) {
1651 this.elements.$footer = this.getSlideshowFooter();
1652 $container.append(this.elements.$footer);
1653 }
1654 this.setSettings('hideUiTimeout', '');
1655 $container.on('click mousemove keypress', this.showLightboxUi);
1656 const modal = this.getModal();
1657 modal.setMessage($container);
1658 const onShowMethod = modal.onShow;
1659 modal.onShow = async () => {
1660 onShowMethod();
1661 const swiperOptions = {
1662 pagination: {
1663 el: '.' + slideshowClasses.counter,
1664 type: 'fraction'
1665 },
1666 on: {
1667 slideChangeTransitionEnd: this.onSlideChange
1668 },
1669 lazy: {
1670 loadPrevNext: true
1671 },
1672 zoom: true,
1673 spaceBetween: 100,
1674 grabCursor: true,
1675 runCallbacksOnInit: false,
1676 loop: true,
1677 keyboard: true,
1678 handleElementorBreakpoints: true
1679 };
1680 if (!isSingleSlide) {
1681 swiperOptions.navigation = {
1682 prevEl: $prevButton[0],
1683 nextEl: $nextButton[0]
1684 };
1685 }
1686 if (options.swiper) {
1687 $.extend(swiperOptions, options.swiper);
1688 }
1689 const Swiper = elementorFrontend.utils.swiper;
1690 this.swiper = await new Swiper($container, swiperOptions);
1691
1692 // Expose the swiper instance in the frontend
1693 $container.data('swiper', this.swiper);
1694 this.setVideoAspectRatio();
1695 this.playSlideVideo();
1696 if (showFooter) {
1697 this.updateFooterText();
1698 }
1699 this.bindHotKeys();
1700 this.makeButtonsAccessible();
1701 };
1702 },
1703 makeButtonsAccessible() {
1704 this.$buttons.attr('tabindex', 0).on('keypress', event => {
1705 const ENTER_KEY = 13,
1706 SPACE_KEY = 32;
1707 if (ENTER_KEY === event.which || SPACE_KEY === event.which) {
1708 jQuery(event.currentTarget).trigger('click');
1709 }
1710 });
1711 },
1712 showLightboxUi() {
1713 const slideshowClasses = this.getSettings('classes').slideshow;
1714 this.elements.$container.removeClass(slideshowClasses.hideUiVisibility);
1715 clearTimeout(this.getSettings('hideUiTimeout'));
1716 this.setSettings('hideUiTimeout', setTimeout(() => {
1717 if (!this.shareMode) {
1718 this.elements.$container.addClass(slideshowClasses.hideUiVisibility);
1719 }
1720 }, 3500));
1721 },
1722 bindHotKeys() {
1723 this.getModal().getElements('window').on('keydown', this.activeKeyDown);
1724 },
1725 unbindHotKeys() {
1726 this.getModal().getElements('window').off('keydown', this.activeKeyDown);
1727 },
1728 activeKeyDown(event) {
1729 this.showLightboxUi();
1730 const TAB_KEY = 9;
1731 if (event.which === TAB_KEY) {
1732 const $buttons = this.$buttons;
1733 let focusedButton,
1734 isFirst = false,
1735 isLast = false;
1736 $buttons.each(index => {
1737 const item = $buttons[index];
1738 if (jQuery(item).is(':focus')) {
1739 focusedButton = item;
1740 isFirst = 0 === index;
1741 isLast = $buttons.length - 1 === index;
1742 return false;
1743 }
1744 });
1745 if (event.shiftKey) {
1746 if (isFirst) {
1747 event.preventDefault();
1748 $buttons.last().trigger('focus');
1749 }
1750 } else if (isLast || !focusedButton) {
1751 event.preventDefault();
1752 $buttons.first().trigger('focus');
1753 }
1754 }
1755 },
1756 setVideoAspectRatio(aspectRatio) {
1757 aspectRatio = aspectRatio || this.getSettings('modalOptions.videoAspectRatio');
1758 const $widgetContent = this.getModal().getElements('widgetContent'),
1759 oldAspectRatio = this.oldAspectRatio,
1760 aspectRatioClass = this.getSettings('classes.aspectRatio');
1761 this.oldAspectRatio = aspectRatio;
1762 if (oldAspectRatio) {
1763 $widgetContent.removeClass(aspectRatioClass.replace('%s', oldAspectRatio));
1764 }
1765 if (aspectRatio) {
1766 $widgetContent.addClass(aspectRatioClass.replace('%s', aspectRatio));
1767 }
1768 },
1769 getSlide(slideState) {
1770 return jQuery(this.swiper.slides).filter(this.getSettings('selectors.slideshow.' + slideState + 'Slide'));
1771 },
1772 updateFooterText() {
1773 if (!this.elements.$footer) {
1774 return;
1775 }
1776 const classes = this.getSettings('classes'),
1777 $activeSlide = this.getSlide('active'),
1778 $image = $activeSlide.find('.elementor-lightbox-image'),
1779 titleText = $image.data('title'),
1780 descriptionText = $image.data('description'),
1781 $title = this.elements.$footer.find('.' + classes.slideshow.title),
1782 $description = this.elements.$footer.find('.' + classes.slideshow.description);
1783 $title.text(titleText || '');
1784 $description.text(descriptionText || '');
1785 },
1786 playSlideVideo() {
1787 const $activeSlide = this.getSlide('active'),
1788 videoURL = $activeSlide.data('elementor-slideshow-video');
1789 if (!videoURL) {
1790 return;
1791 }
1792 const classes = this.getSettings('classes'),
1793 $videoContainer = jQuery('<div>', {
1794 class: classes.videoContainer + ' ' + classes.invisible
1795 }),
1796 $videoWrapper = jQuery('<div>', {
1797 class: classes.videoWrapper
1798 }),
1799 $playIcon = $activeSlide.children('.' + classes.playButton);
1800 let videoType, apiProvider;
1801 $videoContainer.append($videoWrapper);
1802 $activeSlide.append($videoContainer);
1803 if (-1 !== videoURL.indexOf('vimeo.com')) {
1804 videoType = 'vimeo';
1805 apiProvider = elementorFrontend.utils.vimeo;
1806 } else if (videoURL.match(/^(?:https?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com)/)) {
1807 videoType = 'youtube';
1808 apiProvider = elementorFrontend.utils.youtube;
1809 }
1810 const videoID = apiProvider.getVideoIDFromURL(videoURL);
1811 apiProvider.onApiReady(apiObject => {
1812 if ('youtube' === videoType) {
1813 this.prepareYTVideo(apiObject, videoID, $videoContainer, $videoWrapper, $playIcon);
1814 } else if ('vimeo' === videoType) {
1815 this.prepareVimeoVideo(apiObject, videoURL, $videoContainer, $videoWrapper, $playIcon);
1816 }
1817 });
1818 $playIcon.addClass(classes.playing).removeClass(classes.hidden);
1819 },
1820 prepareYTVideo(YT, videoID, $videoContainer, $videoWrapper, $playIcon) {
1821 const classes = this.getSettings('classes'),
1822 $videoPlaceholderElement = jQuery('<div>');
1823 let startStateCode = YT.PlayerState.PLAYING;
1824 $videoWrapper.append($videoPlaceholderElement);
1825
1826 // Since version 67, Chrome doesn't fire the `PLAYING` state at start time
1827 if (window.chrome) {
1828 startStateCode = YT.PlayerState.UNSTARTED;
1829 }
1830 $videoContainer.addClass('elementor-loading' + ' ' + classes.invisible);
1831 this.player = new YT.Player($videoPlaceholderElement[0], {
1832 videoId: videoID,
1833 events: {
1834 onReady: () => {
1835 $playIcon.addClass(classes.hidden);
1836 $videoContainer.removeClass(classes.invisible);
1837 this.player.playVideo();
1838 },
1839 onStateChange: event => {
1840 if (event.data === startStateCode) {
1841 $videoContainer.removeClass('elementor-loading' + ' ' + classes.invisible);
1842 }
1843 }
1844 },
1845 playerVars: {
1846 controls: 0,
1847 rel: 0
1848 }
1849 });
1850 },
1851 prepareVimeoVideo(Vimeo, videoURL, $videoContainer, $videoWrapper, $playIcon) {
1852 const classes = this.getSettings('classes'),
1853 vimeoOptions = {
1854 url: videoURL,
1855 autoplay: true,
1856 transparent: false,
1857 playsinline: false
1858 };
1859 this.player = new Vimeo.Player($videoWrapper, vimeoOptions);
1860 this.player.ready().then(() => {
1861 $playIcon.addClass(classes.hidden);
1862 $videoContainer.removeClass(classes.invisible);
1863 });
1864 },
1865 setEntranceAnimation(animation) {
1866 animation = animation || elementorFrontend.getCurrentDeviceSetting(this.getSettings('modalOptions'), 'entranceAnimation');
1867 const $widgetMessage = this.getModal().getElements('message');
1868 if (this.oldAnimation) {
1869 $widgetMessage.removeClass(this.oldAnimation);
1870 }
1871 this.oldAnimation = animation;
1872 if (animation) {
1873 $widgetMessage.addClass('animated ' + animation);
1874 }
1875 },
1876 openSlideshow(slideshowID, initialSlideURL) {
1877 const $allSlideshowLinks = jQuery(this.getSettings('selectors.links')).filter((index, element) => {
1878 const $element = jQuery(element);
1879 return slideshowID === element.dataset.elementorLightboxSlideshow && !$element.parent('.swiper-slide-duplicate').length && !$element.parents('.slick-cloned').length;
1880 });
1881 const slides = [];
1882 let initialSlideIndex = 0;
1883 $allSlideshowLinks.each(function () {
1884 const slideVideo = this.dataset.elementorLightboxVideo;
1885 let slideIndex = this.dataset.elementorLightboxIndex;
1886 if (undefined === slideIndex) {
1887 slideIndex = $allSlideshowLinks.index(this);
1888 }
1889 if (initialSlideURL === this.href || slideVideo && initialSlideURL === slideVideo) {
1890 initialSlideIndex = slideIndex;
1891 }
1892 const slideData = {
1893 image: this.href,
1894 index: slideIndex,
1895 title: this.dataset.elementorLightboxTitle,
1896 description: this.dataset.elementorLightboxDescription,
1897 hash: this.getAttribute('data-e-action-hash')
1898 };
1899 if (slideVideo) {
1900 slideData.video = slideVideo;
1901 }
1902 slides.push(slideData);
1903 });
1904 slides.sort((a, b) => a.index - b.index);
1905 this.showModal({
1906 type: 'slideshow',
1907 id: slideshowID,
1908 modalOptions: {
1909 id: 'elementor-lightbox-slideshow-' + slideshowID
1910 },
1911 slideshow: {
1912 slides,
1913 swiper: {
1914 initialSlide: +initialSlideIndex
1915 }
1916 }
1917 });
1918 },
1919 onSlideChange() {
1920 this.getSlide('prev').add(this.getSlide('next')).add(this.getSlide('active')).find('.' + this.getSettings('classes.videoWrapper')).remove();
1921 this.playSlideVideo();
1922 this.updateFooterText();
1923 }
1924 });
1925
1926 /***/ }),
1927
1928 /***/ "../assets/dev/js/frontend/utils/lightbox/screenfull.js":
1929 /*!**************************************************************!*\
1930 !*** ../assets/dev/js/frontend/utils/lightbox/screenfull.js ***!
1931 \**************************************************************/
1932 /***/ ((module) => {
1933
1934 "use strict";
1935
1936
1937 (function () {
1938 'use strict';
1939
1940 var document = typeof window !== 'undefined' && typeof window.document !== 'undefined' ? window.document : {};
1941 var isCommonjs = true && module.exports;
1942 var fn = function () {
1943 var val;
1944 var fnMap = [['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'],
1945 // New WebKit
1946 ['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'],
1947 // Old WebKit
1948 ['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'], ['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'], ['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']];
1949 var i = 0;
1950 var l = fnMap.length;
1951 var ret = {};
1952 for (; i < l; i++) {
1953 val = fnMap[i];
1954 if (val && val[1] in document) {
1955 var valLength = val.length;
1956 for (i = 0; i < valLength; i++) {
1957 ret[fnMap[0][i]] = val[i];
1958 }
1959 return ret;
1960 }
1961 }
1962 return false;
1963 }();
1964 var eventNameMap = {
1965 change: fn.fullscreenchange,
1966 error: fn.fullscreenerror
1967 };
1968 var screenfull = {
1969 request(element) {
1970 return new Promise(function (resolve, reject) {
1971 var onFullScreenEntered = function () {
1972 this.off('change', onFullScreenEntered);
1973 resolve();
1974 }.bind(this);
1975 this.on('change', onFullScreenEntered);
1976 element = element || document.documentElement;
1977 Promise.resolve(element[fn.requestFullscreen]()).catch(reject);
1978 }.bind(this));
1979 },
1980 exit() {
1981 return new Promise(function (resolve, reject) {
1982 if (!this.isFullscreen) {
1983 resolve();
1984 return;
1985 }
1986 var onFullScreenExit = function () {
1987 this.off('change', onFullScreenExit);
1988 resolve();
1989 }.bind(this);
1990 this.on('change', onFullScreenExit);
1991 Promise.resolve(document[fn.exitFullscreen]()).catch(reject);
1992 }.bind(this));
1993 },
1994 toggle(element) {
1995 return this.isFullscreen ? this.exit() : this.request(element);
1996 },
1997 onchange(callback) {
1998 this.on('change', callback);
1999 },
2000 onerror(callback) {
2001 this.on('error', callback);
2002 },
2003 on(event, callback) {
2004 var eventName = eventNameMap[event];
2005 if (eventName) {
2006 document.addEventListener(eventName, callback, false);
2007 }
2008 },
2009 off(event, callback) {
2010 var eventName = eventNameMap[event];
2011 if (eventName) {
2012 document.removeEventListener(eventName, callback, false);
2013 }
2014 },
2015 raw: fn
2016 };
2017 if (!fn) {
2018 if (isCommonjs) {
2019 module.exports = {
2020 isEnabled: false
2021 };
2022 } else {
2023 window.screenfull = {
2024 isEnabled: false
2025 };
2026 }
2027 return;
2028 }
2029 Object.defineProperties(screenfull, {
2030 isFullscreen: {
2031 get() {
2032 return Boolean(document[fn.fullscreenElement]);
2033 }
2034 },
2035 element: {
2036 enumerable: true,
2037 get() {
2038 return document[fn.fullscreenElement];
2039 }
2040 },
2041 isEnabled: {
2042 enumerable: true,
2043 get() {
2044 // Coerce to boolean in case of old WebKit
2045 return Boolean(document[fn.fullscreenEnabled]);
2046 }
2047 }
2048 });
2049 if (isCommonjs) {
2050 module.exports = screenfull;
2051 } else {
2052 window.screenfull = screenfull;
2053 }
2054 })();
2055
2056 /***/ }),
2057
2058 /***/ "../node_modules/@babel/runtime/helpers/defineProperty.js":
2059 /*!****************************************************************!*\
2060 !*** ../node_modules/@babel/runtime/helpers/defineProperty.js ***!
2061 \****************************************************************/
2062 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2063
2064 var toPropertyKey = __webpack_require__(/*! ./toPropertyKey.js */ "../node_modules/@babel/runtime/helpers/toPropertyKey.js");
2065 function _defineProperty(obj, key, value) {
2066 key = toPropertyKey(key);
2067 if (key in obj) {
2068 Object.defineProperty(obj, key, {
2069 value: value,
2070 enumerable: true,
2071 configurable: true,
2072 writable: true
2073 });
2074 } else {
2075 obj[key] = value;
2076 }
2077 return obj;
2078 }
2079 module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports;
2080
2081 /***/ }),
2082
2083 /***/ "../node_modules/@babel/runtime/helpers/toPrimitive.js":
2084 /*!*************************************************************!*\
2085 !*** ../node_modules/@babel/runtime/helpers/toPrimitive.js ***!
2086 \*************************************************************/
2087 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2088
2089 var _typeof = (__webpack_require__(/*! ./typeof.js */ "../node_modules/@babel/runtime/helpers/typeof.js")["default"]);
2090 function _toPrimitive(input, hint) {
2091 if (_typeof(input) !== "object" || input === null) return input;
2092 var prim = input[Symbol.toPrimitive];
2093 if (prim !== undefined) {
2094 var res = prim.call(input, hint || "default");
2095 if (_typeof(res) !== "object") return res;
2096 throw new TypeError("@@toPrimitive must return a primitive value.");
2097 }
2098 return (hint === "string" ? String : Number)(input);
2099 }
2100 module.exports = _toPrimitive, module.exports.__esModule = true, module.exports["default"] = module.exports;
2101
2102 /***/ }),
2103
2104 /***/ "../node_modules/@babel/runtime/helpers/toPropertyKey.js":
2105 /*!***************************************************************!*\
2106 !*** ../node_modules/@babel/runtime/helpers/toPropertyKey.js ***!
2107 \***************************************************************/
2108 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2109
2110 var _typeof = (__webpack_require__(/*! ./typeof.js */ "../node_modules/@babel/runtime/helpers/typeof.js")["default"]);
2111 var toPrimitive = __webpack_require__(/*! ./toPrimitive.js */ "../node_modules/@babel/runtime/helpers/toPrimitive.js");
2112 function _toPropertyKey(arg) {
2113 var key = toPrimitive(arg, "string");
2114 return _typeof(key) === "symbol" ? key : String(key);
2115 }
2116 module.exports = _toPropertyKey, module.exports.__esModule = true, module.exports["default"] = module.exports;
2117
2118 /***/ }),
2119
2120 /***/ "../node_modules/@babel/runtime/helpers/typeof.js":
2121 /*!********************************************************!*\
2122 !*** ../node_modules/@babel/runtime/helpers/typeof.js ***!
2123 \********************************************************/
2124 /***/ ((module) => {
2125
2126 function _typeof(obj) {
2127 "@babel/helpers - typeof";
2128
2129 return (module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
2130 return typeof obj;
2131 } : function (obj) {
2132 return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
2133 }, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(obj);
2134 }
2135 module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports;
2136
2137 /***/ })
2138
2139 },
2140 /******/ __webpack_require__ => { // webpackRuntimeModules
2141 /******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
2142 /******/ __webpack_require__.O(0, ["frontend","frontend-modules"], () => (__webpack_exec__("../assets/dev/js/frontend/preloaded-modules.js")));
2143 /******/ var __webpack_exports__ = __webpack_require__.O();
2144 /******/ }
2145 ]);
2146 //# sourceMappingURL=preloaded-modules.js.map