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