PluginProbe
Elementor Website Builder – more than just a page builder / 3.10.1
Elementor Website Builder – more than just a page builder v3.10.1
4.3.4 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 All 457 releases
elementor / assets / js / preloaded-modules.js

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

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