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

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

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