1/*! elementor-pro - v3.29.0 - 04-06-2025 */ 2(self["webpackChunkelementor_pro"] = self["webpackChunkelementor_pro"] || []).push([["frontend"],{ 3
4/***/ "../assets/dev/js/frontend/frontend.js": 5/*!*********************************************!*\ 6 !*** ../assets/dev/js/frontend/frontend.js ***! 7 \*********************************************/ 8/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 9 10"use strict"; 11 12 13var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); 14__webpack_require__(/*! ../public-path */ "../assets/dev/js/public-path.js"); 15var _frontend = _interopRequireDefault(__webpack_require__(/*! ../../../../modules/motion-fx/assets/js/frontend/frontend */ "../modules/motion-fx/assets/js/frontend/frontend.js")); 16var _frontend2 = _interopRequireDefault(__webpack_require__(/*! ../../../../modules/sticky/assets/js/frontend/frontend */ "../modules/sticky/assets/js/frontend/frontend.js")); 17var _frontend3 = _interopRequireDefault(__webpack_require__(/*! ../../../../modules/code-highlight/assets/js/frontend/frontend */ "../modules/code-highlight/assets/js/frontend/frontend.js")); 18var _frontend4 = _interopRequireDefault(__webpack_require__(/*! ../../../../modules/video-playlist/assets/js/frontend/frontend */ "../modules/video-playlist/assets/js/frontend/frontend.js")); 19var _frontend5 = _interopRequireDefault(__webpack_require__(/*! ../../../../modules/payments/assets/js/frontend/frontend */ "../modules/payments/assets/js/frontend/frontend.js")); 20var _frontend6 = _interopRequireDefault(__webpack_require__(/*! ../../../../modules/progress-tracker/assets/js/frontend/frontend */ "../modules/progress-tracker/assets/js/frontend/frontend.js")); 21var _controls = _interopRequireDefault(__webpack_require__(/*! ./utils/controls */ "../assets/dev/js/frontend/utils/controls.js")); 22var _dropdownMenuHeightController = _interopRequireDefault(__webpack_require__(/*! ./utils/dropdown-menu-height-controller */ "../assets/dev/js/frontend/utils/dropdown-menu-height-controller.js")); 23class ElementorProFrontend extends elementorModules.ViewModule { 24 onInit() { 25 super.onInit(); 26 this.config = ElementorProFrontendConfig; 27 this.modules = {}; 28 this.initOnReadyComponents(); 29 } 30 bindEvents() { 31 jQuery(window).on('elementor/frontend/init', this.onElementorFrontendInit.bind(this)); 32 } 33 initModules() { 34 // Handlers that should be available by default for sections usage. 35 let handlers = { 36 motionFX: _frontend.default, 37 sticky: _frontend2.default, 38 codeHighlight: _frontend3.default, 39 videoPlaylist: _frontend4.default, 40 payments: _frontend5.default, 41 progressTracker: _frontend6.default 42 }; 43 44 // Keep this line before applying filter on the handlers. 45 elementorProFrontend.trigger('elementor-pro/modules/init/before'); 46 handlers = elementorFrontend.hooks.applyFilters('elementor-pro/frontend/handlers', handlers); 47 jQuery.each(handlers, (moduleName, ModuleClass) => { 48 this.modules[moduleName] = new ModuleClass(); 49 }); 50 51 // TODO: BC Since 2.9.0 52 this.modules.linkActions = { 53 addAction: function () { 54 elementorFrontend.utils.urlActions.addAction(...arguments); 55 } 56 }; 57 } 58 onElementorFrontendInit() { 59 this.initModules(); 60 } 61 initOnReadyComponents() { 62 this.utils = { 63 controls: new _controls.default(), 64 DropdownMenuHeightController: _dropdownMenuHeightController.default 65 }; 66 } 67} 68window.elementorProFrontend = new ElementorProFrontend(); 69 70/***/ }), 71
72/***/ "../assets/dev/js/frontend/utils/controls.js": 73/*!***************************************************!*\ 74 !*** ../assets/dev/js/frontend/utils/controls.js ***! 75 \***************************************************/ 76/***/ ((__unused_webpack_module, exports) => { 77 78"use strict"; 79 80 81Object.defineProperty(exports, "__esModule", ({ 82 value: true 83})); 84exports["default"] = void 0; 85class Controls { 86 /** 87 * Get Control Value 88 * 89 * Retrieves a control value. 90 * This function has been copied from `elementor/assets/dev/js/editor/utils/conditions.js`. 91 * 92 * @since 3.11.0 93 * 94 * @param {{}} controlSettings A settings object (e.g. element settings - keys and values) 95 * @param {string} controlKey The control key name 96 * @param {string} controlSubKey A specific property of the control object. 97 * @return {*} Control Value 98 */ 99 getControlValue(controlSettings, controlKey, controlSubKey) { 100 let value; 101 if ('object' === typeof controlSettings[controlKey] && controlSubKey) { 102 value = controlSettings[controlKey][controlSubKey]; 103 } else { 104 value = controlSettings[controlKey]; 105 } 106 return value; 107 } 108 109 /** 110 * Get the value of a responsive control. 111 * 112 * Retrieves the value of a responsive control for the current device or for this first parent device which has a control value. 113 * 114 * @since 3.11.0 115 * 116 * @param {{}} controlSettings A settings object (e.g. element settings - keys and values) 117 * @param {string} controlKey The control key name 118 * @param {string} controlSubKey A specific property of the control object. 119 * @return {*} Control Value 120 */ 121 getResponsiveControlValue(controlSettings, controlKey) {
122 let controlSubKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; 123 const currentDeviceMode = elementorFrontend.getCurrentDeviceMode(), 124 controlValueDesktop = this.getControlValue(controlSettings, controlKey, controlSubKey); 125 126 // Set the control value for the current device mode. 127 // First check the widescreen device mode. 128 if ('widescreen' === currentDeviceMode) { 129 const controlValueWidescreen = this.getControlValue(controlSettings, `${controlKey}_widescreen`, controlSubKey); 130 return !!controlValueWidescreen || 0 === controlValueWidescreen ? controlValueWidescreen : controlValueDesktop; 131 } 132 133 // Loop through all responsive and desktop device modes. 134 const activeBreakpoints = elementorFrontend.breakpoints.getActiveBreakpointsList({ 135 withDesktop: true 136 }); 137 let parentDeviceMode = currentDeviceMode, 138 deviceIndex = activeBreakpoints.indexOf(currentDeviceMode), 139 controlValue = ''; 140 while (deviceIndex <= activeBreakpoints.length) { 141 if ('desktop' === parentDeviceMode) { 142 controlValue = controlValueDesktop; 143 break; 144 } 145 const responsiveControlKey = `${controlKey}_${parentDeviceMode}`, 146 responsiveControlValue = this.getControlValue(controlSettings, responsiveControlKey, controlSubKey); 147 if (!!responsiveControlValue || 0 === responsiveControlValue) { 148 controlValue = responsiveControlValue; 149 break; 150 } 151 152 // If no control value has been set for the current device mode, then check the parent device mode. 153 deviceIndex++; 154 parentDeviceMode = activeBreakpoints[deviceIndex]; 155 } 156 return controlValue; 157 } 158} 159exports["default"] = Controls; 160 161/***/ }), 162
163/***/ "../assets/dev/js/frontend/utils/dropdown-menu-height-controller.js": 164/*!**************************************************************************!*\ 165 !*** ../assets/dev/js/frontend/utils/dropdown-menu-height-controller.js ***! 166 \**************************************************************************/ 167/***/ ((__unused_webpack_module, exports) => { 168 169"use strict"; 170 171 172Object.defineProperty(exports, "__esModule", ({ 173 value: true 174})); 175exports["default"] = void 0; 176class DropdownMenuHeightController { 177 constructor(widgetConfig) { 178 this.widgetConfig = widgetConfig; 179 } 180 calculateStickyMenuNavHeight() { 181 this.widgetConfig.elements.$dropdownMenuContainer.css(this.widgetConfig.settings.menuHeightCssVarName, ''); 182 const menuToggleHeight = this.widgetConfig.elements.$dropdownMenuContainer.offset().top - jQuery(window).scrollTop(); 183 return elementorFrontend.elements.$window.height() - menuToggleHeight; 184 } 185 calculateMenuTabContentHeight($tab) { 186 return elementorFrontend.elements.$window.height() - $tab[0].getBoundingClientRect().top; 187 } 188 isElementSticky() { 189 return this.widgetConfig.elements.$element.hasClass('elementor-sticky') || this.widgetConfig.elements.$element.parents('.elementor-sticky').length; 190 } 191 getMenuHeight() { 192 return this.isElementSticky() ? this.calculateStickyMenuNavHeight() + 'px' : this.widgetConfig.settings.dropdownMenuContainerMaxHeight; 193 } 194 setMenuHeight(menuHeight) { 195 this.widgetConfig.elements.$dropdownMenuContainer.css(this.widgetConfig.settings.menuHeightCssVarName, menuHeight); 196 } 197 reassignMobileMenuHeight() { 198 const menuHeight = this.isToggleActive() ? this.getMenuHeight() : 0; 199 return this.setMenuHeight(menuHeight); 200 } 201 reassignMenuHeight($activeTabContent) { 202 if (!this.isElementSticky() || 0 === $activeTabContent.length) { 203 return; 204 } 205 const offsetBottom = elementorFrontend.elements.$window.height() - $activeTabContent[0].getBoundingClientRect().top, 206 isContentHeightBiggerThanWindow = $activeTabContent.height() > offsetBottom; 207 if (!isContentHeightBiggerThanWindow) { 208 return; 209 } 210 $activeTabContent.css('height', this.calculateMenuTabContentHeight($activeTabContent) + 'px'); 211 $activeTabContent.css('overflow-y', 'scroll'); 212 } 213 resetMenuHeight($activeTabContent) { 214 if (!this.isElementSticky()) { 215 return; 216 } 217 $activeTabContent.css('height', 'initial'); 218 $activeTabContent.css('overflow-y', 'visible'); 219 } 220 isToggleActive() { 221 const $menuToggle = this.widgetConfig.elements.$menuToggle; 222 223 // New approach. 224 // Aria attributes instead of css classes. 225 if (!!this.widgetConfig.attributes?.menuToggleState) { 226 return 'true' === $menuToggle.attr(this.widgetConfig.attributes.menuToggleState); 227 } 228 229 // This can be removed once the new markup of the Mega Menu has been implemented. 230 // Previously we used state classes to indicate the active state of the menu toggle. 231 return $menuToggle.hasClass(this.widgetConfig.classes.menuToggleActiveClass); 232 } 233} 234exports["default"] = DropdownMenuHeightController; 235 236/***/ }), 237
238/***/ "../assets/dev/js/public-path.js": 239/*!***************************************!*\ 240 !*** ../assets/dev/js/public-path.js ***! 241 \***************************************/ 242/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 243 244"use strict"; 245 246 247/* eslint-disable camelcase */ 248__webpack_require__.p = ElementorProFrontendConfig.urls.assets + 'js/'; 249 250/***/ }), 251
252/***/ "../modules/code-highlight/assets/js/frontend/frontend.js": 253/*!****************************************************************!*\ 254 !*** ../modules/code-highlight/assets/js/frontend/frontend.js ***! 255 \****************************************************************/ 256/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 257 258"use strict"; 259 260 261Object.defineProperty(exports, "__esModule", ({ 262 value: true 263})); 264exports["default"] = void 0; 265class _default extends elementorModules.Module { 266 constructor() { 267 super(); 268 elementorFrontend.elementsHandler.attachHandler('code-highlight', () => __webpack_require__.e(/*! import() | code-highlight */ "code-highlight").then(__webpack_require__.bind(__webpack_require__, /*! ./handler */ "../modules/code-highlight/assets/js/frontend/handler.js"))); 269 } 270} 271exports["default"] = _default; 272 273/***/ }), 274
275/***/ "../modules/motion-fx/assets/js/frontend/frontend.js": 276/*!***********************************************************!*\ 277 !*** ../modules/motion-fx/assets/js/frontend/frontend.js ***! 278 \***********************************************************/ 279/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 280 281"use strict"; 282 283 284var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); 285Object.defineProperty(exports, "__esModule", ({ 286 value: true 287})); 288exports["default"] = void 0; 289var _handler = _interopRequireDefault(__webpack_require__(/*! ./handler */ "../modules/motion-fx/assets/js/frontend/handler.js")); 290class _default extends elementorModules.Module { 291 constructor() { 292 super(); 293 elementorFrontend.elementsHandler.attachHandler('global', _handler.default, null); 294 } 295} 296exports["default"] = _default; 297 298/***/ }), 299
300/***/ "../modules/motion-fx/assets/js/frontend/handler.js": 301/*!**********************************************************!*\ 302 !*** ../modules/motion-fx/assets/js/frontend/handler.js ***! 303 \**********************************************************/ 304/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 305 306"use strict"; 307 308 309var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); 310Object.defineProperty(exports, "__esModule", ({ 311 value: true 312})); 313exports["default"] = void 0; 314var _motionFx = _interopRequireDefault(__webpack_require__(/*! ./motion-fx/motion-fx */ "../modules/motion-fx/assets/js/frontend/motion-fx/motion-fx.js")); 315class _default extends elementorModules.frontend.handlers.Base { 316 __construct() { 317 super.__construct(...arguments); 318 this.toggle = elementorFrontend.debounce(this.toggle, 200); 319 } 320 getDefaultSettings() { 321 return { 322 selectors: { 323 container: '.elementor-widget-container' 324 } 325 }; 326 } 327 getDefaultElements() { 328 const selectors = this.getSettings('selectors'); 329 let container = this.$element.find(selectors.container); 330 if (0 === container.length) { 331 container = this.$element; 332 } 333 return { 334 $container: container 335 }; 336 } 337 bindEvents() { 338 elementorFrontend.elements.$window.on('resize', this.toggle); 339 } 340 unbindEvents() { 341 elementorFrontend.elements.$window.off('resize', this.toggle); 342 } 343 addCSSTransformEvents() { 344 // Remove CSS transition variable that assigned from scroll.js in order to allow the transition of the CSS-Transform. 345 const motionFxScrolling = this.getElementSettings('motion_fx_motion_fx_scrolling'); 346 if (motionFxScrolling && !this.isTransitionEventAdded) { 347 this.isTransitionEventAdded = true; 348 this.elements.$container.on('mouseenter', () => { 349 this.elements.$container.css('--e-transform-transition-duration', ''); 350 }); 351 } 352 } 353 initEffects() { 354 this.effects = { 355 translateY: { 356 interaction: 'scroll', 357 actions: ['translateY'] 358 }, 359 translateX: { 360 interaction: 'scroll', 361 actions: ['translateX'] 362 }, 363 rotateZ: { 364 interaction: 'scroll', 365 actions: ['rotateZ'] 366 }, 367 scale: { 368 interaction: 'scroll', 369 actions: ['scale'] 370 }, 371 opacity: { 372 interaction: 'scroll', 373 actions: ['opacity'] 374 }, 375 blur: { 376 interaction: 'scroll', 377 actions: ['blur'] 378 }, 379 mouseTrack: { 380 interaction: 'mouseMove', 381 actions: ['translateXY'] 382 }, 383 tilt: { 384 interaction: 'mouseMove', 385 actions: ['tilt'] 386 } 387 }; 388 } 389 prepareOptions(name) { 390 const elementSettings = this.getElementSettings(), 391 type = 'motion_fx' === name ? 'element' : 'background', 392 interactions = {}; 393 jQuery.each(elementSettings, (key, value) => { 394 const keyRegex = new RegExp('^' + name + '_(.+?)_effect'), 395 keyMatches = key.match(keyRegex); 396 if (!keyMatches || !value) { 397 return; 398 } 399 const options = {}, 400 effectName = keyMatches[1]; 401 jQuery.each(elementSettings, (subKey, subValue) => { 402 const subKeyRegex = new RegExp(name + '_' + effectName + '_(.+)'), 403 subKeyMatches = subKey.match(subKeyRegex); 404 if (!subKeyMatches) { 405 return; 406 } 407 const subFieldName = subKeyMatches[1]; 408 if ('effect' === subFieldName) { 409 return; 410 } 411 if ('object' === typeof subValue) { 412 subValue = Object.keys(subValue.sizes).length ? subValue.sizes : subValue.size; 413 } 414 options[subKeyMatches[1]] = subValue; 415 }); 416 const effect = this.effects[effectName], 417 interactionName = effect.interaction; 418 if (!interactions[interactionName]) { 419 interactions[interactionName] = {}; 420 } 421 effect.actions.forEach(action => interactions[interactionName][action] = options); 422 }); 423 let $element = this.$element, 424 $dimensionsElement, 425 $childElement; 426 const elementType = this.getElementType(); 427 if ('element' === type && !['section', 'container'].includes(elementType)) { 428 $dimensionsElement = $element; 429 let childElementSelector;
430 if ('column' === elementType) { 431 childElementSelector = '.elementor-widget-wrap'; 432 } else { 433 childElementSelector = '.elementor-widget-container'; 434 } 435 $childElement = $element.find('> ' + childElementSelector); 436 $element = 0 === $childElement.length ? this.$element : $childElement; 437 } 438 const options = { 439 type, 440 interactions, 441 elementSettings, 442 $element, 443 $dimensionsElement, 444 refreshDimensions: this.isEdit, 445 range: elementSettings[name + '_range'], 446 classes: { 447 element: 'elementor-motion-effects-element', 448 parent: 'elementor-motion-effects-parent', 449 backgroundType: 'elementor-motion-effects-element-type-background', 450 container: 'elementor-motion-effects-container', 451 layer: 'elementor-motion-effects-layer', 452 perspective: 'elementor-motion-effects-perspective' 453 } 454 }; 455 if (!options.range && 'fixed' === this.getCurrentDeviceSetting('_position')) { 456 options.range = 'page'; 457 } 458 if ('fixed' === this.getCurrentDeviceSetting('_position')) { 459 options.isFixedPosition = true; 460 } 461 if ('background' === type && 'column' === this.getElementType()) { 462 options.addBackgroundLayerTo = ' > .elementor-element-populated'; 463 } 464 return options; 465 } 466 activate(name) { 467 const options = this.prepareOptions(name); 468 if (jQuery.isEmptyObject(options.interactions)) { 469 return; 470 } 471 this[name] = new _motionFx.default(options); 472 } 473 deactivate(name) { 474 if (this[name]) { 475 this[name].destroy(); 476 delete this[name]; 477 } 478 } 479 toggle() { 480 const currentDeviceMode = elementorFrontend.getCurrentDeviceMode(), 481 elementSettings = this.getElementSettings(); 482 ['motion_fx', 'background_motion_fx'].forEach(name => { 483 const devices = elementSettings[name + '_devices'], 484 isCurrentModeActive = !devices || -1 !== devices.indexOf(currentDeviceMode); 485 if (isCurrentModeActive && (elementSettings[name + '_motion_fx_scrolling'] || elementSettings[name + '_motion_fx_mouse'])) { 486 if (this[name]) { 487 this.refreshInstance(name); 488 } else { 489 this.activate(name); 490 } 491 } else { 492 this.deactivate(name); 493 } 494 }); 495 } 496 refreshInstance(instanceName) { 497 const instance = this[instanceName]; 498 if (!instance) { 499 return; 500 } 501 const preparedOptions = this.prepareOptions(instanceName); 502 instance.setSettings(preparedOptions); 503 instance.refresh(); 504 } 505 onInit() { 506 super.onInit(); 507 this.initEffects(); 508 this.addCSSTransformEvents(); 509 this.toggle(); 510 } 511 onElementChange(propertyName) { 512 if (/motion_fx_((scrolling)|(mouse)|(devices))$/.test(propertyName)) { 513 if ('motion_fx_motion_fx_scrolling' === propertyName) { 514 this.addCSSTransformEvents(); 515 } 516 this.toggle(); 517 return; 518 } 519 const propertyMatches = propertyName.match('.*?(motion_fx|_transform)'); 520 if (propertyMatches) { 521 const instanceName = propertyMatches[0].match('(_transform)') ? 'motion_fx' : propertyMatches[0]; 522 this.refreshInstance(instanceName); 523 if (!this[instanceName]) { 524 this.activate(instanceName); 525 } 526 } 527 if (/^_position/.test(propertyName)) { 528 ['motion_fx', 'background_motion_fx'].forEach(instanceName => { 529 this.refreshInstance(instanceName); 530 }); 531 } 532 } 533 onDestroy() { 534 super.onDestroy(); 535 ['motion_fx', 'background_motion_fx'].forEach(name => { 536 this.deactivate(name); 537 }); 538 } 539} 540exports["default"] = _default; 541 542/***/ }), 543
544/***/ "../modules/motion-fx/assets/js/frontend/motion-fx/actions.js": 545/*!********************************************************************!*\ 546 !*** ../modules/motion-fx/assets/js/frontend/motion-fx/actions.js ***! 547 \********************************************************************/ 548/***/ ((__unused_webpack_module, exports) => { 549 550"use strict"; 551 552 553Object.defineProperty(exports, "__esModule", ({ 554 value: true 555})); 556exports["default"] = void 0; 557class _default extends elementorModules.Module { 558 getMovePointFromPassedPercents(movableRange, passedPercents) { 559 const movePoint = passedPercents / movableRange * 100; 560 return +movePoint.toFixed(2); 561 } 562 getEffectValueFromMovePoint(range, movePoint) { 563 return range * movePoint / 100; 564 } 565 getStep(passedPercents, options) { 566 if ('element' === this.getSettings('type')) { 567 return this.getElementStep(passedPercents, options); 568 } 569 return this.getBackgroundStep(passedPercents, options); 570 } 571 getElementStep(passedPercents, options) { 572 return -(passedPercents - 50) * options.speed; 573 } 574 getBackgroundStep(passedPercents, options) { 575 const movableRange = this.getSettings('dimensions.movable' + options.axis.toUpperCase()); 576 return -this.getEffectValueFromMovePoint(movableRange, passedPercents); 577 } 578 getDirectionMovePoint(passedPercents, direction, range) { 579 let movePoint; 580 if (passedPercents < range.start) { 581 if ('out-in' === direction) { 582 movePoint = 0; 583 } else if ('in-out' === direction) { 584 movePoint = 100; 585 } else { 586 movePoint = this.getMovePointFromPassedPercents(range.start, passedPercents); 587 if ('in-out-in' === direction) { 588 movePoint = 100 - movePoint; 589 } 590 } 591 } else if (passedPercents < range.end) { 592 if ('in-out-in' === direction) { 593 movePoint = 0; 594 } else if ('out-in-out' === direction) { 595 movePoint = 100; 596 } else { 597 movePoint = this.getMovePointFromPassedPercents(range.end - range.start, passedPercents - range.start); 598 if ('in-out' === direction) { 599 movePoint = 100 - movePoint; 600 } 601 } 602 } else if ('in-out' === direction) { 603 movePoint = 0; 604 } else if ('out-in' === direction) { 605 movePoint = 100; 606 } else { 607 movePoint = this.getMovePointFromPassedPercents(100 - range.end, 100 - passedPercents); 608 if ('in-out-in' === direction) { 609 movePoint = 100 - movePoint; 610 } 611 } 612 return movePoint; 613 } 614 translateX(actionData, passedPercents) { 615 actionData.axis = 'x'; 616 actionData.unit = 'px'; 617 this.transform('translateX', passedPercents, actionData); 618 } 619 translateY(actionData, passedPercents) { 620 actionData.axis = 'y'; 621 actionData.unit = 'px'; 622 this.transform('translateY', passedPercents, actionData); 623 } 624 translateXY(actionData, passedPercentsX, passedPercentsY) { 625 this.translateX(actionData, passedPercentsX); 626 this.translateY(actionData, passedPercentsY); 627 } 628 tilt(actionData, passedPercentsX, passedPercentsY) { 629 const options = { 630 speed: actionData.speed / 10, 631 direction: actionData.direction 632 }; 633 this.rotateX(options, passedPercentsY); 634 this.rotateY(options, 100 - passedPercentsX); 635 } 636 rotateX(actionData, passedPercents) { 637 actionData.axis = 'x'; 638 actionData.unit = 'deg'; 639 this.transform('rotateX', passedPercents, actionData); 640 } 641 rotateY(actionData, passedPercents) { 642 actionData.axis = 'y'; 643 actionData.unit = 'deg'; 644 this.transform('rotateY', passedPercents, actionData); 645 } 646 rotateZ(actionData, passedPercents) { 647 actionData.unit = 'deg'; 648 this.transform('rotateZ', passedPercents, actionData); 649 } 650 scale(actionData, passedPercents) { 651 const movePoint = this.getDirectionMovePoint(passedPercents, actionData.direction, actionData.range); 652 this.updateRulePart('transform', 'scale', 1 + actionData.speed * movePoint / 1000); 653 } 654 transform(action, passedPercents, actionData) { 655 if (actionData.direction) { 656 passedPercents = 100 - passedPercents; 657 }
658 this.updateRulePart('transform', action, this.getStep(passedPercents, actionData) + actionData.unit); 659 } 660 setCSSTransformVariables(elementSettings) { 661 this.CSSTransformVariables = []; 662 jQuery.each(elementSettings, (settingKey, settingValue) => { 663 const transformKeyMatches = settingKey.match(/_transform_(.+?)_effect/m); 664 if (transformKeyMatches && settingValue) { 665 if ('perspective' === transformKeyMatches[1]) { 666 this.CSSTransformVariables.unshift(transformKeyMatches[1]); 667 return; 668 } 669 if (this.CSSTransformVariables.includes(transformKeyMatches[1])) { 670 return; 671 } 672 this.CSSTransformVariables.push(transformKeyMatches[1]); 673 } 674 }); 675 } 676 opacity(actionData, passedPercents) { 677 const movePoint = this.getDirectionMovePoint(passedPercents, actionData.direction, actionData.range), 678 level = actionData.level / 10, 679 opacity = 1 - level + this.getEffectValueFromMovePoint(level, movePoint); 680 this.$element.css({ 681 opacity, 682 'will-change': 'opacity' 683 }); 684 } 685 blur(actionData, passedPercents) { 686 const movePoint = this.getDirectionMovePoint(passedPercents, actionData.direction, actionData.range), 687 blur = actionData.level - this.getEffectValueFromMovePoint(actionData.level, movePoint); 688 this.updateRulePart('filter', 'blur', blur + 'px'); 689 } 690 updateRulePart(ruleName, key, value) { 691 if (!this.rulesVariables[ruleName]) { 692 this.rulesVariables[ruleName] = {}; 693 } 694 if (!this.rulesVariables[ruleName][key]) { 695 this.rulesVariables[ruleName][key] = true; 696 this.updateRule(ruleName); 697 } 698 const cssVarKey = `--${key}`; 699 this.$element[0].style.setProperty(cssVarKey, value); 700 } 701 updateRule(ruleName) { 702 let value = ''; 703 value += this.concatTransformCSSProperties(ruleName); 704 value += this.concatTransformMotionEffectCSSProperties(ruleName); 705 this.$element.css(ruleName, value); 706 } 707 concatTransformCSSProperties(ruleName) { 708 let value = ''; 709 if ('transform' === ruleName) { 710 jQuery.each(this.CSSTransformVariables, (index, variableKey) => { 711 const variableName = variableKey; 712 if (variableKey.startsWith('flip')) { 713 variableKey = variableKey.replace('flip', 'scale'); 714 } 715 716 // Adding default value because of the hover state. if there is no default the transform will break. 717 const defaultUnit = variableKey.startsWith('rotate') || variableKey.startsWith('skew') ? 'deg' : 'px', 718 defaultValue = variableKey.startsWith('scale') ? 1 : 0 + defaultUnit; 719 value += `${variableKey}(var(--e-transform-${variableName}, ${defaultValue}))`; 720 }); 721 } 722 return value; 723 } 724 concatTransformMotionEffectCSSProperties(ruleName) { 725 let value = ''; 726 jQuery.each(this.rulesVariables[ruleName], variableKey => { 727 value += `${variableKey}(var(--${variableKey}))`; 728 }); 729 return value; 730 } 731 runAction(actionName, actionData, passedPercents) { 732 if (actionData.affectedRange) { 733 if (actionData.affectedRange.start > passedPercents) { 734 passedPercents = actionData.affectedRange.start; 735 } 736 if (actionData.affectedRange.end < passedPercents) { 737 passedPercents = actionData.affectedRange.end; 738 } 739 } 740 for (var _len = arguments.length, args = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) { 741 args[_key - 3] = arguments[_key]; 742 } 743 this[actionName](actionData, passedPercents, ...args); 744 } 745 refresh() { 746 this.rulesVariables = {}; 747 this.CSSTransformVariables = []; 748 this.$element.css({ 749 transform: '', 750 filter: '', 751 opacity: '', 752 'will-change': '' 753 }); 754 } 755 onInit() { 756 this.$element = this.getSettings('$targetElement'); 757 this.refresh(); 758 } 759} 760exports["default"] = _default; 761 762/***/ }), 763
764/***/ "../modules/motion-fx/assets/js/frontend/motion-fx/interactions/base.js": 765/*!******************************************************************************!*\ 766 !*** ../modules/motion-fx/assets/js/frontend/motion-fx/interactions/base.js ***! 767 \******************************************************************************/ 768/***/ ((__unused_webpack_module, exports) => { 769 770"use strict"; 771 772 773Object.defineProperty(exports, "__esModule", ({ 774 value: true 775})); 776exports["default"] = void 0; 777class _default extends elementorModules.ViewModule { 778 __construct(options) { 779 this.motionFX = options.motionFX; 780 if (!this.intersectionObservers) { 781 this.setElementInViewportObserver(); 782 } 783 } 784 setElementInViewportObserver() { 785 this.intersectionObserver = elementorModules.utils.Scroll.scrollObserver({ 786 callback: event => { 787 if (event.isInViewport) { 788 this.onInsideViewport(); 789 } else { 790 this.removeAnimationFrameRequest(); 791 } 792 } 793 }); 794 795 // Determine which element we should observe. 796 const observedElement = 'page' === this.motionFX.getSettings('range') ? elementorFrontend.elements.$body[0] : this.motionFX.elements.$parent[0]; 797 this.intersectionObserver.observe(observedElement); 798 } 799 onInsideViewport = () => { 800 this.run(); 801 this.animationFrameRequest = requestAnimationFrame(this.onInsideViewport); 802 }; 803 runCallback() { 804 const callback = this.getSettings('callback'); 805 callback(...arguments); 806 } 807 removeIntersectionObserver() { 808 if (this.intersectionObserver) { 809 this.intersectionObserver.unobserve(this.motionFX.elements.$parent[0]); 810 } 811 } 812 removeAnimationFrameRequest() { 813 if (this.animationFrameRequest) { 814 cancelAnimationFrame(this.animationFrameRequest); 815 } 816 } 817 destroy() { 818 this.removeAnimationFrameRequest(); 819 this.removeIntersectionObserver(); 820 } 821 onInit() { 822 super.onInit(); 823 } 824} 825exports["default"] = _default; 826 827/***/ }), 828
829/***/ "../modules/motion-fx/assets/js/frontend/motion-fx/interactions/mouse-move.js": 830/*!************************************************************************************!*\ 831 !*** ../modules/motion-fx/assets/js/frontend/motion-fx/interactions/mouse-move.js ***! 832 \************************************************************************************/ 833/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 834 835"use strict"; 836 837 838var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); 839Object.defineProperty(exports, "__esModule", ({ 840 value: true 841})); 842exports["default"] = void 0; 843var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/motion-fx/assets/js/frontend/motion-fx/interactions/base.js")); 844class MouseMoveInteraction extends _base.default { 845 bindEvents() { 846 if (!MouseMoveInteraction.mouseTracked) { 847 elementorFrontend.elements.$window.on('mousemove', MouseMoveInteraction.updateMousePosition); 848 MouseMoveInteraction.mouseTracked = true; 849 } 850 } 851 run() { 852 const mousePosition = MouseMoveInteraction.mousePosition, 853 oldMousePosition = this.oldMousePosition; 854 if (oldMousePosition.x === mousePosition.x && oldMousePosition.y === mousePosition.y) { 855 return; 856 } 857 this.oldMousePosition = { 858 x: mousePosition.x, 859 y: mousePosition.y 860 }; 861 const passedPercentsX = 100 / innerWidth * mousePosition.x, 862 passedPercentsY = 100 / innerHeight * mousePosition.y; 863 this.runCallback(passedPercentsX, passedPercentsY); 864 } 865 onInit() { 866 this.oldMousePosition = {}; 867 super.onInit(); 868 } 869} 870exports["default"] = MouseMoveInteraction; 871MouseMoveInteraction.mousePosition = {}; 872MouseMoveInteraction.updateMousePosition = event => { 873 MouseMoveInteraction.mousePosition = { 874 x: event.clientX, 875 y: event.clientY 876 }; 877}; 878 879/***/ }), 880
881/***/ "../modules/motion-fx/assets/js/frontend/motion-fx/interactions/scroll.js": 882/*!********************************************************************************!*\ 883 !*** ../modules/motion-fx/assets/js/frontend/motion-fx/interactions/scroll.js ***! 884 \********************************************************************************/ 885/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 886 887"use strict"; 888 889 890var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); 891Object.defineProperty(exports, "__esModule", ({ 892 value: true 893})); 894exports["default"] = void 0; 895var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/motion-fx/assets/js/frontend/motion-fx/interactions/base.js")); 896class _default extends _base.default { 897 run() { 898 if (pageYOffset === this.windowScrollTop) { 899 return false; 900 } 901 this.onScrollMovement(); 902 this.windowScrollTop = pageYOffset; 903 } 904 onScrollMovement() { 905 this.updateMotionFxDimensions(); 906 this.updateAnimation(); 907 this.resetTransitionVariable(); 908 } 909 resetTransitionVariable() { 910 this.motionFX.$element.css('--e-transform-transition-duration', '100ms'); 911 } 912 updateMotionFxDimensions() { 913 const motionFXSettings = this.motionFX.getSettings(); 914 if (motionFXSettings.refreshDimensions) { 915 this.motionFX.defineDimensions(); 916 } 917 } 918 updateAnimation() { 919 let passedRangePercents; 920 if ('page' === this.motionFX.getSettings('range')) { 921 passedRangePercents = elementorModules.utils.Scroll.getPageScrollPercentage(); 922 } else if (this.motionFX.getSettings('isFixedPosition')) { 923 passedRangePercents = elementorModules.utils.Scroll.getPageScrollPercentage({}, window.innerHeight); 924 } else { 925 passedRangePercents = elementorModules.utils.Scroll.getElementViewportPercentage(this.motionFX.elements.$parent); 926 } 927 this.runCallback(passedRangePercents); 928 } 929} 930exports["default"] = _default; 931 932/***/ }), 933
934/***/ "../modules/motion-fx/assets/js/frontend/motion-fx/motion-fx.js": 935/*!**********************************************************************!*\ 936 !*** ../modules/motion-fx/assets/js/frontend/motion-fx/motion-fx.js ***! 937 \**********************************************************************/ 938/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 939 940"use strict"; 941 942 943var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); 944Object.defineProperty(exports, "__esModule", ({ 945 value: true 946})); 947exports["default"] = void 0; 948var _scroll = _interopRequireDefault(__webpack_require__(/*! ./interactions/scroll */ "../modules/motion-fx/assets/js/frontend/motion-fx/interactions/scroll.js")); 949var _mouseMove = _interopRequireDefault(__webpack_require__(/*! ./interactions/mouse-move */ "../modules/motion-fx/assets/js/frontend/motion-fx/interactions/mouse-move.js")); 950var _actions = _interopRequireDefault(__webpack_require__(/*! ./actions */ "../modules/motion-fx/assets/js/frontend/motion-fx/actions.js")); 951class _default extends elementorModules.ViewModule { 952 getDefaultSettings() { 953 return { 954 type: 'element', 955 $element: null, 956 $dimensionsElement: null, 957 addBackgroundLayerTo: null, 958 interactions: {}, 959 refreshDimensions: false, 960 range: 'viewport', 961 classes: { 962 element: 'motion-fx-element', 963 parent: 'motion-fx-parent', 964 backgroundType: 'motion-fx-element-type-background', 965 container: 'motion-fx-container', 966 layer: 'motion-fx-layer', 967 perspective: 'motion-fx-perspective' 968 } 969 }; 970 } 971 bindEvents() { 972 this.defineDimensions = this.defineDimensions.bind(this); 973 elementorFrontend.elements.$window.on('resize elementor-pro/motion-fx/recalc', this.defineDimensions); 974 } 975 unbindEvents() { 976 elementorFrontend.elements.$window.off('resize elementor-pro/motion-fx/recalc', this.defineDimensions); 977 } 978 addBackgroundLayer() { 979 const settings = this.getSettings(); 980 this.elements.$motionFXContainer = jQuery('<div>', { 981 class: settings.classes.container 982 }); 983 this.elements.$motionFXLayer = jQuery('<div>', { 984 class: settings.classes.layer 985 });
986 this.updateBackgroundLayerSize(); 987 this.elements.$motionFXContainer.prepend(this.elements.$motionFXLayer); 988 const $addBackgroundLayerTo = settings.addBackgroundLayerTo ? this.$element.find(settings.addBackgroundLayerTo) : this.$element; 989 $addBackgroundLayerTo.prepend(this.elements.$motionFXContainer); 990 } 991 removeBackgroundLayer() { 992 this.elements.$motionFXContainer.remove(); 993 } 994 updateBackgroundLayerSize() { 995 const settings = this.getSettings(), 996 speed = { 997 x: 0, 998 y: 0 999 }, 1000 mouseInteraction = settings.interactions.mouseMove, 1001 scrollInteraction = settings.interactions.scroll; 1002 if (mouseInteraction && mouseInteraction.translateXY) { 1003 speed.x = mouseInteraction.translateXY.speed * 10; 1004 speed.y = mouseInteraction.translateXY.speed * 10; 1005 } 1006 if (scrollInteraction) { 1007 if (scrollInteraction.translateX) { 1008 speed.x = scrollInteraction.translateX.speed * 10; 1009 } 1010 if (scrollInteraction.translateY) { 1011 speed.y = scrollInteraction.translateY.speed * 10; 1012 } 1013 } 1014 this.elements.$motionFXLayer.css({ 1015 width: 100 + speed.x + '%', 1016 height: 100 + speed.y + '%' 1017 }); 1018 } 1019 defineDimensions() { 1020 const $dimensionsElement = this.getSettings('$dimensionsElement') || this.$element, 1021 elementOffset = $dimensionsElement.offset(); 1022 const dimensions = { 1023 elementHeight: $dimensionsElement.outerHeight(), 1024 elementWidth: $dimensionsElement.outerWidth(), 1025 elementTop: elementOffset.top, 1026 elementLeft: elementOffset.left 1027 }; 1028 dimensions.elementRange = dimensions.elementHeight + innerHeight; 1029 this.setSettings('dimensions', dimensions); 1030 if ('background' === this.getSettings('type')) { 1031 this.defineBackgroundLayerDimensions(); 1032 } 1033 } 1034 defineBackgroundLayerDimensions() { 1035 const dimensions = this.getSettings('dimensions'); 1036 dimensions.layerHeight = this.elements.$motionFXLayer.height(); 1037 dimensions.layerWidth = this.elements.$motionFXLayer.width(); 1038 dimensions.movableX = dimensions.layerWidth - dimensions.elementWidth; 1039 dimensions.movableY = dimensions.layerHeight - dimensions.elementHeight; 1040 this.setSettings('dimensions', dimensions); 1041 } 1042 initInteractionsTypes() { 1043 this.interactionsTypes = { 1044 scroll: _scroll.default, 1045 mouseMove: _mouseMove.default 1046 }; 1047 } 1048 prepareSpecialActions() { 1049 const settings = this.getSettings(), 1050 hasTiltEffect = !!(settings.interactions.mouseMove && settings.interactions.mouseMove.tilt); 1051 this.elements.$parent.toggleClass(settings.classes.perspective, hasTiltEffect); 1052 } 1053 cleanSpecialActions() { 1054 const settings = this.getSettings(); 1055 this.elements.$parent.removeClass(settings.classes.perspective); 1056 } 1057 runInteractions() { 1058 var _this = this; 1059 const settings = this.getSettings(); 1060 this.actions.setCSSTransformVariables(settings.elementSettings); 1061 this.prepareSpecialActions(); 1062 jQuery.each(settings.interactions, (interactionName, actions) => { 1063 this.interactions[interactionName] = new this.interactionsTypes[interactionName]({ 1064 motionFX: this, 1065 callback: function () { 1066 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 1067 args[_key] = arguments[_key]; 1068 } 1069 jQuery.each(actions, (actionName, actionData) => _this.actions.runAction(actionName, actionData, ...args)); 1070 } 1071 }); 1072 this.interactions[interactionName].run(); 1073 }); 1074 } 1075 destroyInteractions() { 1076 this.cleanSpecialActions(); 1077 jQuery.each(this.interactions, (interactionName, interaction) => interaction.destroy()); 1078 this.interactions = {}; 1079 } 1080 refresh() { 1081 this.actions.setSettings(this.getSettings()); 1082 if ('background' === this.getSettings('type')) {
1083 this.updateBackgroundLayerSize(); 1084 this.defineBackgroundLayerDimensions(); 1085 } 1086 this.actions.refresh(); 1087 this.destroyInteractions(); 1088 this.runInteractions(); 1089 } 1090 destroy() { 1091 this.destroyInteractions(); 1092 this.actions.refresh(); 1093 const settings = this.getSettings(); 1094 this.$element.removeClass(settings.classes.element); 1095 this.elements.$parent.removeClass(settings.classes.parent); 1096 if ('background' === settings.type) { 1097 this.$element.removeClass(settings.classes.backgroundType); 1098 this.removeBackgroundLayer(); 1099 } 1100 } 1101 onInit() { 1102 super.onInit(); 1103 const settings = this.getSettings(); 1104 this.$element = settings.$element; 1105 this.elements.$parent = this.$element.parent(); 1106 this.$element.addClass(settings.classes.element); 1107 this.elements.$parent = this.$element.parent(); 1108 this.elements.$parent.addClass(settings.classes.parent); 1109 if ('background' === settings.type) { 1110 this.$element.addClass(settings.classes.backgroundType); 1111 this.addBackgroundLayer(); 1112 } 1113 this.defineDimensions(); 1114 settings.$targetElement = 'element' === settings.type ? this.$element : this.elements.$motionFXLayer; 1115 this.interactions = {}; 1116 this.actions = new _actions.default(settings); 1117 this.initInteractionsTypes(); 1118 this.runInteractions(); 1119 } 1120} 1121exports["default"] = _default; 1122 1123/***/ }), 1124
1125/***/ "../modules/payments/assets/js/frontend/frontend.js": 1126/*!**********************************************************!*\ 1127 !*** ../modules/payments/assets/js/frontend/frontend.js ***! 1128 \**********************************************************/ 1129/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 1130 1131"use strict"; 1132 1133 1134Object.defineProperty(exports, "__esModule", ({ 1135 value: true 1136})); 1137exports["default"] = void 0; 1138class _default extends elementorModules.Module { 1139 constructor() { 1140 super(); 1141 elementorFrontend.elementsHandler.attachHandler('paypal-button', () => __webpack_require__.e(/*! import() | paypal-button */ "paypal-button").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/paypal-button */ "../modules/payments/assets/js/frontend/handlers/paypal-button.js"))); 1142 elementorFrontend.elementsHandler.attachHandler('stripe-button', () => Promise.all(/*! import() | stripe-button */[__webpack_require__.e("vendors-node_modules_dompurify_dist_purify_cjs_js"), __webpack_require__.e("stripe-button")]).then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/stripe-button */ "../modules/payments/assets/js/frontend/handlers/stripe-button.js"))); 1143 } 1144} 1145exports["default"] = _default; 1146 1147/***/ }), 1148
1149/***/ "../modules/progress-tracker/assets/js/frontend/frontend.js": 1150/*!******************************************************************!*\ 1151 !*** ../modules/progress-tracker/assets/js/frontend/frontend.js ***! 1152 \******************************************************************/ 1153/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 1154 1155"use strict"; 1156 1157 1158Object.defineProperty(exports, "__esModule", ({ 1159 value: true 1160})); 1161exports["default"] = void 0; 1162class _default extends elementorModules.Module { 1163 constructor() { 1164 super(); 1165 elementorFrontend.elementsHandler.attachHandler('progress-tracker', () => __webpack_require__.e(/*! import() | progress-tracker */ "progress-tracker").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/progress-tracker */ "../modules/progress-tracker/assets/js/frontend/handlers/progress-tracker.js"))); 1166 } 1167} 1168exports["default"] = _default; 1169 1170/***/ }), 1171
1172/***/ "../modules/sticky/assets/js/frontend/frontend.js": 1173/*!********************************************************!*\ 1174 !*** ../modules/sticky/assets/js/frontend/frontend.js ***! 1175 \********************************************************/ 1176/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 1177 1178"use strict"; 1179 1180 1181var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); 1182Object.defineProperty(exports, "__esModule", ({ 1183 value: true 1184})); 1185exports["default"] = void 0; 1186var _sticky = _interopRequireDefault(__webpack_require__(/*! ./handlers/sticky */ "../modules/sticky/assets/js/frontend/handlers/sticky.js")); 1187class _default extends elementorModules.Module { 1188 constructor() { 1189 super(); 1190 elementorFrontend.elementsHandler.attachHandler('section', _sticky.default, null); 1191 elementorFrontend.elementsHandler.attachHandler('container', _sticky.default, null); 1192 elementorFrontend.elementsHandler.attachHandler('widget', _sticky.default, null); 1193 } 1194} 1195exports["default"] = _default; 1196 1197/***/ }), 1198
1199/***/ "../modules/sticky/assets/js/frontend/handlers/sticky.js": 1200/*!***************************************************************!*\ 1201 !*** ../modules/sticky/assets/js/frontend/handlers/sticky.js ***! 1202 \***************************************************************/ 1203/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 1204 1205"use strict"; 1206 1207 1208Object.defineProperty(exports, "__esModule", ({ 1209 value: true 1210})); 1211exports["default"] = void 0; 1212var _utils = __webpack_require__(/*! elementor-frontend/utils/utils */ "../../elementor/assets/dev/js/frontend/utils/utils.js"); 1213var _default = exports["default"] = elementorModules.frontend.handlers.Base.extend({ 1214 currentConfig: {}, 1215 debouncedReactivate: null, 1216 bindEvents() { 1217 elementorFrontend.addListenerOnce(this.getUniqueHandlerID() + 'sticky', 'resize', this.reactivateOnResize); 1218 }, 1219 unbindEvents() { 1220 elementorFrontend.removeListeners(this.getUniqueHandlerID() + 'sticky', 'resize', this.reactivateOnResize); 1221 }, 1222 isStickyInstanceActive() { 1223 return undefined !== this.$element.data('sticky'); 1224 }, 1225 /** 1226 * Get the current active setting value for a responsive control. 1227 * 1228 * @param {string} setting 1229 * @return {any} - Setting value. 1230 */ 1231 getResponsiveSetting(setting) { 1232 const elementSettings = this.getElementSettings(); 1233 return elementorFrontend.getCurrentDeviceSetting(elementSettings, setting); 1234 }, 1235 /** 1236 * Return an array of settings names for responsive control (e.g. `settings`, `setting_tablet`, `setting_mobile` ). 1237 * 1238 * @param {string} setting 1239 * @return {string[]} - List of settings. 1240 */ 1241 getResponsiveSettingList(setting) { 1242 const breakpoints = Object.keys(elementorFrontend.config.responsive.activeBreakpoints); 1243 return ['', ...breakpoints].map(suffix => { 1244 return suffix ? `${setting}_${suffix}` : setting; 1245 }); 1246 }, 1247 getConfig() { 1248 const elementSettings = this.getElementSettings(), 1249 stickyOptions = { 1250 to: elementSettings.sticky, 1251 offset: this.getResponsiveSetting('sticky_offset'), 1252 effectsOffset: this.getResponsiveSetting('sticky_effects_offset'), 1253 classes: { 1254 sticky: 'elementor-sticky', 1255 stickyActive: 'elementor-sticky--active elementor-section--handles-inside', 1256 stickyEffects: 'elementor-sticky--effects', 1257 spacer: 'elementor-sticky__spacer' 1258 }, 1259 isRTL: elementorFrontend.config.is_rtl, 1260 isScrollSnapActive: (0, _utils.isScrollSnapActive)(), 1261 // In edit mode, since the preview is an iframe, the scrollbar is on the left. The scrollbar width is 1262 // compensated for in this case. 1263 handleScrollbarWidth: elementorFrontend.isEditMode() 1264 }, 1265 $wpAdminBar = elementorFrontend.elements.$wpAdminBar, 1266 isParentContainer = this.isContainerElement(this.$element[0]) && !this.isContainerElement(this.$element[0].parentElement); 1267 if ($wpAdminBar.length && 'top' === elementSettings.sticky && 'fixed' === $wpAdminBar.css('position')) { 1268 stickyOptions.offset += $wpAdminBar.height(); 1269 } 1270 1271 // The `stickyOptions.parent` value should only be applied to inner elements, and not to top level containers. 1272 if (elementSettings.sticky_parent && !isParentContainer) { 1273 stickyOptions.parent = '.e-con, .e-con-inner, .elementor-widget-wrap'; 1274 } 1275 return stickyOptions; 1276 }, 1277 activate() { 1278 this.currentConfig = this.getConfig(); 1279 this.$element.sticky(this.currentConfig); 1280 }, 1281 deactivate() { 1282 if (!this.isStickyInstanceActive()) { 1283 return; 1284 } 1285 this.$element.sticky('destroy'); 1286 }, 1287 run(refresh) { 1288 if (!this.getElementSettings('sticky')) { 1289 this.deactivate(); 1290 return; 1291 } 1292 var currentDeviceMode = elementorFrontend.getCurrentDeviceMode(), 1293 activeDevices = this.getElementSettings('sticky_on'); 1294 if (-1 !== activeDevices.indexOf(currentDeviceMode)) { 1295 if (true === refresh) { 1296 this.reactivate(); 1297 } else if (!this.isStickyInstanceActive()) { 1298 this.activate(); 1299 } 1300 } else { 1301 this.deactivate(); 1302 } 1303 }, 1304 /** 1305 * Reactivate the sticky instance on resize only if the new sticky config is different from the current active one, 1306 * in order to avoid re-initializing the sticky when not needed, and avoid layout shifts. 1307 * The config can be different between devices, so this need to be checked on each screen resize to make sure that 1308 * the current screen size uses the appropriate Sticky config. 1309 * 1310 * @return {void} 1311 */ 1312 reactivateOnResize() { 1313 clearTimeout(this.debouncedReactivate); 1314 this.debouncedReactivate = setTimeout(() => { 1315 const config = this.getConfig(), 1316 isDifferentConfig = JSON.stringify(config) !== JSON.stringify(this.currentConfig); 1317 if (isDifferentConfig) { 1318 this.run(true); 1319 } 1320 }, 300); 1321 }, 1322 reactivate() { 1323 this.deactivate(); 1324 this.activate(); 1325 },
1326 onElementChange(settingKey) { 1327 if (-1 !== ['sticky', 'sticky_on'].indexOf(settingKey)) { 1328 this.run(true); 1329 } 1330 1331 // Settings that trigger a re-activation when changed. 1332 const settings = [...this.getResponsiveSettingList('sticky_offset'), ...this.getResponsiveSettingList('sticky_effects_offset'), 'sticky_parent']; 1333 if (-1 !== settings.indexOf(settingKey)) { 1334 this.reactivate(); 1335 } 1336 }, 1337 /** 1338 * Listen to device mode changes and re-initialize the sticky. 1339 * 1340 * @return {void} 1341 */ 1342 onDeviceModeChange() { 1343 // Wait for the call stack to be empty. 1344 // The `run` function requests the current device mode from the CSS so it's not ready immediately. 1345 // (need to wait for the `deviceMode` event to change the CSS). 1346 // See `elementorFrontend.getCurrentDeviceMode()` for reference. 1347 setTimeout(() => this.run(true)); 1348 }, 1349 onInit() { 1350 elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments); 1351 if (elementorFrontend.isEditMode()) { 1352 elementor.listenTo(elementor.channels.deviceMode, 'change', () => this.onDeviceModeChange()); 1353 } 1354 this.run(); 1355 }, 1356 onDestroy() { 1357 elementorModules.frontend.handlers.Base.prototype.onDestroy.apply(this, arguments); 1358 this.deactivate(); 1359 }, 1360 /** 1361 * 1362 * @param {HTMLElement|null|undefined} element 1363 * @return {boolean} Is the passed element a container. 1364 */ 1365 isContainerElement(element) { 1366 const containerClasses = ['e-con', 'e-con-inner']; 1367 return containerClasses.some(containerClass => { 1368 return element?.classList.contains(containerClass); 1369 }); 1370 } 1371}); 1372 1373/***/ }), 1374
1375/***/ "../modules/video-playlist/assets/js/frontend/frontend.js": 1376/*!****************************************************************!*\ 1377 !*** ../modules/video-playlist/assets/js/frontend/frontend.js ***! 1378 \****************************************************************/ 1379/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 1380 1381"use strict"; 1382 1383 1384Object.defineProperty(exports, "__esModule", ({ 1385 value: true 1386})); 1387exports["default"] = void 0; 1388class _default extends elementorModules.Module { 1389 constructor() { 1390 super(); 1391 elementorFrontend.hooks.addAction('frontend/element_ready/video-playlist.default', $element => { 1392 __webpack_require__.e(/*! import() | video-playlist */ "video-playlist").then(__webpack_require__.bind(__webpack_require__, /*! ./handler */ "../modules/video-playlist/assets/js/frontend/handler.js")).then(_ref => { 1393 let { 1394 default: dynamicHandler 1395 } = _ref; 1396 elementorFrontend.elementsHandler.addHandler(dynamicHandler, { 1397 $element, 1398 toggleSelf: false 1399 }); 1400 }); 1401 }); 1402 } 1403} 1404exports["default"] = _default; 1405 1406/***/ }), 1407
1408/***/ "../../elementor/assets/dev/js/frontend/utils/utils.js": 1409/*!*************************************************************!*\ 1410 !*** ../../elementor/assets/dev/js/frontend/utils/utils.js ***! 1411 \*************************************************************/ 1412/***/ ((__unused_webpack_module, exports) => { 1413 1414"use strict"; 1415 1416 1417Object.defineProperty(exports, "__esModule", ({ 1418 value: true 1419})); 1420exports.isScrollSnapActive = exports.escapeHTML = void 0; 1421// Escape HTML special chars to prevent XSS. 1422const escapeHTML = str => { 1423 const specialChars = { 1424 '&': '&', 1425 '<': '<', 1426 '>': '>', 1427 "'": ''', 1428 '"': '"' 1429 }; 1430 return str.replace(/[&<>'"]/g, tag => specialChars[tag] || tag); 1431}; 1432 1433// Check if Scroll-Snap is active. 1434exports.escapeHTML = escapeHTML; 1435const isScrollSnapActive = () => { 1436 const scrollSnapStatus = elementorFrontend.isEditMode() ? elementor.settings.page.model.attributes?.scroll_snap : elementorFrontend.config.settings.page?.scroll_snap; 1437 return 'yes' === scrollSnapStatus ? true : false; 1438}; 1439exports.isScrollSnapActive = isScrollSnapActive; 1440 1441/***/ }), 1442
vendor: 549 bytes, lines 1443-1456
1443/***/ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js": 1444/*!***********************************************************************!*\ 1445 !*** ../node_modules/@babel/runtime/helpers/interopRequireDefault.js ***! 1446 \***********************************************************************/ 1447/***/ ((module) => { 1448 1449function _interopRequireDefault(e) { 1450 return e && e.__esModule ? e : { 1451 "default": e 1452 }; 1453} 1454module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports; 1455 1456/***/ })
1456 1457 1458}, 1459/******/ __webpack_require__ => { // webpackRuntimeModules 1460/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) 1461/******/ var __webpack_exports__ = (__webpack_exec__("../assets/dev/js/frontend/frontend.js")); 1462/******/ } 1463]); 1464//# sourceMappingURL=frontend.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.