PluginProbe
Elementor Website Builder – more than just a page builder / 3.19.1
Elementor Website Builder – more than just a page builder v3.19.1
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.19.1, at assets/js/preloaded-modules.js

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