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

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