/*! elementor - v3.28.0 - 22-04-2025 */
"use strict";
(self["webpackChunkelementorFrontend"] = self["webpackChunkelementorFrontend"] || []).push([["frontend"],{
/***/ "../assets/dev/js/frontend/documents-manager.js":
/*!******************************************************!*\
!*** ../assets/dev/js/frontend/documents-manager.js ***!
\******************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _document = _interopRequireDefault(__webpack_require__(/*! ./document */ "../assets/dev/js/frontend/document.js"));
class _default extends elementorModules.ViewModule {
constructor() {
super(...arguments);
this.documents = {};
this.initDocumentClasses();
this.attachDocumentsClasses();
}
getDefaultSettings() {
return {
selectors: {
document: '.elementor'
}
};
}
getDefaultElements() {
const selectors = this.getSettings('selectors');
return {
$documents: jQuery(selectors.document)
};
}
initDocumentClasses() {
this.documentClasses = {
base: _document.default
};
elementorFrontend.hooks.doAction('elementor/frontend/documents-manager/init-classes', this);
}
addDocumentClass(documentType, documentClass) {
this.documentClasses[documentType] = documentClass;
}
attachDocumentsClasses() {
this.elements.$documents.each((index, document) => this.attachDocumentClass(jQuery(document)));
}
attachDocumentClass($document) {
const documentData = $document.data(),
documentID = documentData.elementorId,
documentType = documentData.elementorType,
DocumentClass = this.documentClasses[documentType] || this.documentClasses.base;
this.documents[documentID] = new DocumentClass({
$element: $document,
id: documentID
});
}
}
exports["default"] = _default;
/***/ }),
/***/ "../assets/dev/js/frontend/elements-handlers-manager.js":
/*!**************************************************************!*\
!*** ../assets/dev/js/frontend/elements-handlers-manager.js ***!
\**************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
__webpack_require__(/*! core-js/modules/es.array.push.js */ "../node_modules/core-js/modules/es.array.push.js");
__webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ "../node_modules/core-js/modules/esnext.iterator.constructor.js");
__webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ "../node_modules/core-js/modules/esnext.iterator.for-each.js");
var _global = _interopRequireDefault(__webpack_require__(/*! ./handlers/global */ "../assets/dev/js/frontend/handlers/global.js"));
var _background = _interopRequireDefault(__webpack_require__(/*! ./handlers/background */ "../assets/dev/js/frontend/handlers/background.js"));
var _container = _interopRequireDefault(__webpack_require__(/*! ./handlers/container/container */ "../assets/dev/js/frontend/handlers/container/container.js"));
var _column = _interopRequireDefault(__webpack_require__(/*! ./handlers/column */ "../assets/dev/js/frontend/handlers/column.js"));
var _handlesPosition = _interopRequireDefault(__webpack_require__(/*! ./handlers/section/handles-position */ "../assets/dev/js/frontend/handlers/section/handles-position.js"));
var _stretchedSection = _interopRequireDefault(__webpack_require__(/*! ./handlers/section/stretched-section */ "../assets/dev/js/frontend/handlers/section/stretched-section.js"));
var _shapes = _interopRequireDefault(__webpack_require__(/*! ./handlers/section/shapes */ "../assets/dev/js/frontend/handlers/section/shapes.js"));
// Section handlers.
/* global elementorFrontendConfig */
module.exports = function ($) {
var _this = this;
const handlersInstances = {};
this.elementsHandlers = {
'accordion.default': () => __webpack_require__.e(/*! import() | accordion */ "accordion").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/accordion */ "../assets/dev/js/frontend/handlers/accordion.js")),
'alert.default': () => __webpack_require__.e(/*! import() | alert */ "alert").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/alert */ "../assets/dev/js/frontend/handlers/alert.js")),
'counter.default': () => __webpack_require__.e(/*! import() | counter */ "counter").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/counter */ "../assets/dev/js/frontend/handlers/counter.js")),
'progress.default': () => __webpack_require__.e(/*! import() | progress */ "progress").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/progress */ "../assets/dev/js/frontend/handlers/progress.js")),
'tabs.default': () => __webpack_require__.e(/*! import() | tabs */ "tabs").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/tabs */ "../assets/dev/js/frontend/handlers/tabs.js")),
'toggle.default': () => __webpack_require__.e(/*! import() | toggle */ "toggle").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/toggle */ "../assets/dev/js/frontend/handlers/toggle.js")),
'video.default': () => __webpack_require__.e(/*! import() | video */ "video").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/video */ "../assets/dev/js/frontend/handlers/video.js")),
'image-carousel.default': () => __webpack_require__.e(/*! import() | image-carousel */ "image-carousel").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/image-carousel */ "../assets/dev/js/frontend/handlers/image-carousel.js")),
'text-editor.default': () => __webpack_require__.e(/*! import() | text-editor */ "text-editor").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/text-editor */ "../assets/dev/js/frontend/handlers/text-editor.js")),
'wp-widget-media_audio.default': () => __webpack_require__.e(/*! import() | wp-audio */ "wp-audio").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/wp-audio */ "../assets/dev/js/frontend/handlers/wp-audio.js"))
};
if (elementorFrontendConfig.experimentalFeatures['nested-elements']) {
this.elementsHandlers['nested-tabs.default'] = () => __webpack_require__.e(/*! import() | nested-tabs */ "nested-tabs").then(__webpack_require__.bind(__webpack_require__, /*! elementor/modules/nested-tabs/assets/js/frontend/handlers/nested-tabs */ "../modules/nested-tabs/assets/js/frontend/handlers/nested-tabs.js"));
}
if (elementorFrontendConfig.experimentalFeatures['nested-elements']) {
this.elementsHandlers['nested-accordion.default'] = () => __webpack_require__.e(/*! import() | nested-accordion */ "nested-accordion").then(__webpack_require__.bind(__webpack_require__, /*! elementor/modules/nested-accordion/assets/js/frontend/handlers/nested-accordion */ "../modules/nested-accordion/assets/js/frontend/handlers/nested-accordion.js"));
}
if (elementorFrontendConfig.experimentalFeatures.container) {
this.elementsHandlers['contact-buttons.default'] = () => __webpack_require__.e(/*! import() | contact-buttons */ "contact-buttons").then(__webpack_require__.bind(__webpack_require__, /*! elementor/modules/floating-buttons/assets/js/floating-buttons/frontend/handlers/contact-buttons */ "../modules/floating-buttons/assets/js/floating-buttons/frontend/handlers/contact-buttons.js"));
this.elementsHandlers['floating-bars-var-1.default'] = () => __webpack_require__.e(/*! import() | floating-bars */ "floating-bars").then(__webpack_require__.bind(__webpack_require__, /*! elementor/modules/floating-buttons/assets/js/floating-bars/frontend/handlers/floating-bars */ "../modules/floating-buttons/assets/js/floating-bars/frontend/handlers/floating-bars.js"));
}
const addGlobalHandlers = () => elementorFrontend.hooks.addAction('frontend/element_ready/global', _global.default);
const addElementsHandlers = () => {
this.elementsHandlers.section = [_stretchedSection.default,
// Must run before background handlers to init the slideshow only after the stretch.
..._background.default, _handlesPosition.default, _shapes.default];
this.elementsHandlers.container = [..._background.default];
// Add editor-only handlers.
if (elementorFrontend.isEditMode()) {
this.elementsHandlers.container.push(..._container.default);
}
this.elementsHandlers.column = _column.default;
$.each(this.elementsHandlers, (elementName, Handlers) => {
const elementData = elementName.split('.');
elementName = elementData[0];
const skin = elementData[1] || null;
this.attachHandler(elementName, Handlers, skin);
});
};
const isClassHandler = Handler => Handler.prototype?.getUniqueHandlerID;
const addHandlerWithHook = function (elementBaseName, Handler) {
let skin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'default';
skin = skin ? '.' + skin : '';
const elementName = elementBaseName + skin;
elementorFrontend.hooks.addAction(`frontend/element_ready/${elementName}`, $element => {
if (isClassHandler(Handler)) {
_this.addHandler(Handler, {
$element,
elementName
}, true);
} else {
const handlerValue = Handler();
if (!handlerValue) {
return;
}
if (handlerValue instanceof Promise) {
handlerValue.then(_ref => {
let {
default: dynamicHandler
} = _ref;
_this.addHandler(dynamicHandler, {
$element,
elementName
}, true);
});
} else {
_this.addHandler(handlerValue, {
$element,
elementName
}, true);
}
}
});
};
this.addHandler = function (HandlerClass, options) {
const elementID = options.$element.data('model-cid');
let handlerID;
// If element is in edit mode
if (elementID) {
handlerID = HandlerClass.prototype.getConstructorID();
if (!handlersInstances[elementID]) {
handlersInstances[elementID] = {};
}
const oldHandler = handlersInstances[elementID][handlerID];
if (oldHandler) {
oldHandler.onDestroy();
}
}
const newHandler = new HandlerClass(options);
elementorFrontend.hooks.doAction(`frontend/element_handler_ready/${options.elementName}`, options.$element, $);
if (elementID) {
handlersInstances[elementID][handlerID] = newHandler;
}
};
this.attachHandler = (elementName, Handlers, skin) => {
if (!Array.isArray(Handlers)) {
Handlers = [Handlers];
}
Handlers.forEach(Handler => addHandlerWithHook(elementName, Handler, skin));
};
this.getHandler = function (handlerName) {
const elementHandler = this.elementsHandlers[handlerName];
if (isClassHandler(elementHandler)) {
return elementHandler;
}
return new Promise(res => {
elementHandler().then(_ref2 => {
let {
default: dynamicHandler
} = _ref2;
res(dynamicHandler);
});
});
};
/**
* @param {string} handlerName
* @deprecated since 3.1.0, use `elementorFrontend.elementsHandler.getHandler` instead.
*/
this.getHandlers = function (handlerName) {
elementorDevTools.deprecation.deprecated('getHandlers', '3.1.0', 'elementorFrontend.elementsHandler.getHandler');
if (handlerName) {
return this.getHandler(handlerName);
}
return this.elementsHandlers;
};
this.runReadyTrigger = function (scope) {
const isDelayChildHandlers = !!scope.closest('[data-delay-child-handlers="true"]') && 0 !== scope.closest('[data-delay-child-handlers="true"]').length;
if (elementorFrontend.config.is_static || isDelayChildHandlers) {
return;
}
// Initializing the `$scope` as frontend jQuery instance
const $scope = jQuery(scope),
elementType = $scope.attr('data-element_type');
if (!elementType) {
return;
}
elementorFrontend.hooks.doAction('frontend/element_ready/global', $scope, $);
elementorFrontend.hooks.doAction(`frontend/element_ready/${elementType}`, $scope, $);
if ('widget' === elementType) {
const widgetType = $scope.attr('data-widget_type');
elementorFrontend.hooks.doAction(`frontend/element_ready/${widgetType}`, $scope, $);
}
};
this.init = () => {
addGlobalHandlers();
addElementsHandlers();
};
};
/***/ }),
/***/ "../assets/dev/js/frontend/frontend.js":
/*!*********************************************!*\
!*** ../assets/dev/js/frontend/frontend.js ***!
\*********************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
__webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ "../node_modules/core-js/modules/esnext.iterator.constructor.js");
__webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ "../node_modules/core-js/modules/esnext.iterator.find.js");
__webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ "../node_modules/core-js/modules/esnext.iterator.for-each.js");
__webpack_require__(/*! ../public-path */ "../assets/dev/js/public-path.js");
var _documentsManager = _interopRequireDefault(__webpack_require__(/*! ./documents-manager */ "../assets/dev/js/frontend/documents-manager.js"));
var _storage = _interopRequireDefault(__webpack_require__(/*! elementor-common/utils/storage */ "../core/common/assets/js/utils/storage.js"));
var _environment = _interopRequireDefault(__webpack_require__(/*! elementor-common/utils/environment */ "../core/common/assets/js/utils/environment.js"));
var _youtubeLoader = _interopRequireDefault(__webpack_require__(/*! ./utils/video-api/youtube-loader */ "../assets/dev/js/frontend/utils/video-api/youtube-loader.js"));
var _vimeoLoader = _interopRequireDefault(__webpack_require__(/*! ./utils/video-api/vimeo-loader */ "../assets/dev/js/frontend/utils/video-api/vimeo-loader.js"));
var _baseLoader = _interopRequireDefault(__webpack_require__(/*! ./utils/video-api/base-loader */ "../assets/dev/js/frontend/utils/video-api/base-loader.js"));
var _urlActions = _interopRequireDefault(__webpack_require__(/*! ./utils/url-actions */ "../assets/dev/js/frontend/utils/url-actions.js"));
var _swiper = _interopRequireDefault(__webpack_require__(/*! ./utils/swiper */ "../assets/dev/js/frontend/utils/swiper.js"));
var _lightboxManager = _interopRequireDefault(__webpack_require__(/*! ./utils/lightbox/lightbox-manager */ "../assets/dev/js/frontend/utils/lightbox/lightbox-manager.js"));
var _assetsLoader = _interopRequireDefault(__webpack_require__(/*! ./utils/assets-loader */ "../assets/dev/js/frontend/utils/assets-loader.js"));
var _breakpoints = _interopRequireDefault(__webpack_require__(/*! elementor-utils/breakpoints */ "../assets/dev/js/utils/breakpoints.js"));
var _events = _interopRequireDefault(__webpack_require__(/*! elementor-utils/events */ "../assets/dev/js/utils/events.js"));
var _frontend = _interopRequireDefault(__webpack_require__(/*! elementor/modules/shapes/assets/js/frontend/frontend */ "../modules/shapes/assets/js/frontend/frontend.js"));
var _controls = _interopRequireDefault(__webpack_require__(/*! ./utils/controls */ "../assets/dev/js/frontend/utils/controls.js"));
var _anchorScrollMargin = _interopRequireDefault(__webpack_require__(/*! ./utils/anchor-scroll-margin */ "../assets/dev/js/frontend/utils/anchor-scroll-margin.js"));
var _utils = __webpack_require__(/*! elementor-frontend/utils/utils */ "../assets/dev/js/frontend/utils/utils.js");
/* global elementorFrontendConfig */
const EventManager = __webpack_require__(/*! elementor-utils/hooks */ "../assets/dev/js/utils/hooks.js"),
ElementsHandler = __webpack_require__(/*! elementor-frontend/elements-handlers-manager */ "../assets/dev/js/frontend/elements-handlers-manager.js");
class Frontend extends elementorModules.ViewModule {
constructor() {
super(...arguments);
this.config = elementorFrontendConfig;
this.config.legacyMode = {
/**
* @deprecated since 3.1.0
*/
get elementWrappers() {
if (elementorFrontend.isEditMode()) {
window.top.elementorDevTools.deprecation.deprecated('elementorFrontend.config.legacyMode.elementWrappers', '3.1.0');
}
return false;
}
};
this.populateActiveBreakpointsConfig();
}
/**
* @deprecated since 2.5.0, use `elementorModules.frontend.handlers.Base` instead.
*/
get Module() {
if (this.isEditMode()) {
parent.elementorDevTools.deprecation.deprecated('elementorFrontend.Module', '2.5.0', 'elementorModules.frontend.handlers.Base');
}
return elementorModules.frontend.handlers.Base;
}
getDefaultSettings() {
return {
selectors: {
elementor: '.elementor',
adminBar: '#wpadminbar'
}
};
}
getDefaultElements() {
const defaultElements = {
window,
$window: jQuery(window),
$document: jQuery(document),
$head: jQuery(document.head),
$body: jQuery(document.body),
$deviceMode: jQuery('', {
id: 'elementor-device-mode',
class: 'elementor-screen-only'
})
};
defaultElements.$body.append(defaultElements.$deviceMode);
return defaultElements;
}
bindEvents() {
this.elements.$window.on('resize', () => this.setDeviceModeData());
}
/**
* @param {string} elementName
* @deprecated since 2.4.0, use `this.elements` instead.
*/
getElements(elementName) {
return this.getItems(this.elements, elementName);
}
/**
* @param {string} settingName
* @deprecated since 2.4.0, this method was never in use.
*/
getPageSettings(settingName) {
const settingsObject = this.isEditMode() ? elementor.settings.page.model.attributes : this.config.settings.page;
return this.getItems(settingsObject, settingName);
}
/**
* @param {string} settingName
* @deprecated since 3.0.0, use `getKitSettings()` instead and remove the `elementor_` prefix.
*/
getGeneralSettings(settingName) {
if (this.isEditMode()) {
parent.elementorDevTools.deprecation.deprecated('getGeneralSettings()', '3.0.0', 'getKitSettings() and remove the `elementor_` prefix');
}
return this.getKitSettings(`elementor_${settingName}`);
}
getKitSettings(settingName) {
// TODO: use Data API.
return this.getItems(this.config.kit, settingName);
}
getCurrentDeviceMode() {
return getComputedStyle(this.elements.$deviceMode[0], ':after').content.replace(/"/g, '');
}
getDeviceSetting(deviceMode, settings, settingKey) {
// Add specific handling for widescreen since it is larger than desktop.
if ('widescreen' === deviceMode) {
return this.getWidescreenSetting(settings, settingKey);
}
const devices = elementorFrontend.breakpoints.getActiveBreakpointsList({
largeToSmall: true,
withDesktop: true
});
let deviceIndex = devices.indexOf(deviceMode);
while (deviceIndex > 0) {
const currentDevice = devices[deviceIndex],
fullSettingKey = settingKey + '_' + currentDevice,
deviceValue = settings[fullSettingKey];
// Accept 0 as value.
if (deviceValue || 0 === deviceValue) {
return deviceValue;
}
deviceIndex--;
}
return settings[settingKey];
}
getWidescreenSetting(settings, settingKey) {
const deviceMode = 'widescreen',
widescreenSettingKey = settingKey + '_' + deviceMode;
let settingToReturn;
// If the device mode is 'widescreen', and the setting exists - return it.
if (settings[widescreenSettingKey]) {
settingToReturn = settings[widescreenSettingKey];
} else {
// Otherwise, return the desktop setting
settingToReturn = settings[settingKey];
}
return settingToReturn;
}
getCurrentDeviceSetting(settings, settingKey) {
return this.getDeviceSetting(elementorFrontend.getCurrentDeviceMode(), settings, settingKey);
}
isEditMode() {
return this.config.environmentMode.edit;
}
isWPPreviewMode() {
return this.config.environmentMode.wpPreview;
}
initDialogsManager() {
let dialogsManager;
this.getDialogsManager = () => {
if (!dialogsManager) {
dialogsManager = new DialogsManager.Instance();
}
return dialogsManager;
};
}
initOnReadyComponents() {
this.utils = {
youtube: new _youtubeLoader.default(),
vimeo: new _vimeoLoader.default(),
baseVideoLoader: new _baseLoader.default(),
get lightbox() {
return _lightboxManager.default.getLightbox();
},
urlActions: new _urlActions.default(),
swiper: _swiper.default,
environment: _environment.default,
assetsLoader: new _assetsLoader.default(),
escapeHTML: _utils.escapeHTML,
events: _events.default,
controls: new _controls.default(),
anchor_scroll_margin: new _anchorScrollMargin.default()
};
// TODO: BC since 2.4.0
this.modules = {
StretchElement: elementorModules.frontend.tools.StretchElement,
Masonry: elementorModules.utils.Masonry
};
this.elementsHandler.init();
if (this.isEditMode()) {
elementor.once('document:loaded', () => this.onDocumentLoaded());
} else {
this.onDocumentLoaded();
}
}
initOnReadyElements() {
this.elements.$wpAdminBar = this.elements.$document.find(this.getSettings('selectors.adminBar'));
}
addUserAgentClasses() {
for (const [key, value] of Object.entries(_environment.default)) {
if (value) {
this.elements.$body.addClass('e--ua-' + key);
}
}
}
setDeviceModeData() {
this.elements.$body.attr('data-elementor-device-mode', this.getCurrentDeviceMode());
}
addListenerOnce(listenerID, event, callback, to) {
if (!to) {
to = this.elements.$window;
}
if (!this.isEditMode()) {
to.on(event, callback);
return;
}
this.removeListeners(listenerID, event, to);
if (to instanceof jQuery) {
const eventNS = event + '.' + listenerID;
to.on(eventNS, callback);
} else {
to.on(event, callback, listenerID);
}
}
removeListeners(listenerID, event, callback, from) {
if (!from) {
from = this.elements.$window;
}
if (from instanceof jQuery) {
const eventNS = event + '.' + listenerID;
from.off(eventNS, callback);
} else {
from.off(event, callback, listenerID);
}
}
// Based on underscore function
debounce(func, wait) {
let timeout;
return function () {
const context = this,
args = arguments;
const later = () => {
timeout = null;
func.apply(context, args);
};
const callNow = !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) {
func.apply(context, args);
}
};
}
muteMigrationTraces() {
jQuery.migrateMute = true;
jQuery.migrateTrace = false;
}
/**
* Initialize the modules' widgets handlers.
*/
initModules() {
const handlers = {
shapes: _frontend.default
};
// TODO: BC - Deprecated since 3.5.0
elementorFrontend.trigger('elementor/modules/init:before');
// TODO: Use this instead.
elementorFrontend.trigger('elementor/modules/init/before');
Object.entries(handlers).forEach(_ref => {
let [moduleName, ModuleClass] = _ref;
this.modulesHandlers[moduleName] = new ModuleClass();
});
}
populateActiveBreakpointsConfig() {
this.config.responsive.activeBreakpoints = {};
Object.entries(this.config.responsive.breakpoints).forEach(_ref2 => {
let [breakpointKey, breakpointData] = _ref2;
if (breakpointData.is_enabled) {
this.config.responsive.activeBreakpoints[breakpointKey] = breakpointData;
}
});
}
init() {
this.hooks = new EventManager();
this.breakpoints = new _breakpoints.default(this.config.responsive);
this.storage = new _storage.default();
this.elementsHandler = new ElementsHandler(jQuery);
this.modulesHandlers = {};
this.addUserAgentClasses();
this.setDeviceModeData();
this.initDialogsManager();
if (this.isEditMode()) {
this.muteMigrationTraces();
}
// Keep this line before `initOnReadyComponents` call
_events.default.dispatch(this.elements.$window, 'elementor/frontend/init');
this.initModules();
this.initOnReadyElements();
this.initOnReadyComponents();
}
onDocumentLoaded() {
this.documentsManager = new _documentsManager.default();
this.trigger('components:init');
new _lightboxManager.default();
}
}
exports["default"] = Frontend;
window.elementorFrontend = new Frontend();
if (!elementorFrontend.isEditMode()) {
jQuery(() => elementorFrontend.init());
}
/***/ }),
/***/ "../assets/dev/js/frontend/handlers/background-slideshow.js":
/*!******************************************************************!*\
!*** ../assets/dev/js/frontend/handlers/background-slideshow.js ***!
\******************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
__webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ "../node_modules/core-js/modules/esnext.iterator.constructor.js");
__webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ "../node_modules/core-js/modules/esnext.iterator.for-each.js");
class BackgroundSlideshow extends elementorModules.frontend.handlers.SwiperBase {
getDefaultSettings() {
return {
classes: {
swiperContainer: 'elementor-background-slideshow swiper',
swiperWrapper: 'swiper-wrapper',
swiperSlide: 'elementor-background-slideshow__slide swiper-slide',
swiperPreloader: 'swiper-lazy-preloader',
slideBackground: 'elementor-background-slideshow__slide__image',
kenBurns: 'elementor-ken-burns',
kenBurnsActive: 'elementor-ken-burns--active',
kenBurnsIn: 'elementor-ken-burns--in',
kenBurnsOut: 'elementor-ken-burns--out'
}
};
}
getSwiperOptions() {
const elementSettings = this.getElementSettings(),
swiperOptions = {
grabCursor: false,
slidesPerView: 1,
slidesPerGroup: 1,
loop: 'yes' === elementSettings.background_slideshow_loop,
speed: elementSettings.background_slideshow_transition_duration,
autoplay: {
delay: elementSettings.background_slideshow_slide_duration,
stopOnLastSlide: !elementSettings.background_slideshow_loop
},
handleElementorBreakpoints: true,
on: {
slideChange: () => {
if (elementSettings.background_slideshow_ken_burns) {
this.handleKenBurns();
}
}
}
};
if ('yes' === elementSettings.background_slideshow_loop) {
swiperOptions.loopedSlides = this.getSlidesCount();
}
switch (elementSettings.background_slideshow_slide_transition) {
case 'fade':
swiperOptions.effect = 'fade';
swiperOptions.fadeEffect = {
crossFade: true
};
break;
case 'slide_down':
swiperOptions.autoplay.reverseDirection = true;
swiperOptions.direction = 'vertical';
break;
case 'slide_up':
swiperOptions.direction = 'vertical';
break;
}
if ('yes' === elementSettings.background_slideshow_lazyload) {
swiperOptions.lazy = {
loadPrevNext: true,
loadPrevNextAmount: 1
};
}
return swiperOptions;
}
buildSwiperElements() {
const classes = this.getSettings('classes'),
elementSettings = this.getElementSettings(),
direction = 'slide_left' === elementSettings.background_slideshow_slide_transition ? 'ltr' : 'rtl',
$container = jQuery('', {
class: classes.swiperContainer,
dir: direction
}),
$wrapper = jQuery('
', {
class: classes.swiperWrapper
}),
kenBurnsActive = elementSettings.background_slideshow_ken_burns,
lazyload = 'yes' === elementSettings.background_slideshow_lazyload;
let slideInnerClass = classes.slideBackground;
if (kenBurnsActive) {
slideInnerClass += ' ' + classes.kenBurns;
const kenBurnsDirection = 'in' === elementSettings.background_slideshow_ken_burns_zoom_direction ? 'kenBurnsIn' : 'kenBurnsOut';
slideInnerClass += ' ' + classes[kenBurnsDirection];
}
if (lazyload) {
slideInnerClass += ' swiper-lazy';
}
this.elements.$slides = jQuery();
elementSettings.background_slideshow_gallery.forEach(slide => {
const $slide = jQuery('
', {
class: classes.swiperSlide
});
let $slidebg;
if (lazyload) {
const $slideloader = jQuery('
', {
class: classes.swiperPreloader
});
$slidebg = jQuery('
', {
class: slideInnerClass,
'data-background': slide.url
});
$slidebg.append($slideloader);
} else {
$slidebg = jQuery('
', {
class: slideInnerClass,
style: 'background-image: url("' + slide.url + '");'
});
}
$slide.append($slidebg);
$wrapper.append($slide);
this.elements.$slides = this.elements.$slides.add($slide);
});
$container.append($wrapper);
this.$element.prepend($container);
this.elements.$backgroundSlideShowContainer = $container;
}
async initSlider() {
if (1 >= this.getSlidesCount()) {
return;
}
const elementSettings = this.getElementSettings();
const Swiper = elementorFrontend.utils.swiper;
this.swiper = await new Swiper(this.elements.$backgroundSlideShowContainer, this.getSwiperOptions());
// Expose the swiper instance in the frontend
this.elements.$backgroundSlideShowContainer.data('swiper', this.swiper);
if (elementSettings.background_slideshow_ken_burns) {
this.handleKenBurns();
}
}
activate() {
this.buildSwiperElements();
this.initSlider();
}
deactivate() {
if (this.swiper) {
this.swiper.destroy();
this.elements.$backgroundSlideShowContainer.remove();
}
}
run() {
if ('slideshow' === this.getElementSettings('background_background')) {
this.activate();
} else {
this.deactivate();
}
}
onInit() {
super.onInit();
if (this.getElementSettings('background_slideshow_gallery')) {
this.run();
}
}
onDestroy() {
super.onDestroy();
this.deactivate();
}
onElementChange(propertyName) {
if ('background_background' === propertyName) {
this.run();
}
}
}
exports["default"] = BackgroundSlideshow;
/***/ }),
/***/ "../assets/dev/js/frontend/handlers/background-video.js":
/*!**************************************************************!*\
!*** ../assets/dev/js/frontend/handlers/background-video.js ***!
\**************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
__webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ "../node_modules/core-js/modules/esnext.iterator.constructor.js");
__webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ "../node_modules/core-js/modules/esnext.iterator.find.js");
class BackgroundVideo extends elementorModules.frontend.handlers.Base {
getDefaultSettings() {
return {
selectors: {
backgroundVideoContainer: '.elementor-background-video-container',
backgroundVideoEmbed: '.elementor-background-video-embed',
backgroundVideoHosted: '.elementor-background-video-hosted'
}
};
}
getDefaultElements() {
const selectors = this.getSettings('selectors'),
elements = {
$backgroundVideoContainer: this.$element.find(selectors.backgroundVideoContainer)
};
elements.$backgroundVideoEmbed = elements.$backgroundVideoContainer.children(selectors.backgroundVideoEmbed);
elements.$backgroundVideoHosted = elements.$backgroundVideoContainer.children(selectors.backgroundVideoHosted);
return elements;
}
calcVideosSize($video) {
let aspectRatioSetting = '16:9';
if ('vimeo' === this.videoType) {
aspectRatioSetting = $video[0].width + ':' + $video[0].height;
}
const containerWidth = this.elements.$backgroundVideoContainer.outerWidth(),
containerHeight = this.elements.$backgroundVideoContainer.outerHeight(),
aspectRatioArray = aspectRatioSetting.split(':'),
aspectRatio = aspectRatioArray[0] / aspectRatioArray[1],
ratioWidth = containerWidth / aspectRatio,
ratioHeight = containerHeight * aspectRatio,
isWidthFixed = containerWidth / containerHeight > aspectRatio;
return {
width: isWidthFixed ? containerWidth : ratioHeight,
height: isWidthFixed ? ratioWidth : containerHeight
};
}
changeVideoSize() {
if (!('hosted' === this.videoType) && !this.player) {
return;
}
let $video;
if ('youtube' === this.videoType) {
$video = jQuery(this.player.getIframe());
} else if ('vimeo' === this.videoType) {
$video = jQuery(this.player.element);
} else if ('hosted' === this.videoType) {
$video = this.elements.$backgroundVideoHosted;
}
if (!$video) {
return;
}
const size = this.calcVideosSize($video);
$video.width(size.width).height(size.height);
}
startVideoLoop(firstTime) {
// If the section has been removed
if (!this.player.getIframe().contentWindow) {
return;
}
const elementSettings = this.getElementSettings(),
startPoint = elementSettings.background_video_start || 0,
endPoint = elementSettings.background_video_end;
if (elementSettings.background_play_once && !firstTime) {
this.player.stopVideo();
return;
}
this.player.seekTo(startPoint);
if (endPoint) {
const durationToEnd = endPoint - startPoint + 1;
setTimeout(() => {
this.startVideoLoop(false);
}, durationToEnd * 1000);
}
}
prepareVimeoVideo(Vimeo, videoLink) {
const elementSettings = this.getElementSettings(),
videoSize = this.elements.$backgroundVideoContainer.outerWidth(),
vimeoOptions = {
url: videoLink,
width: videoSize.width,
autoplay: true,
loop: !elementSettings.background_play_once,
transparent: true,
background: true,
muted: true
};
if (elementSettings.background_privacy_mode) {
vimeoOptions.dnt = true;
}
this.player = new Vimeo.Player(this.elements.$backgroundVideoContainer, vimeoOptions);
// Handle user-defined start/end times
this.handleVimeoStartEndTimes(elementSettings);
this.player.ready().then(() => {
jQuery(this.player.element).addClass('elementor-background-video-embed');
this.changeVideoSize();
});
}
handleVimeoStartEndTimes(elementSettings) {
// If a start time is defined, set the start time
if (elementSettings.background_video_start) {
this.player.on('play', data => {
if (0 === data.seconds) {
this.player.setCurrentTime(elementSettings.background_video_start);
}
});
}
this.player.on('timeupdate', data => {
// If an end time is defined, handle ending the video
if (elementSettings.background_video_end && elementSettings.background_video_end < data.seconds) {
if (elementSettings.background_play_once) {
// Stop at user-defined end time if not loop
this.player.pause();
} else {
// Go to start time if loop
this.player.setCurrentTime(elementSettings.background_video_start);
}
}
// If start time is defined but an end time is not, go to user-defined start time at video end.
// Vimeo JS API has an 'ended' event, but it never fires when infinite loop is defined, so we
// get the video duration (returns a promise) then use duration-0.5s as end time
this.player.getDuration().then(duration => {
if (elementSettings.background_video_start && !elementSettings.background_video_end && data.seconds > duration - 0.5) {
this.player.setCurrentTime(elementSettings.background_video_start);
}
});
});
}
prepareYTVideo(YT, videoID) {
const $backgroundVideoContainer = this.elements.$backgroundVideoContainer,
elementSettings = this.getElementSettings();
let startStateCode = YT.PlayerState.PLAYING;
// Since version 67, Chrome doesn't fire the `PLAYING` state at start time
if (window.chrome) {
startStateCode = YT.PlayerState.UNSTARTED;
}
const playerOptions = {
videoId: videoID,
events: {
onReady: () => {
this.player.mute();
this.changeVideoSize();
this.startVideoLoop(true);
this.player.playVideo();
},
onStateChange: event => {
switch (event.data) {
case startStateCode:
$backgroundVideoContainer.removeClass('elementor-invisible elementor-loading');
break;
case YT.PlayerState.ENDED:
if ('function' === typeof this.player.seekTo) {
this.player.seekTo(elementSettings.background_video_start || 0);
}
if (elementSettings.background_play_once) {
this.player.destroy();
}
}
}
},
playerVars: {
controls: 0,
rel: 0,
playsinline: 1,
cc_load_policy: 0
}
};
// To handle CORS issues, when the default host is changed, the origin parameter has to be set.
if (elementSettings.background_privacy_mode) {
playerOptions.host = 'https://www.youtube-nocookie.com';
playerOptions.origin = window.location.hostname;
}
$backgroundVideoContainer.addClass('elementor-loading elementor-invisible');
this.player = new YT.Player(this.elements.$backgroundVideoEmbed[0], playerOptions);
}
activate() {
let videoLink = this.getElementSettings('background_video_link'),
videoID;
const playOnce = this.getElementSettings('background_play_once');
if (-1 !== videoLink.indexOf('vimeo.com')) {
this.videoType = 'vimeo';
this.apiProvider = elementorFrontend.utils.vimeo;
} else if (videoLink.match(/^(?:https?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com)/)) {
this.videoType = 'youtube';
this.apiProvider = elementorFrontend.utils.youtube;
}
if (this.apiProvider) {
videoID = this.apiProvider.getVideoIDFromURL(videoLink);
this.apiProvider.onApiReady(apiObject => {
if ('youtube' === this.videoType) {
this.prepareYTVideo(apiObject, videoID);
}
if ('vimeo' === this.videoType) {
this.prepareVimeoVideo(apiObject, videoLink);
}
});
} else {
this.videoType = 'hosted';
const startTime = this.getElementSettings('background_video_start'),
endTime = this.getElementSettings('background_video_end');
if (startTime || endTime) {
videoLink += '#t=' + (startTime || 0) + (endTime ? ',' + endTime : '');
}
this.elements.$backgroundVideoHosted.attr('src', videoLink).one('canplay', this.changeVideoSize.bind(this));
if (playOnce) {
this.elements.$backgroundVideoHosted.on('ended', () => {
this.elements.$backgroundVideoHosted.hide();
});
}
}
elementorFrontend.elements.$window.on('resize elementor/bg-video/recalc', this.changeVideoSize);
}
deactivate() {
if ('youtube' === this.videoType && this.player.getIframe() || 'vimeo' === this.videoType) {
this.player.destroy();
} else {
this.elements.$backgroundVideoHosted.removeAttr('src').off('ended');
}
elementorFrontend.elements.$window.off('resize', this.changeVideoSize);
}
run() {
const elementSettings = this.getElementSettings();
if (!elementSettings.background_play_on_mobile && 'mobile' === elementorFrontend.getCurrentDeviceMode()) {
return;
}
if ('video' === elementSettings.background_background && elementSettings.background_video_link) {
this.activate();
} else {
this.deactivate();
}
}
onInit() {
super.onInit(...arguments);
this.changeVideoSize = this.changeVideoSize.bind(this);
this.run();
}
onElementChange(propertyName) {
if ('background_background' === propertyName) {
this.run();
}
}
}
exports["default"] = BackgroundVideo;
/***/ }),
/***/ "../assets/dev/js/frontend/handlers/background.js":
/*!********************************************************!*\
!*** ../assets/dev/js/frontend/handlers/background.js ***!
\********************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _backgroundSlideshow = _interopRequireDefault(__webpack_require__(/*! ./background-slideshow */ "../assets/dev/js/frontend/handlers/background-slideshow.js"));
var _backgroundVideo = _interopRequireDefault(__webpack_require__(/*! ./background-video */ "../assets/dev/js/frontend/handlers/background-video.js"));
var _default = exports["default"] = [_backgroundSlideshow.default, _backgroundVideo.default];
/***/ }),
/***/ "../assets/dev/js/frontend/handlers/column.js":
/*!****************************************************!*\
!*** ../assets/dev/js/frontend/handlers/column.js ***!
\****************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _backgroundSlideshow = _interopRequireDefault(__webpack_require__(/*! ./background-slideshow */ "../assets/dev/js/frontend/handlers/background-slideshow.js"));
var _default = exports["default"] = [_backgroundSlideshow.default];
/***/ }),
/***/ "../assets/dev/js/frontend/handlers/container/container.js":
/*!*****************************************************************!*\
!*** ../assets/dev/js/frontend/handlers/container/container.js ***!
\*****************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _default = exports["default"] = [() => __webpack_require__.e(/*! import() | container */ "container").then(__webpack_require__.bind(__webpack_require__, /*! ./handles-position */ "../assets/dev/js/frontend/handlers/container/handles-position.js")), () => __webpack_require__.e(/*! import() | container */ "container").then(__webpack_require__.bind(__webpack_require__, /*! ./shapes */ "../assets/dev/js/frontend/handlers/container/shapes.js")), () => __webpack_require__.e(/*! import() | container */ "container").then(__webpack_require__.bind(__webpack_require__, /*! ./grid-container */ "../assets/dev/js/frontend/handlers/container/grid-container.js"))];
/***/ }),
/***/ "../assets/dev/js/frontend/handlers/global.js":
/*!****************************************************!*\
!*** ../assets/dev/js/frontend/handlers/global.js ***!
\****************************************************/
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
class GlobalHandler extends elementorModules.frontend.handlers.Base {
getWidgetType() {
return 'global';
}
animate() {
const $element = this.$element,
animation = this.getAnimation();
if ('none' === animation) {
$element.removeClass('elementor-invisible');
return;
}
const elementSettings = this.getElementSettings(),
animationDelay = elementSettings._animation_delay || elementSettings.animation_delay || 0;
$element.removeClass(animation);
if (this.currentAnimation) {
$element.removeClass(this.currentAnimation);
}
this.currentAnimation = animation;
setTimeout(() => {
$element.removeClass('elementor-invisible').addClass('animated ' + animation);
}, animationDelay);
}
getAnimation() {
return this.getCurrentDeviceSetting('animation') || this.getCurrentDeviceSetting('_animation');
}
onInit() {
super.onInit(...arguments);
if (this.getAnimation()) {
const observer = elementorModules.utils.Scroll.scrollObserver({
callback: event => {
if (event.isInViewport) {
this.animate();
observer.unobserve(this.$element[0]);
}
}
});
observer.observe(this.$element[0]);
}
}
onElementChange(propertyName) {
if (/^_?animation/.test(propertyName)) {
this.animate();
}
}
}
var _default = $scope => {
elementorFrontend.elementsHandler.addHandler(GlobalHandler, {
$element: $scope
});
};
exports["default"] = _default;
/***/ }),
/***/ "../assets/dev/js/frontend/handlers/section/handles-position.js":
/*!**********************************************************************!*\
!*** ../assets/dev/js/frontend/handlers/section/handles-position.js ***!
\**********************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
__webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ "../node_modules/core-js/modules/esnext.iterator.constructor.js");
__webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ "../node_modules/core-js/modules/esnext.iterator.find.js");
class HandlesPosition extends elementorModules.frontend.handlers.Base {
isActive() {
return elementorFrontend.isEditMode();
}
isFirstSection() {
return this.$element[0] === document.querySelector('.elementor-edit-mode .elementor-top-section');
}
isOverflowHidden() {
return 'hidden' === this.$element.css('overflow');
}
getOffset() {
if ('body' === elementor.config.document.container) {
return this.$element.offset().top;
}
const $container = jQuery(elementor.config.document.container);
return this.$element.offset().top - $container.offset().top;
}
setHandlesPosition() {
const document = elementor.documents.getCurrent();
if (!document || !document.container.isEditable()) {
return;
}
const insideHandleClass = 'elementor-section--handles-inside';
if (elementor.settings.page.model.attributes.scroll_snap) {
this.$element.addClass(insideHandleClass);
return;
}
const isOverflowHidden = this.isOverflowHidden();
if (!isOverflowHidden && !this.isFirstSection()) {
return;
}
const offset = isOverflowHidden ? 0 : this.getOffset();
if (offset < 25) {
this.$element.addClass(insideHandleClass);
const $handlesElement = this.$element.find('> .elementor-element-overlay > .elementor-editor-section-settings');
if (offset < -5) {
$handlesElement.css('top', -offset);
} else {
$handlesElement.css('top', '');
}
} else {
this.$element.removeClass(insideHandleClass);
}
}
onInit() {
if (!this.isActive()) {
return;
}
this.setHandlesPosition();
this.$element.on('mouseenter', this.setHandlesPosition.bind(this));
}
}
exports["default"] = HandlesPosition;
/***/ }),
/***/ "../assets/dev/js/frontend/handlers/section/shapes.js":
/*!************************************************************!*\
!*** ../assets/dev/js/frontend/handlers/section/shapes.js ***!
\************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
__webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ "../node_modules/core-js/modules/esnext.iterator.constructor.js");
__webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ "../node_modules/core-js/modules/esnext.iterator.find.js");
class Shapes extends elementorModules.frontend.handlers.Base {
getDefaultSettings() {
return {
selectors: {
container: '> .elementor-shape-%s'
},
svgURL: elementorFrontend.config.urls.assets + 'shapes/'
};
}
getDefaultElements() {
const elements = {},
selectors = this.getSettings('selectors');
elements.$topContainer = this.$element.find(selectors.container.replace('%s', 'top'));
elements.$bottomContainer = this.$element.find(selectors.container.replace('%s', 'bottom'));
return elements;
}
isActive() {
return elementorFrontend.isEditMode();
}
getSvgURL(shapeType, fileName) {
let svgURL = this.getSettings('svgURL') + fileName + '.svg';
if (elementor.config.additional_shapes && shapeType in elementor.config.additional_shapes) {
svgURL = elementor.config.additional_shapes[shapeType];
if (-1 < fileName.indexOf('-negative')) {
svgURL = svgURL.replace('.svg', '-negative.svg');
}
}
return svgURL;
}
buildSVG(side) {
const baseSettingKey = 'shape_divider_' + side,
shapeType = this.getElementSettings(baseSettingKey),
$svgContainer = this.elements['$' + side + 'Container'];
$svgContainer.attr('data-shape', shapeType);
if (!shapeType) {
$svgContainer.empty(); // Shape-divider set to 'none'
return;
}
let fileName = shapeType;
if (this.getElementSettings(baseSettingKey + '_negative')) {
fileName += '-negative';
}
const svgURL = this.getSvgURL(shapeType, fileName);
jQuery.get(svgURL, data => {
$svgContainer.empty().append(data.childNodes[0]);
});
this.setNegative(side);
}
setNegative(side) {
this.elements['$' + side + 'Container'].attr('data-negative', !!this.getElementSettings('shape_divider_' + side + '_negative'));
}
onInit() {
if (!this.isActive(this.getSettings())) {
return;
}
super.onInit(...arguments);
['top', 'bottom'].forEach(side => {
if (this.getElementSettings('shape_divider_' + side)) {
this.buildSVG(side);
}
});
}
onElementChange(propertyName) {
const shapeChange = propertyName.match(/^shape_divider_(top|bottom)$/);
if (shapeChange) {
this.buildSVG(shapeChange[1]);
return;
}
const negativeChange = propertyName.match(/^shape_divider_(top|bottom)_negative$/);
if (negativeChange) {
this.buildSVG(negativeChange[1]);
this.setNegative(negativeChange[1]);
}
}
}
exports["default"] = Shapes;
/***/ }),
/***/ "../assets/dev/js/frontend/handlers/section/stretched-section.js":
/*!***********************************************************************!*\
!*** ../assets/dev/js/frontend/handlers/section/stretched-section.js ***!
\***********************************************************************/
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
class StretchedSection extends elementorModules.frontend.handlers.StretchedElement {
getStretchedClass() {
return 'elementor-section-stretched';
}
getStretchSettingName() {
return 'stretch_section';
}
getStretchActiveValue() {
return 'section-stretched';
}
}
exports["default"] = StretchedSection;
/***/ }),
/***/ "../assets/dev/js/frontend/utils/anchor-scroll-margin.js":
/*!***************************************************************!*\
!*** ../assets/dev/js/frontend/utils/anchor-scroll-margin.js ***!
\***************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
__webpack_require__(/*! core-js/modules/es.array.push.js */ "../node_modules/core-js/modules/es.array.push.js");
__webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ "../node_modules/core-js/modules/esnext.iterator.constructor.js");
__webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ "../node_modules/core-js/modules/esnext.iterator.filter.js");
__webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ "../node_modules/core-js/modules/esnext.iterator.for-each.js");
class _default extends elementorModules.ViewModule {
getDefaultSettings() {
return {
selectors: {
links: '.elementor-element a[href*="#"]',
stickyElements: '.elementor-element.elementor-sticky'
}
};
}
onInit() {
this.observeStickyElements(() => {
this.initializeStickyAndAnchorTracking();
});
}
observeStickyElements(callback) {
const observer = new MutationObserver(mutationsList => {
for (const mutation of mutationsList) {
if ('childList' === mutation.type || 'attributes' === mutation.type && mutation.target.classList.contains('elementor-sticky')) {
callback();
}
}
});
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ['class', 'style']
});
}
initializeStickyAndAnchorTracking() {
const anchorLinks = this.getAllAnchorLinks();
const stickyElements = this.getAllStickyElements();
const trackedElements = [];
if (!stickyElements.length > 0 && !anchorLinks.length > 0) {
return;
}
this.trackStickyElements(stickyElements, trackedElements);
this.trackAnchorLinks(anchorLinks, trackedElements);
this.organizeStickyAndAnchors(trackedElements);
}
trackAnchorLinks(anchorLinks, trackedElements) {
anchorLinks.forEach(element => {
const target = this.getAnchorTarget(element);
const scrollPosition = this.getScrollPosition(target);
trackedElements.push({
element: target,
type: 'anchor',
scrollPosition
});
});
}
trackStickyElements(stickyElements, trackedElements) {
stickyElements.forEach(element => {
const settings = this.getElementSettings(element);
if (!settings || !settings.sticky_anchor_link_offset) {
return;
}
const {
sticky_anchor_link_offset: scrollMarginTop
} = settings;
if (0 === scrollMarginTop) {
return;
}
const scrollPosition = this.getScrollPosition(element);
trackedElements.push({
scrollMarginTop,
type: 'sticky',
scrollPosition
});
});
}
organizeStickyAndAnchors(elements) {
const stickyList = this.filterAndSortElementsByType(elements, 'sticky');
const anchorList = this.filterAndSortElementsByType(elements, 'anchor');
stickyList.forEach((sticky, index) => {
this.defineCurrentStickyRange(sticky, index, stickyList, anchorList);
});
}
defineCurrentStickyRange(sticky, index, stickyList, anchorList) {
const nextStickyScrollPosition = index + 1 < stickyList.length ? stickyList[index + 1].scrollPosition : Infinity;
sticky.anchor = anchorList.filter(anchor => {
const withinRange = anchor.scrollPosition > sticky.scrollPosition && anchor.scrollPosition < nextStickyScrollPosition;
if (withinRange) {
anchor.element.style.scrollMarginTop = `${sticky.scrollMarginTop}px`;
}
return withinRange;
});
}
getScrollPosition(element) {
let offsetTop = 0;
while (element) {
offsetTop += element.offsetTop;
element = element.offsetParent;
}
return offsetTop;
}
getAllStickyElements() {
const allStickyElements = document.querySelectorAll(this.getSettings('selectors.stickyElements'));
return Array.from(allStickyElements).filter((anchor, index, self) => index === self.findIndex(t => t.getAttribute('data-id') === anchor.getAttribute('data-id')));
}
getAllAnchorLinks() {
const allAnchors = document.querySelectorAll(this.getSettings('selectors.links'));
return Array.from(allAnchors).filter((anchor, index, self) => index === self.findIndex(t => t.getAttribute('href') === anchor.getAttribute('href')));
}
filterAndSortElementsByType(elements, type) {
return elements.filter(item => type === item.type).sort((a, b) => a.scrollPosition - b.scrollPosition);
}
isValidSelector(hash) {
const validSelectorPattern = /^#[A-Za-z_][\w-]*$/;
return validSelectorPattern.test(hash);
}
getAnchorTarget(element) {
const hash = element?.hash;
if (!this.isValidSelector(hash)) {
return null;
}
return document.querySelector(hash);
}
getElementSettings(element) {
return JSON.parse(element.getAttribute('data-settings'));
}
}
exports["default"] = _default;
/***/ }),
/***/ "../assets/dev/js/frontend/utils/assets-loader.js":
/*!********************************************************!*\
!*** ../assets/dev/js/frontend/utils/assets-loader.js ***!
\********************************************************/
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
class AssetsLoader {
getScriptElement(src) {
const scriptElement = document.createElement('script');
scriptElement.src = src;
return scriptElement;
}
getStyleElement(src) {
const styleElement = document.createElement('link');
styleElement.rel = 'stylesheet';
styleElement.href = src;
return styleElement;
}
load(type, key) {
const assetData = AssetsLoader.assets[type][key];
if (!assetData.loader) {
assetData.loader = this.isAssetLoaded(assetData, type) ? Promise.resolve(true) : this.loadAsset(assetData, type);
}
return assetData.loader;
}
isAssetLoaded(assetData, assetType) {
const filePath = 'script' === assetType ? `script[src="${assetData.src}"]` : `link[href="${assetData.src}"]`;
return !!document.querySelectorAll(filePath)?.length;
}
loadAsset(assetData, assetType) {
return new Promise(resolve => {
const element = 'style' === assetType ? this.getStyleElement(assetData.src) : this.getScriptElement(assetData.src);
element.onload = () => resolve(true);
this.appendAsset(assetData, element);
});
}
appendAsset(assetData, element) {
const beforeElement = document.querySelector(assetData.before);
if (!!beforeElement) {
beforeElement.insertAdjacentElement('beforebegin', element);
return;
}
const parent = 'head' === assetData.parent ? assetData.parent : 'body';
document[parent].appendChild(element);
}
}
exports["default"] = AssetsLoader;
const assetsUrl = elementorFrontendConfig.urls.assets;
const fileSuffix = elementorFrontendConfig.environmentMode.isScriptDebug ? '' : '.min';
const pluginVersion = elementorFrontendConfig.version;
AssetsLoader.assets = {
script: {
dialog: {
src: `${assetsUrl}lib/dialog/dialog${fileSuffix}.js?ver=4.9.3`
},
'share-link': {
src: `${assetsUrl}lib/share-link/share-link${fileSuffix}.js?ver=${pluginVersion}`
},
// TODO: Remove 'swiper' in v3.29.0 [ED-16272].
swiper: {
src: `${assetsUrl}lib/swiper/v8/swiper${fileSuffix}.js?ver=8.4.5`
}
},
style: {
swiper: {
src: `${assetsUrl}lib/swiper/v8/css/swiper${fileSuffix}.css?ver=8.4.5`,
parent: 'head'
},
'e-lightbox': {
src: elementorFrontendConfig?.responsive?.hasCustomBreakpoints ? `${elementorFrontendConfig.urls.uploadUrl}/elementor/css/custom-lightbox.min.css?ver=${pluginVersion}` : `${assetsUrl}css/conditionals/lightbox${fileSuffix}.css?ver=${pluginVersion}`
},
dialog: {
src: `${assetsUrl}css/conditionals/dialog${fileSuffix}.css?ver=${pluginVersion}`,
parent: 'head',
before: '#elementor-frontend-css'
}
}
};
/***/ }),
/***/ "../assets/dev/js/frontend/utils/controls.js":
/*!***************************************************!*\
!*** ../assets/dev/js/frontend/utils/controls.js ***!
\***************************************************/
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
class Controls {
/**
* Get Control Value
*
* Retrieves a control value.
* This function has been copied from `elementor/assets/dev/js/editor/utils/conditions.js`.
*
* @since 3.11.0
*
* @param {{}} controlSettings A settings object (e.g. element settings - keys and values)
* @param {string} controlKey The control key name
* @param {string} controlSubKey A specific property of the control object.
* @return {*} Control Value
*/
getControlValue(controlSettings, controlKey, controlSubKey) {
let value;
if ('object' === typeof controlSettings[controlKey] && controlSubKey) {
value = controlSettings[controlKey][controlSubKey];
} else {
value = controlSettings[controlKey];
}
return value;
}
/**
* Get the value of a responsive control.
*
* Retrieves the value of a responsive control for the current device or for this first parent device which has a control value.
*
* @since 3.11.0
*
* @param {{}} controlSettings A settings object (e.g. element settings - keys and values)
* @param {string} controlKey The control key name
* @param {string} controlSubKey A specific property of the control object.
* @param {string} device If we want to get a value for a specific device mode.
* @return {*} Control Value
*/
getResponsiveControlValue(controlSettings, controlKey) {
let controlSubKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
let device = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
const currentDeviceMode = device || elementorFrontend.getCurrentDeviceMode(),
controlValueDesktop = this.getControlValue(controlSettings, controlKey, controlSubKey);
// Set the control value for the current device mode.
// First check the widescreen device mode.
if ('widescreen' === currentDeviceMode) {
const controlValueWidescreen = this.getControlValue(controlSettings, `${controlKey}_widescreen`, controlSubKey);
return !!controlValueWidescreen || 0 === controlValueWidescreen ? controlValueWidescreen : controlValueDesktop;
}
// Loop through all responsive and desktop device modes.
const activeBreakpoints = elementorFrontend.breakpoints.getActiveBreakpointsList({
withDesktop: true
});
let parentDeviceMode = currentDeviceMode,
deviceIndex = activeBreakpoints.indexOf(currentDeviceMode),
controlValue = '';
while (deviceIndex <= activeBreakpoints.length) {
if ('desktop' === parentDeviceMode) {
controlValue = controlValueDesktop;
break;
}
const responsiveControlKey = `${controlKey}_${parentDeviceMode}`,
responsiveControlValue = this.getControlValue(controlSettings, responsiveControlKey, controlSubKey);
if (!!responsiveControlValue || 0 === responsiveControlValue) {
controlValue = responsiveControlValue;
break;
}
// If no control value has been set for the current device mode, then check the parent device mode.
deviceIndex++;
parentDeviceMode = activeBreakpoints[deviceIndex];
}
return controlValue;
}
}
exports["default"] = Controls;
/***/ }),
/***/ "../assets/dev/js/frontend/utils/lightbox/lightbox-manager.js":
/*!********************************************************************!*\
!*** ../assets/dev/js/frontend/utils/lightbox/lightbox-manager.js ***!
\********************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
__webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ "../node_modules/core-js/modules/esnext.iterator.constructor.js");
__webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ "../node_modules/core-js/modules/esnext.iterator.find.js");
class LightboxManager extends elementorModules.ViewModule {
static getLightbox() {
const lightboxPromise = new Promise(resolveLightbox => {
__webpack_require__.e(/*! import() | lightbox */ "lightbox").then(__webpack_require__.t.bind(__webpack_require__, /*! elementor-frontend/utils/lightbox/lightbox */ "../assets/dev/js/frontend/utils/lightbox/lightbox.js", 23)).then(_ref => {
let {
default: LightboxModule
} = _ref;
return resolveLightbox(new LightboxModule());
});
}),
dialogScriptPromise = elementorFrontend.utils.assetsLoader.load('script', 'dialog'),
dialogStylePromise = elementorFrontend.utils.assetsLoader.load('style', 'dialog'),
shareLinkPromise = elementorFrontend.utils.assetsLoader.load('script', 'share-link'),
swiperStylePromise = elementorFrontend.utils.assetsLoader.load('style', 'swiper'),
lightboxStylePromise = elementorFrontend.utils.assetsLoader.load('style', 'e-lightbox');
return Promise.all([lightboxPromise, dialogScriptPromise, dialogStylePromise, shareLinkPromise, swiperStylePromise, lightboxStylePromise]).then(() => lightboxPromise);
}
getDefaultSettings() {
return {
selectors: {
links: 'a, [data-elementor-lightbox]',
slideshow: '[data-elementor-lightbox-slideshow]'
}
};
}
getDefaultElements() {
return {
$links: jQuery(this.getSettings('selectors.links')),
$slideshow: jQuery(this.getSettings('selectors.slideshow'))
};
}
isLightboxLink(element) {
// Check for lowercase `a` to make sure it works also for links inside SVGs.
if ('a' === element.tagName.toLowerCase() && (element.hasAttribute('download') || !/^[^?]+\.(png|jpe?g|gif|svg|webp)(\?.*)?$/i.test(element.href)) && !element.dataset.elementorLightboxVideo) {
return false;
}
const generalOpenInLightbox = elementorFrontend.getKitSettings('global_image_lightbox'),
currentLinkOpenInLightbox = element.dataset.elementorOpenLightbox;
return 'yes' === currentLinkOpenInLightbox || generalOpenInLightbox && 'no' !== currentLinkOpenInLightbox;
}
isLightboxSlideshow() {
return 0 !== this.elements.$slideshow.length;
}
async onLinkClick(event) {
const element = event.currentTarget,
$target = jQuery(event.target),
editMode = elementorFrontend.isEditMode(),
isColorPickingMode = editMode && elementor.$previewContents.find('body').hasClass('elementor-editor__ui-state__color-picker'),
isClickInsideElementor = !!$target.closest('.elementor-edit-area').length;
if (!this.isLightboxLink(element)) {
if (editMode && isClickInsideElementor) {
event.preventDefault();
}
return;
}
event.preventDefault();
if (editMode && !elementor.getPreferences('lightbox_in_editor')) {
return;
}
// Disable lightbox on color picking mode.
if (isColorPickingMode) {
return;
}
const lightbox = await LightboxManager.getLightbox();
lightbox.createLightbox(element);
}
bindEvents() {
elementorFrontend.elements.$document.on('click', this.getSettings('selectors.links'), event => this.onLinkClick(event));
}
onInit() {
super.onInit(...arguments);
if (elementorFrontend.isEditMode()) {
return;
}
this.maybeActivateLightboxOnLink();
}
maybeActivateLightboxOnLink() {
// Detecting lightbox links on init will reduce the time of waiting to the lightbox to be display on slow connections.
this.elements.$links.each((index, element) => {
if (this.isLightboxLink(element)) {
LightboxManager.getLightbox();
// Breaking the iteration when the library loading has already been triggered.
return false;
}
});
}
}
exports["default"] = LightboxManager;
/***/ }),
/***/ "../assets/dev/js/frontend/utils/swiper.js":
/*!*************************************************!*\
!*** ../assets/dev/js/frontend/utils/swiper.js ***!
\*************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
__webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ "../node_modules/core-js/modules/esnext.iterator.constructor.js");
__webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ "../node_modules/core-js/modules/esnext.iterator.for-each.js");
class SwiperHandler {
constructor(container, config) {
this.config = config;
if (this.config.breakpoints) {
// The config is passed as a param to allow adjustConfig to be called outside of this wrapper
this.config = this.adjustConfig(config);
}
if (container instanceof jQuery) {
container = container[0];
}
// The Swiper will overlap the column width when applying custom margin values on the column.
container.closest('.elementor-widget-wrap')?.classList.add('e-swiper-container');
container.closest('.elementor-widget')?.classList.add('e-widget-swiper');
return new Promise(resolve => {
// TODO: Remove in v3.29.0 [ED-16272].
if ('undefined' === typeof Swiper) {
elementorFrontend.utils.assetsLoader.load('script', 'swiper').then(() => resolve(this.createSwiperInstance(container, this.config)));
return;
}
if ('function' === typeof Swiper && 'undefined' === typeof window.Swiper) {
window.Swiper = Swiper;
}
resolve(this.createSwiperInstance(container, this.config));
});
}
createSwiperInstance(container, config) {
const SwiperSource = window.Swiper;
SwiperSource.prototype.adjustConfig = this.adjustConfig;
return new SwiperSource(container, config);
}
// Backwards compatibility for Elementor Pro <2.9.0 (old Swiper version - <5.0.0)
// In Swiper 5.0.0 and up, breakpoints changed from acting as max-width to acting as min-width
adjustConfig(config) {
// Only reverse the breakpoints if the handle param has been defined
if (!config.handleElementorBreakpoints) {
return config;
}
const elementorBreakpoints = elementorFrontend.config.responsive.activeBreakpoints,
elementorBreakpointValues = elementorFrontend.breakpoints.getBreakpointValues();
Object.keys(config.breakpoints).forEach(configBPKey => {
const configBPKeyInt = parseInt(configBPKey);
let breakpointToUpdate;
// The `configBPKeyInt + 1` is a BC Fix for Elementor Pro Carousels from 2.8.0-2.8.3 used with Elementor >= 2.9.0
if (configBPKeyInt === elementorBreakpoints.mobile.value || configBPKeyInt + 1 === elementorBreakpoints.mobile.value) {
// This handles the mobile breakpoint. Elementor's default sm breakpoint is never actually used,
// so the mobile breakpoint (md) needs to be handled separately and set to the 0 breakpoint (xs)
breakpointToUpdate = 0;
} else if (elementorBreakpoints.widescreen && (configBPKeyInt === elementorBreakpoints.widescreen.value || configBPKeyInt + 1 === elementorBreakpoints.widescreen.value)) {
// Widescreen is a min-width breakpoint. Since in Swiper >5.0 the breakpoint system is min-width based,
// the value we pass to the Swiper instance in this case is the breakpoint from the user, unchanged.
breakpointToUpdate = configBPKeyInt;
} else {
// Find the index of the current config breakpoint in the Elementor Breakpoints array
const currentBPIndexInElementorBPs = elementorBreakpointValues.findIndex(elementorBP => {
// BC Fix for Elementor Pro Carousels from 2.8.0-2.8.3 used with Elementor >= 2.9.0
return configBPKeyInt === elementorBP || configBPKeyInt + 1 === elementorBP;
});
// For all other Swiper config breakpoints, move them one breakpoint down on the breakpoint list,
// according to the array of Elementor's global breakpoints
breakpointToUpdate = elementorBreakpointValues[currentBPIndexInElementorBPs - 1];
}
config.breakpoints[breakpointToUpdate] = config.breakpoints[configBPKey];
// Then reset the settings in the original breakpoint key to the default values
config.breakpoints[configBPKey] = {
slidesPerView: config.slidesPerView,
slidesPerGroup: config.slidesPerGroup ? config.slidesPerGroup : 1
};
});
return config;
}
}
exports["default"] = SwiperHandler;
/***/ }),
/***/ "../assets/dev/js/frontend/utils/url-actions.js":
/*!******************************************************!*\
!*** ../assets/dev/js/frontend/utils/url-actions.js ***!
\******************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
__webpack_require__(/*! core-js/modules/web.dom-exception.stack.js */ "../node_modules/core-js/modules/web.dom-exception.stack.js");
class _default extends elementorModules.ViewModule {
getDefaultSettings() {
return {
selectors: {
links: 'a[href^="%23elementor-action"], a[href^="#elementor-action"]'
}
};
}
bindEvents() {
elementorFrontend.elements.$document.on('click', this.getSettings('selectors.links'), this.runLinkAction.bind(this));
}
initActions() {
this.actions = {
lightbox: async settings => {
const lightbox = await elementorFrontend.utils.lightbox;
if (settings.slideshow) {
// Handle slideshow display
lightbox.openSlideshow(settings.slideshow, settings.url);
} else {
// If the settings has an ID - the lightbox target content is an image - the ID is an attachment ID.
if (settings.id) {
settings.type = 'image';
}
lightbox.showModal(settings);
}
}
};
}
addAction(name, callback) {
this.actions[name] = callback;
}
runAction(url) {
url = decodeURI(url);
url = decodeURIComponent(url);
const actionMatch = url.match(/action=(.+?)&/);
if (!actionMatch) {
return;
}
const action = this.actions[actionMatch[1]];
if (!action) {
return;
}
let settings = {};
const settingsMatch = url.match(/settings=(.+)/);
if (settingsMatch) {
settings = JSON.parse(atob(settingsMatch[1]));
}
settings.previousEvent = event;
for (var _len = arguments.length, restArgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
restArgs[_key - 1] = arguments[_key];
}
action(settings, ...restArgs);
}
runLinkAction(event) {
event.preventDefault();
this.runAction(jQuery(event.currentTarget).attr('href'), event);
}
runHashAction() {
if (!location.hash) {
return;
}
// Only if an element with this action hash exists on the page do we allow running the action.
const elementWithHash = document.querySelector(`[data-e-action-hash="${location.hash}"], a[href*="${location.hash}"]`);
if (elementWithHash) {
this.runAction(elementWithHash.getAttribute('data-e-action-hash'));
}
}
createActionHash(action, settings) {
// We need to encode the hash tag (#) here, in order to support share links for a variety of providers
return encodeURIComponent(`#elementor-action:action=${action}&settings=${btoa(JSON.stringify(settings))}`);
}
onInit() {
super.onInit();
this.initActions();
elementorFrontend.on('components:init', this.runHashAction.bind(this));
}
}
exports["default"] = _default;
/***/ }),
/***/ "../assets/dev/js/frontend/utils/utils.js":
/*!************************************************!*\
!*** ../assets/dev/js/frontend/utils/utils.js ***!
\************************************************/
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.isScrollSnapActive = exports.escapeHTML = void 0;
// Escape HTML special chars to prevent XSS.
const escapeHTML = str => {
const specialChars = {
'&': '&',
'<': '<',
'>': '>',
"'": ''',
'"': '"'
};
return str.replace(/[&<>'"]/g, tag => specialChars[tag] || tag);
};
// Check if Scroll-Snap is active.
exports.escapeHTML = escapeHTML;
const isScrollSnapActive = () => {
const scrollSnapStatus = elementorFrontend.isEditMode() ? elementor.settings.page.model.attributes?.scroll_snap : elementorFrontend.config.settings.page?.scroll_snap;
return 'yes' === scrollSnapStatus ? true : false;
};
exports.isScrollSnapActive = isScrollSnapActive;
/***/ }),
/***/ "../assets/dev/js/frontend/utils/video-api/base-loader.js":
/*!****************************************************************!*\
!*** ../assets/dev/js/frontend/utils/video-api/base-loader.js ***!
\****************************************************************/
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
class BaseLoader extends elementorModules.ViewModule {
getDefaultSettings() {
return {
isInserted: false,
selectors: {
firstScript: 'script:first'
}
};
}
getDefaultElements() {
return {
$firstScript: jQuery(this.getSettings('selectors.firstScript'))
};
}
insertAPI() {
this.elements.$firstScript.before(jQuery('