PluginProbe
Elementor Website Builder – more than just a page builder / 3.6.8
Elementor Website Builder – more than just a page builder v3.6.8
4.3.3 4.3.2 4.3.1 4.3.0 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 All 456 releases
elementor / assets / js / preloaded-modules.js

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

2,518 lines 79.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*! elementor - v3.6.8 - 27-07-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.key) {
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 const slides = [{
1498 image: options.url,
1499 index: 0,
1500 title: options.title,
1501 description: options.description,
1502 hash: options.hash
1503 }];
1504 options.slideshow = {
1505 slides,
1506 swiper: {
1507 loop: false,
1508 pagination: false
1509 }
1510 };
1511 self.setSlideshowContent(options.slideshow);
1512 break;
1513
1514 case 'slideshow':
1515 self.setSlideshowContent(options.slideshow);
1516 break;
1517
1518 default:
1519 self.setHTMLContent(options.html);
1520 }
1521
1522 modal.show();
1523 },
1524
1525 createLightbox(element) {
1526 let lightboxData = {};
1527
1528 if (element.dataset.elementorLightbox) {
1529 lightboxData = JSON.parse(element.dataset.elementorLightbox);
1530 }
1531
1532 if (lightboxData.type && 'slideshow' !== lightboxData.type) {
1533 this.showModal(lightboxData);
1534 return;
1535 }
1536
1537 if (!element.dataset.elementorLightboxSlideshow) {
1538 const slideshowID = 'single-img';
1539 this.showModal({
1540 type: 'image',
1541 id: slideshowID,
1542 url: element.href,
1543 hash: element.getAttribute('e-action-hash'),
1544 title: element.dataset.elementorLightboxTitle,
1545 description: element.dataset.elementorLightboxDescription,
1546 modalOptions: {
1547 id: 'elementor-lightbox-slideshow-' + slideshowID
1548 }
1549 });
1550 return;
1551 }
1552
1553 const initialSlideURL = element.dataset.elementorLightboxVideo || element.href;
1554 this.openSlideshow(element.dataset.elementorLightboxSlideshow, initialSlideURL);
1555 },
1556
1557 setHTMLContent(html) {
1558 if (window.elementorCommon) {
1559 elementorCommon.helpers.hardDeprecated('elementorFrontend.utils.lightbox.setHTMLContent', '3.1.4');
1560 }
1561
1562 this.getModal().setMessage(html);
1563 },
1564
1565 setVideoContent(options) {
1566 const $ = jQuery;
1567 let $videoElement;
1568
1569 if ('hosted' === options.videoType) {
1570 const videoParams = $.extend({
1571 src: options.url,
1572 autoplay: ''
1573 }, options.videoParams);
1574 $videoElement = $('<video>', videoParams);
1575 } else {
1576 let apiProvider;
1577
1578 if (-1 !== options.url.indexOf('vimeo.com')) {
1579 apiProvider = elementorFrontend.utils.vimeo;
1580 } else if (options.url.match(/^(?:https?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com|youtube-nocookie\.com)/)) {
1581 apiProvider = elementorFrontend.utils.youtube;
1582 } else {
1583 return;
1584 }
1585
1586 $videoElement = $('<iframe>', {
1587 src: apiProvider.getAutoplayURL(options.url),
1588 allowfullscreen: 1
1589 });
1590 }
1591
1592 const classes = this.getSettings('classes'),
1593 $videoContainer = $('<div>', {
1594 class: `${classes.videoContainer} ${classes.preventClose}`
1595 }),
1596 $videoWrapper = $('<div>', {
1597 class: classes.videoWrapper
1598 });
1599 $videoWrapper.append($videoElement);
1600 $videoContainer.append($videoWrapper);
1601 const modal = this.getModal();
1602 modal.setMessage($videoContainer);
1603 this.setVideoAspectRatio();
1604 const onHideMethod = modal.onHide;
1605
1606 modal.onHide = function () {
1607 onHideMethod();
1608 this.$buttons = jQuery();
1609 this.focusedButton = null;
1610 modal.getElements('message').removeClass('elementor-fit-aspect-ratio');
1611 };
1612 },
1613
1614 getShareLinks() {
1615 const {
1616 i18n
1617 } = elementorFrontend.config,
1618 socialNetworks = {
1619 facebook: {
1620 label: i18n.shareOnFacebook,
1621 iconElement: _eIcons.facebook
1622 },
1623 twitter: {
1624 label: i18n.shareOnTwitter,
1625 iconElement: _eIcons.twitter
1626 },
1627 pinterest: {
1628 label: i18n.pinIt,
1629 iconElement: _eIcons.pinterest
1630 }
1631 },
1632 $ = jQuery,
1633 classes = this.getSettings('classes'),
1634 selectors = this.getSettings('selectors'),
1635 $linkList = $('<div>', {
1636 class: classes.slideshow.shareLinks
1637 }),
1638 $activeSlide = this.getSlide('active'),
1639 $image = $activeSlide.find(selectors.image),
1640 videoUrl = $activeSlide.data('elementor-slideshow-video');
1641 let itemUrl;
1642
1643 if (videoUrl) {
1644 itemUrl = videoUrl;
1645 } else {
1646 itemUrl = $image.attr('src');
1647 }
1648
1649 $.each(socialNetworks, (key, data) => {
1650 const networkLabel = data.label,
1651 $link = $('<a>', {
1652 href: this.createShareLink(key, itemUrl, $activeSlide.attr('e-action-hash')),
1653 target: '_blank'
1654 }).text(networkLabel),
1655 $socialNetworkIconElement = this.isFontIconSvgExperiment ? $(data.iconElement.element) : $('<i>', {
1656 class: 'eicon-' + key
1657 });
1658 $link.prepend($socialNetworkIconElement);
1659 $linkList.append($link);
1660 });
1661
1662 if (!videoUrl) {
1663 const $downloadIcon = this.isFontIconSvgExperiment ? $(_eIcons.downloadBold.element) : $('<i>', {
1664 class: 'eicon-download-bold'
1665 });
1666 $downloadIcon.attr('aria-label', i18n.download);
1667 $linkList.append($('<a>', {
1668 href: itemUrl,
1669 download: ''
1670 }).text(i18n.downloadImage).prepend($downloadIcon));
1671 }
1672
1673 return $linkList;
1674 },
1675
1676 createShareLink(networkName, itemUrl) {
1677 let hash = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
1678 const options = {};
1679
1680 if ('pinterest' === networkName) {
1681 options.image = encodeURIComponent(itemUrl);
1682 } else {
1683 options.url = encodeURIComponent(location.href.replace(/#.*/, '') + hash);
1684 }
1685
1686 return ShareLink.getNetworkLink(networkName, options);
1687 },
1688
1689 getSlideshowHeader() {
1690 const {
1691 i18n
1692 } = elementorFrontend.config,
1693 $ = jQuery,
1694 showCounter = 'yes' === elementorFrontend.getKitSettings('lightbox_enable_counter'),
1695 showFullscreen = 'yes' === elementorFrontend.getKitSettings('lightbox_enable_fullscreen'),
1696 showZoom = 'yes' === elementorFrontend.getKitSettings('lightbox_enable_zoom'),
1697 showShare = 'yes' === elementorFrontend.getKitSettings('lightbox_enable_share'),
1698 classes = this.getSettings('classes'),
1699 slideshowClasses = classes.slideshow,
1700 elements = this.elements;
1701
1702 if (!(showCounter || showFullscreen || showZoom || showShare)) {
1703 return;
1704 }
1705
1706 elements.$header = $('<header>', {
1707 class: slideshowClasses.header + ' ' + classes.preventClose
1708 });
1709
1710 if (showShare) {
1711 const iconElement = this.isFontIconSvgExperiment ? _eIcons.shareArrow.element : '<i>';
1712 elements.$iconShare = $(iconElement, {
1713 class: slideshowClasses.iconShare,
1714 role: 'button',
1715 'aria-label': i18n.share,
1716 'aria-expanded': false
1717 }).append($('<span>'));
1718 const $shareLinks = $('<div>');
1719 $shareLinks.on('click', e => {
1720 e.stopPropagation();
1721 });
1722 elements.$shareMenu = $('<div>', {
1723 class: slideshowClasses.shareMenu
1724 }).append($shareLinks);
1725 elements.$iconShare.add(elements.$shareMenu).on('click', this.toggleShareMenu);
1726 elements.$header.append(elements.$iconShare, elements.$shareMenu);
1727 this.$buttons = this.$buttons.add(elements.$iconShare);
1728 }
1729
1730 if (showZoom) {
1731 const iconElement = this.isFontIconSvgExperiment ? _eIcons.zoomInBold.element : '<i>',
1732 showZoomElements = [],
1733 showZoomAttrs = {
1734 role: 'switch',
1735 'aria-checked': false,
1736 'aria-label': i18n.zoom
1737 },
1738 zoomAttrs = { ...showZoomAttrs
1739 };
1740
1741 if (!this.isFontIconSvgExperiment) {
1742 zoomAttrs.class = slideshowClasses.iconZoomIn;
1743 }
1744
1745 elements.$iconZoom = $(iconElement).attr(zoomAttrs).on('click', this.toggleZoomMode);
1746 showZoomElements.push(elements.$iconZoom);
1747
1748 if (this.isFontIconSvgExperiment) {
1749 elements.$iconZoomOut = $(_eIcons.zoomOutBold.element).attr(showZoomAttrs).addClass(classes.hidden).on('click', this.toggleZoomMode);
1750 showZoomElements.push(elements.$iconZoomOut);
1751 }
1752
1753 elements.$header.append(showZoomElements);
1754 this.$buttons = this.$buttons.add(showZoomElements);
1755 }
1756
1757 if (showFullscreen) {
1758 const iconElement = this.isFontIconSvgExperiment ? _eIcons.frameExpand.element : '<i>',
1759 fullScreenElements = [],
1760 fullScreenAttrs = {
1761 role: 'switch',
1762 'aria-checked': false,
1763 'aria-label': i18n.fullscreen
1764 },
1765 expandAttrs = { ...fullScreenAttrs
1766 }; // Only if the experiment is not active, we use the class-name in order to render the icon.
1767
1768 if (!this.isFontIconSvgExperiment) {
1769 expandAttrs.class = slideshowClasses.iconExpand;
1770 }
1771
1772 elements.$iconExpand = $(iconElement).append($('<span>'), $('<span>')).attr(expandAttrs).on('click', this.toggleFullscreen);
1773 fullScreenElements.push(elements.$iconExpand);
1774
1775 if (this.isFontIconSvgExperiment) {
1776 elements.$iconMinimize = $(_eIcons.frameMinimize.element).attr(fullScreenAttrs).addClass(classes.hidden).on('click', this.toggleFullscreen);
1777 fullScreenElements.push(elements.$iconMinimize);
1778 }
1779
1780 elements.$header.append(fullScreenElements);
1781 this.$buttons = this.$buttons.add(fullScreenElements);
1782 }
1783
1784 if (showCounter) {
1785 elements.$counter = $('<span>', {
1786 class: slideshowClasses.counter
1787 });
1788 elements.$header.append(elements.$counter);
1789 }
1790
1791 return elements.$header;
1792 },
1793
1794 toggleFullscreen() {
1795 if (_screenfull.default.isFullscreen) {
1796 this.deactivateFullscreen();
1797 } else if (_screenfull.default.isEnabled) {
1798 this.activateFullscreen();
1799 }
1800 },
1801
1802 toggleZoomMode() {
1803 if (1 !== this.swiper.zoom.scale) {
1804 this.deactivateZoom();
1805 } else {
1806 this.activateZoom();
1807 }
1808 },
1809
1810 toggleShareMenu() {
1811 if (this.shareMode) {
1812 this.deactivateShareMode();
1813 } else {
1814 this.elements.$shareMenu.html(this.getShareLinks());
1815 this.activateShareMode();
1816 }
1817 },
1818
1819 activateShareMode() {
1820 const classes = this.getSettings('classes');
1821 this.elements.$container.addClass(classes.slideshow.shareMode);
1822 this.elements.$iconShare.attr('aria-expanded', true); // Prevent swiper interactions while in share mode
1823
1824 this.swiper.detachEvents(); // Temporarily replace tabbable buttons with share-menu items
1825
1826 this.$originalButtons = this.$buttons;
1827 this.$buttons = this.elements.$iconShare.add(this.elements.$shareMenu.find('a'));
1828 this.shareMode = true;
1829 },
1830
1831 deactivateShareMode() {
1832 const classes = this.getSettings('classes');
1833 this.elements.$container.removeClass(classes.slideshow.shareMode);
1834 this.elements.$iconShare.attr('aria-expanded', false);
1835 this.swiper.attachEvents();
1836 this.$buttons = this.$originalButtons;
1837 this.shareMode = false;
1838 },
1839
1840 activateFullscreen() {
1841 const classes = this.getSettings('classes');
1842
1843 _screenfull.default.request(this.elements.$container.parents('.dialog-widget')[0]);
1844
1845 if (this.isFontIconSvgExperiment) {
1846 this.elements.$iconExpand.addClass(classes.hidden).attr('aria-checked', 'false');
1847 this.elements.$iconMinimize.removeClass(classes.hidden).attr('aria-checked', 'true');
1848 } else {
1849 this.elements.$iconExpand.removeClass(classes.slideshow.iconExpand).addClass(classes.slideshow.iconShrink).attr('aria-checked', 'true');
1850 }
1851
1852 this.elements.$container.addClass(classes.slideshow.fullscreenMode);
1853 },
1854
1855 deactivateFullscreen() {
1856 const classes = this.getSettings('classes');
1857
1858 _screenfull.default.exit();
1859
1860 if (this.isFontIconSvgExperiment) {
1861 this.elements.$iconExpand.removeClass(classes.hidden).attr('aria-checked', 'true');
1862 this.elements.$iconMinimize.addClass(classes.hidden).attr('aria-checked', 'false');
1863 } else {
1864 this.elements.$iconExpand.removeClass(classes.slideshow.iconShrink).addClass(classes.slideshow.iconExpand).attr('aria-checked', 'false');
1865 }
1866
1867 this.elements.$container.removeClass(classes.slideshow.fullscreenMode);
1868 },
1869
1870 activateZoom() {
1871 const swiper = this.swiper,
1872 elements = this.elements,
1873 classes = this.getSettings('classes');
1874 swiper.zoom.in();
1875 swiper.allowSlideNext = false;
1876 swiper.allowSlidePrev = false;
1877 swiper.allowTouchMove = false;
1878 elements.$container.addClass(classes.slideshow.zoomMode);
1879
1880 if (this.isFontIconSvgExperiment) {
1881 elements.$iconZoom.addClass(classes.hidden).attr('aria-checked', 'false');
1882 elements.$iconZoomOut.removeClass(classes.hidden).attr('aria-checked', 'true');
1883 } else {
1884 elements.$iconZoom.removeClass(classes.slideshow.iconZoomIn).addClass(classes.slideshow.iconZoomOut);
1885 }
1886 },
1887
1888 deactivateZoom() {
1889 const swiper = this.swiper,
1890 elements = this.elements,
1891 classes = this.getSettings('classes');
1892 swiper.zoom.out();
1893 swiper.allowSlideNext = true;
1894 swiper.allowSlidePrev = true;
1895 swiper.allowTouchMove = true;
1896 elements.$container.removeClass(classes.slideshow.zoomMode);
1897
1898 if (this.isFontIconSvgExperiment) {
1899 elements.$iconZoom.removeClass(classes.hidden).attr('aria-checked', 'true');
1900 elements.$iconZoomOut.addClass(classes.hidden).attr('aria-checked', 'false');
1901 } else {
1902 elements.$iconZoom.removeClass(classes.slideshow.iconZoomOut).addClass(classes.slideshow.iconZoomIn);
1903 }
1904 },
1905
1906 getSlideshowFooter() {
1907 const $ = jQuery,
1908 classes = this.getSettings('classes'),
1909 $footer = $('<footer>', {
1910 class: classes.slideshow.footer + ' ' + classes.preventClose
1911 }),
1912 $title = $('<div>', {
1913 class: classes.slideshow.title
1914 }),
1915 $description = $('<div>', {
1916 class: classes.slideshow.description
1917 });
1918 $footer.append($title, $description);
1919 return $footer;
1920 },
1921
1922 setSlideshowContent(options) {
1923 const {
1924 i18n
1925 } = elementorFrontend.config,
1926 $ = jQuery,
1927 isSingleSlide = 1 === options.slides.length,
1928 hasTitle = '' !== elementorFrontend.getKitSettings('lightbox_title_src'),
1929 hasDescription = '' !== elementorFrontend.getKitSettings('lightbox_description_src'),
1930 showFooter = hasTitle || hasDescription,
1931 classes = this.getSettings('classes'),
1932 slideshowClasses = classes.slideshow,
1933 $container = $('<div>', {
1934 class: slideshowClasses.container
1935 }),
1936 $slidesWrapper = $('<div>', {
1937 class: slideshowClasses.slidesWrapper
1938 });
1939 let $prevButton, $nextButton;
1940 options.slides.forEach(slide => {
1941 let slideClass = slideshowClasses.slide + ' ' + classes.item;
1942
1943 if (slide.video) {
1944 slideClass += ' ' + classes.video;
1945 }
1946
1947 const $slide = $('<div>', {
1948 class: slideClass
1949 });
1950
1951 if (slide.video) {
1952 $slide.attr('data-elementor-slideshow-video', slide.video);
1953 const playVideoLoadingElement = this.isFontIconSvgExperiment ? _eIcons.loading.element : '<i>',
1954 $playIcon = $('<div>', {
1955 class: classes.playButton
1956 }).html($(playVideoLoadingElement).attr('aria-label', i18n.playVideo).addClass(classes.playButtonIcon));
1957 $slide.append($playIcon);
1958 } else {
1959 const $zoomContainer = $('<div>', {
1960 class: 'swiper-zoom-container'
1961 }),
1962 $slidePlaceholder = $('<div class="swiper-lazy-preloader"></div>'),
1963 imageAttributes = {
1964 'data-src': slide.image,
1965 class: classes.image + ' ' + classes.preventClose + ' swiper-lazy'
1966 };
1967
1968 if (slide.title) {
1969 imageAttributes['data-title'] = slide.title;
1970 imageAttributes.alt = slide.title;
1971 }
1972
1973 if (slide.description) {
1974 imageAttributes['data-description'] = slide.description;
1975 imageAttributes.alt += ' - ' + slide.description;
1976 }
1977
1978 const $slideImage = $('<img>', imageAttributes);
1979 $zoomContainer.append([$slideImage, $slidePlaceholder]);
1980 $slide.append($zoomContainer);
1981 }
1982
1983 if (slide.hash) {
1984 $slide.attr('e-action-hash', slide.hash);
1985 }
1986
1987 $slidesWrapper.append($slide);
1988 });
1989 this.elements.$container = $container;
1990 this.elements.$header = this.getSlideshowHeader();
1991 $container.prepend(this.elements.$header).append($slidesWrapper);
1992
1993 if (!isSingleSlide) {
1994 const $prevButtonIcon = this.isFontIconSvgExperiment ? $(_eIcons.chevronLeft.element) : $('<i>', {
1995 class: slideshowClasses.prevButtonIcon
1996 }),
1997 $nextButtonIcon = this.isFontIconSvgExperiment ? $(_eIcons.chevronRight.element) : $('<i>', {
1998 class: slideshowClasses.nextButtonIcon
1999 });
2000 $prevButton = $('<div>', {
2001 class: slideshowClasses.prevButton + ' ' + classes.preventClose,
2002 'aria-label': i18n.previous
2003 }).html($prevButtonIcon);
2004 $nextButton = $('<div>', {
2005 class: slideshowClasses.nextButton + ' ' + classes.preventClose,
2006 'aria-label': i18n.next
2007 }).html($nextButtonIcon);
2008 $container.append($nextButton, $prevButton);
2009 this.$buttons = this.$buttons.add($nextButton).add($prevButton);
2010 }
2011
2012 if (showFooter) {
2013 this.elements.$footer = this.getSlideshowFooter();
2014 $container.append(this.elements.$footer);
2015 }
2016
2017 this.setSettings('hideUiTimeout', '');
2018 $container.on('click mousemove keypress', this.showLightboxUi);
2019 const modal = this.getModal();
2020 modal.setMessage($container);
2021 const onShowMethod = modal.onShow;
2022
2023 modal.onShow = async () => {
2024 onShowMethod();
2025 const swiperOptions = {
2026 pagination: {
2027 el: '.' + slideshowClasses.counter,
2028 type: 'fraction'
2029 },
2030 on: {
2031 slideChangeTransitionEnd: this.onSlideChange
2032 },
2033 lazy: {
2034 loadPrevNext: true
2035 },
2036 zoom: true,
2037 spaceBetween: 100,
2038 grabCursor: true,
2039 runCallbacksOnInit: false,
2040 loop: true,
2041 keyboard: true,
2042 handleElementorBreakpoints: true
2043 };
2044
2045 if (!isSingleSlide) {
2046 swiperOptions.navigation = {
2047 prevEl: $prevButton,
2048 nextEl: $nextButton
2049 };
2050 }
2051
2052 if (options.swiper) {
2053 $.extend(swiperOptions, options.swiper);
2054 }
2055
2056 const Swiper = elementorFrontend.utils.swiper;
2057 this.swiper = await new Swiper($container, swiperOptions); // Expose the swiper instance in the frontend
2058
2059 $container.data('swiper', this.swiper);
2060 this.setVideoAspectRatio();
2061 this.playSlideVideo();
2062
2063 if (showFooter) {
2064 this.updateFooterText();
2065 }
2066
2067 this.bindHotKeys();
2068 this.makeButtonsAccessible();
2069 };
2070 },
2071
2072 makeButtonsAccessible() {
2073 this.$buttons.attr('tabindex', 0).on('keypress', event => {
2074 const ENTER_KEY = 13,
2075 SPACE_KEY = 32;
2076
2077 if (ENTER_KEY === event.which || SPACE_KEY === event.which) {
2078 jQuery(event.currentTarget).trigger('click');
2079 }
2080 });
2081 },
2082
2083 showLightboxUi() {
2084 const slideshowClasses = this.getSettings('classes').slideshow;
2085 this.elements.$container.removeClass(slideshowClasses.hideUiVisibility);
2086 clearTimeout(this.getSettings('hideUiTimeout'));
2087 this.setSettings('hideUiTimeout', setTimeout(() => {
2088 if (!this.shareMode) {
2089 this.elements.$container.addClass(slideshowClasses.hideUiVisibility);
2090 }
2091 }, 3500));
2092 },
2093
2094 bindHotKeys() {
2095 this.getModal().getElements('window').on('keydown', this.activeKeyDown);
2096 },
2097
2098 unbindHotKeys() {
2099 this.getModal().getElements('window').off('keydown', this.activeKeyDown);
2100 },
2101
2102 activeKeyDown(event) {
2103 this.showLightboxUi();
2104 const TAB_KEY = 9;
2105
2106 if (event.which === TAB_KEY) {
2107 const $buttons = this.$buttons;
2108 let focusedButton,
2109 isFirst = false,
2110 isLast = false;
2111 $buttons.each(index => {
2112 const item = $buttons[index];
2113
2114 if (jQuery(item).is(':focus')) {
2115 focusedButton = item;
2116 isFirst = 0 === index;
2117 isLast = $buttons.length - 1 === index;
2118 return false;
2119 }
2120 });
2121
2122 if (event.shiftKey) {
2123 if (isFirst) {
2124 event.preventDefault();
2125 $buttons.last().trigger('focus');
2126 }
2127 } else if (isLast || !focusedButton) {
2128 event.preventDefault();
2129 $buttons.first().trigger('focus');
2130 }
2131 }
2132 },
2133
2134 setVideoAspectRatio(aspectRatio) {
2135 aspectRatio = aspectRatio || this.getSettings('modalOptions.videoAspectRatio');
2136 const $widgetContent = this.getModal().getElements('widgetContent'),
2137 oldAspectRatio = this.oldAspectRatio,
2138 aspectRatioClass = this.getSettings('classes.aspectRatio');
2139 this.oldAspectRatio = aspectRatio;
2140
2141 if (oldAspectRatio) {
2142 $widgetContent.removeClass(aspectRatioClass.replace('%s', oldAspectRatio));
2143 }
2144
2145 if (aspectRatio) {
2146 $widgetContent.addClass(aspectRatioClass.replace('%s', aspectRatio));
2147 }
2148 },
2149
2150 getSlide(slideState) {
2151 return jQuery(this.swiper.slides).filter(this.getSettings('selectors.slideshow.' + slideState + 'Slide'));
2152 },
2153
2154 updateFooterText() {
2155 if (!this.elements.$footer) {
2156 return;
2157 }
2158
2159 const classes = this.getSettings('classes'),
2160 $activeSlide = this.getSlide('active'),
2161 $image = $activeSlide.find('.elementor-lightbox-image'),
2162 titleText = $image.data('title'),
2163 descriptionText = $image.data('description'),
2164 $title = this.elements.$footer.find('.' + classes.slideshow.title),
2165 $description = this.elements.$footer.find('.' + classes.slideshow.description);
2166 $title.text(titleText || '');
2167 $description.text(descriptionText || '');
2168 },
2169
2170 playSlideVideo() {
2171 const $activeSlide = this.getSlide('active'),
2172 videoURL = $activeSlide.data('elementor-slideshow-video');
2173
2174 if (!videoURL) {
2175 return;
2176 }
2177
2178 const classes = this.getSettings('classes'),
2179 $videoContainer = jQuery('<div>', {
2180 class: classes.videoContainer + ' ' + classes.invisible
2181 }),
2182 $videoWrapper = jQuery('<div>', {
2183 class: classes.videoWrapper
2184 }),
2185 $playIcon = $activeSlide.children('.' + classes.playButton);
2186 let videoType, apiProvider;
2187 $videoContainer.append($videoWrapper);
2188 $activeSlide.append($videoContainer);
2189
2190 if (-1 !== videoURL.indexOf('vimeo.com')) {
2191 videoType = 'vimeo';
2192 apiProvider = elementorFrontend.utils.vimeo;
2193 } else if (videoURL.match(/^(?:https?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com)/)) {
2194 videoType = 'youtube';
2195 apiProvider = elementorFrontend.utils.youtube;
2196 }
2197
2198 const videoID = apiProvider.getVideoIDFromURL(videoURL);
2199 apiProvider.onApiReady(apiObject => {
2200 if ('youtube' === videoType) {
2201 this.prepareYTVideo(apiObject, videoID, $videoContainer, $videoWrapper, $playIcon);
2202 } else if ('vimeo' === videoType) {
2203 this.prepareVimeoVideo(apiObject, videoURL, $videoContainer, $videoWrapper, $playIcon);
2204 }
2205 });
2206 $playIcon.addClass(classes.playing).removeClass(classes.hidden);
2207 },
2208
2209 prepareYTVideo(YT, videoID, $videoContainer, $videoWrapper, $playIcon) {
2210 const classes = this.getSettings('classes'),
2211 $videoPlaceholderElement = jQuery('<div>');
2212 let startStateCode = YT.PlayerState.PLAYING;
2213 $videoWrapper.append($videoPlaceholderElement); // Since version 67, Chrome doesn't fire the `PLAYING` state at start time
2214
2215 if (window.chrome) {
2216 startStateCode = YT.PlayerState.UNSTARTED;
2217 }
2218
2219 $videoContainer.addClass('elementor-loading' + ' ' + classes.invisible);
2220 this.player = new YT.Player($videoPlaceholderElement[0], {
2221 videoId: videoID,
2222 events: {
2223 onReady: () => {
2224 $playIcon.addClass(classes.hidden);
2225 $videoContainer.removeClass(classes.invisible);
2226 this.player.playVideo();
2227 },
2228 onStateChange: event => {
2229 if (event.data === startStateCode) {
2230 $videoContainer.removeClass('elementor-loading' + ' ' + classes.invisible);
2231 }
2232 }
2233 },
2234 playerVars: {
2235 controls: 0,
2236 rel: 0
2237 }
2238 });
2239 },
2240
2241 prepareVimeoVideo(Vimeo, videoURL, $videoContainer, $videoWrapper, $playIcon) {
2242 const classes = this.getSettings('classes'),
2243 vimeoOptions = {
2244 url: videoURL,
2245 autoplay: true,
2246 transparent: false,
2247 playsinline: false
2248 };
2249 this.player = new Vimeo.Player($videoWrapper, vimeoOptions);
2250 this.player.ready().then(() => {
2251 $playIcon.addClass(classes.hidden);
2252 $videoContainer.removeClass(classes.invisible);
2253 });
2254 },
2255
2256 setEntranceAnimation(animation) {
2257 animation = animation || elementorFrontend.getCurrentDeviceSetting(this.getSettings('modalOptions'), 'entranceAnimation');
2258 const $widgetMessage = this.getModal().getElements('message');
2259
2260 if (this.oldAnimation) {
2261 $widgetMessage.removeClass(this.oldAnimation);
2262 }
2263
2264 this.oldAnimation = animation;
2265
2266 if (animation) {
2267 $widgetMessage.addClass('animated ' + animation);
2268 }
2269 },
2270
2271 openSlideshow(slideshowID, initialSlideURL) {
2272 const $allSlideshowLinks = jQuery(this.getSettings('selectors.links')).filter((index, element) => {
2273 const $element = jQuery(element);
2274 return slideshowID === element.dataset.elementorLightboxSlideshow && !$element.parent('.swiper-slide-duplicate').length && !$element.parents('.slick-cloned').length;
2275 });
2276 const slides = [];
2277 let initialSlideIndex = 0;
2278 $allSlideshowLinks.each(function () {
2279 const slideVideo = this.dataset.elementorLightboxVideo;
2280 let slideIndex = this.dataset.elementorLightboxIndex;
2281
2282 if (undefined === slideIndex) {
2283 slideIndex = $allSlideshowLinks.index(this);
2284 }
2285
2286 if (initialSlideURL === this.href || slideVideo && initialSlideURL === slideVideo) {
2287 initialSlideIndex = slideIndex;
2288 }
2289
2290 const slideData = {
2291 image: this.href,
2292 index: slideIndex,
2293 title: this.dataset.elementorLightboxTitle,
2294 description: this.dataset.elementorLightboxDescription,
2295 hash: this.getAttribute('e-action-hash')
2296 };
2297
2298 if (slideVideo) {
2299 slideData.video = slideVideo;
2300 }
2301
2302 slides.push(slideData);
2303 });
2304 slides.sort((a, b) => a.index - b.index);
2305 this.showModal({
2306 type: 'slideshow',
2307 id: slideshowID,
2308 modalOptions: {
2309 id: 'elementor-lightbox-slideshow-' + slideshowID
2310 },
2311 slideshow: {
2312 slides,
2313 swiper: {
2314 initialSlide: +initialSlideIndex
2315 }
2316 }
2317 });
2318 },
2319
2320 onSlideChange() {
2321 this.getSlide('prev').add(this.getSlide('next')).add(this.getSlide('active')).find('.' + this.getSettings('classes.videoWrapper')).remove();
2322 this.playSlideVideo();
2323 this.updateFooterText();
2324 }
2325
2326 });
2327
2328 /***/ }),
2329
2330 /***/ "../assets/dev/js/frontend/utils/lightbox/screenfull.js":
2331 /*!**************************************************************!*\
2332 !*** ../assets/dev/js/frontend/utils/lightbox/screenfull.js ***!
2333 \**************************************************************/
2334 /***/ ((module) => {
2335
2336 "use strict";
2337
2338
2339 (function () {
2340 'use strict';
2341
2342 var document = typeof window !== 'undefined' && typeof window.document !== 'undefined' ? window.document : {};
2343 var isCommonjs = true && module.exports;
2344
2345 var fn = function () {
2346 var val;
2347 var fnMap = [['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'], // New WebKit
2348 ['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'], // Old WebKit
2349 ['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'], ['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'], ['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']];
2350 var i = 0;
2351 var l = fnMap.length;
2352 var ret = {};
2353
2354 for (; i < l; i++) {
2355 val = fnMap[i];
2356
2357 if (val && val[1] in document) {
2358 var valLength = val.length;
2359
2360 for (i = 0; i < valLength; i++) {
2361 ret[fnMap[0][i]] = val[i];
2362 }
2363
2364 return ret;
2365 }
2366 }
2367
2368 return false;
2369 }();
2370
2371 var eventNameMap = {
2372 change: fn.fullscreenchange,
2373 error: fn.fullscreenerror
2374 };
2375 var screenfull = {
2376 request(element) {
2377 return new Promise(function (resolve, reject) {
2378 var onFullScreenEntered = function () {
2379 this.off('change', onFullScreenEntered);
2380 resolve();
2381 }.bind(this);
2382
2383 this.on('change', onFullScreenEntered);
2384 element = element || document.documentElement;
2385 Promise.resolve(element[fn.requestFullscreen]()).catch(reject);
2386 }.bind(this));
2387 },
2388
2389 exit() {
2390 return new Promise(function (resolve, reject) {
2391 if (!this.isFullscreen) {
2392 resolve();
2393 return;
2394 }
2395
2396 var onFullScreenExit = function () {
2397 this.off('change', onFullScreenExit);
2398 resolve();
2399 }.bind(this);
2400
2401 this.on('change', onFullScreenExit);
2402 Promise.resolve(document[fn.exitFullscreen]()).catch(reject);
2403 }.bind(this));
2404 },
2405
2406 toggle(element) {
2407 return this.isFullscreen ? this.exit() : this.request(element);
2408 },
2409
2410 onchange(callback) {
2411 this.on('change', callback);
2412 },
2413
2414 onerror(callback) {
2415 this.on('error', callback);
2416 },
2417
2418 on(event, callback) {
2419 var eventName = eventNameMap[event];
2420
2421 if (eventName) {
2422 document.addEventListener(eventName, callback, false);
2423 }
2424 },
2425
2426 off(event, callback) {
2427 var eventName = eventNameMap[event];
2428
2429 if (eventName) {
2430 document.removeEventListener(eventName, callback, false);
2431 }
2432 },
2433
2434 raw: fn
2435 };
2436
2437 if (!fn) {
2438 if (isCommonjs) {
2439 module.exports = {
2440 isEnabled: false
2441 };
2442 } else {
2443 window.screenfull = {
2444 isEnabled: false
2445 };
2446 }
2447
2448 return;
2449 }
2450
2451 Object.defineProperties(screenfull, {
2452 isFullscreen: {
2453 get() {
2454 return Boolean(document[fn.fullscreenElement]);
2455 }
2456
2457 },
2458 element: {
2459 enumerable: true,
2460
2461 get() {
2462 return document[fn.fullscreenElement];
2463 }
2464
2465 },
2466 isEnabled: {
2467 enumerable: true,
2468
2469 get() {
2470 // Coerce to boolean in case of old WebKit
2471 return Boolean(document[fn.fullscreenEnabled]);
2472 }
2473
2474 }
2475 });
2476
2477 if (isCommonjs) {
2478 module.exports = screenfull;
2479 } else {
2480 window.screenfull = screenfull;
2481 }
2482 })();
2483
2484 /***/ }),
2485
2486 /***/ "../node_modules/@babel/runtime/helpers/defineProperty.js":
2487 /*!****************************************************************!*\
2488 !*** ../node_modules/@babel/runtime/helpers/defineProperty.js ***!
2489 \****************************************************************/
2490 /***/ ((module) => {
2491
2492 function _defineProperty(obj, key, value) {
2493 if (key in obj) {
2494 Object.defineProperty(obj, key, {
2495 value: value,
2496 enumerable: true,
2497 configurable: true,
2498 writable: true
2499 });
2500 } else {
2501 obj[key] = value;
2502 }
2503
2504 return obj;
2505 }
2506
2507 module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports;
2508
2509 /***/ })
2510
2511 },
2512 /******/ __webpack_require__ => { // webpackRuntimeModules
2513 /******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
2514 /******/ __webpack_require__.O(0, ["frontend","frontend-modules"], () => (__webpack_exec__("../assets/dev/js/frontend/preloaded-modules.js")));
2515 /******/ var __webpack_exports__ = __webpack_require__.O();
2516 /******/ }
2517 ]);
2518 //# sourceMappingURL=preloaded-modules.js.map