/*! elementor - v3.27.0 - 27-01-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'] = () => Promise.resolve(/*! import() */).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: { // TODO: Remove 'swiper' in v3.28.0 [ED-16258]. 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'), // TODO: Remove in v3.28.0 [ED-16258]. 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('

Mery's Cafe Marrakech

Bienvenue à Mery’s Café Marrakech

Découvrez Mery’s Café à Marrakech, un lieu chaleureux où savourer un délicieux petit-déjeuner, déjeuner ou une tasse de café dans une ambiance conviviale.

Qui sommes nous?

Une adresse d’exception à Marrakech où l’on peut s’installer à tout moment de la journée ou de la soirée. Nous sommes un café restaurant de diversité bienveillante où chacun peut se retrouver pour un déjeuner, un goûter ou pour un rendez-vous professionnel. Nous vous proposons une carte riche et diversifiée pour ravir votre palais

Découvrez

NOS PLATS

Offres Fresh

-15% sur les salades

Témoignages

Ce que nos clients disent

Un café restaurant où on peut bien manger et travailler en toute tranquillité. Le fait d’avoir un espace fumeur et un espace non fumeur est une excellente idée et permet de respecter la sensibilité de tout le monde. Bravo.
Hakim Lkhej
Profiter d'un café parfumé ou de délicieux plats dans un cadre agréable est le meilleur moyen de se distraire des soucis quotidiens. Mery'S café Marrakech vous invite à plonger dans l'atmosphère de l'hospitalité marocaine et à découvrir des chefs-d'œuvre gastronomiques qui feront partie d'une expérience inoubliable. Pendant la conversation autour d'une tasse de café, une variété de sujets peuvent apparaître, y compris le divertissement. Par exemple, beaucoup sont intéressés par la question de savoir quel casino en ligne en Autriche est le meilleur et légal en 2025. La réponse à cette question peut être trouvée dans une revue spéciale sur une ressource telle que https://zumroemer.at/. Voici des informations qui vous aideront à choisir une plate-forme fiable pour jouer en toute sécurité. Chaque moment passé dans une atmosphère chaleureuse laisse des souvenirs agréables. Mery'S café Marrakech offre une sensation de confort, et les critiques modernes, comme sur les casinos en ligne légaux, aident à prendre des décisions éclairées dans tous les aspects de la vie.

Contactez-nous