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

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

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