/*! elementor-pro - v3.12.0 - 29-03-2023 */ "use strict"; (self["webpackChunkelementor_pro"] = self["webpackChunkelementor_pro"] || []).push([["preloaded-elements-handlers"],{ /***/ "../assets/dev/js/frontend/preloaded-elements-handlers.js": /*!****************************************************************!*\ !*** ../assets/dev/js/frontend/preloaded-elements-handlers.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); var _frontendLegacy = _interopRequireDefault(__webpack_require__(/*! modules/animated-headline/assets/js/frontend/frontend-legacy */ "../modules/animated-headline/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy2 = _interopRequireDefault(__webpack_require__(/*! modules/carousel/assets/js/frontend/frontend-legacy */ "../modules/carousel/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy3 = _interopRequireDefault(__webpack_require__(/*! modules/countdown/assets/js/frontend/frontend-legacy */ "../modules/countdown/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy4 = _interopRequireDefault(__webpack_require__(/*! modules/forms/assets/js/frontend/frontend-legacy */ "../modules/forms/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy5 = _interopRequireDefault(__webpack_require__(/*! modules/gallery/assets/js/frontend/frontend-legacy */ "../modules/gallery/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy6 = _interopRequireDefault(__webpack_require__(/*! modules/hotspot/assets/js/frontend/frontend-legacy */ "../modules/hotspot/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy7 = _interopRequireDefault(__webpack_require__(/*! modules/lottie/assets/js/frontend/frontend-legacy */ "../modules/lottie/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy8 = _interopRequireDefault(__webpack_require__(/*! modules/nav-menu/assets/js/frontend/frontend-legacy */ "../modules/nav-menu/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy9 = _interopRequireDefault(__webpack_require__(/*! modules/popup/assets/js/frontend/frontend-legacy */ "../modules/popup/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy10 = _interopRequireDefault(__webpack_require__(/*! modules/posts/assets/js/frontend/frontend-legacy */ "../modules/posts/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy11 = _interopRequireDefault(__webpack_require__(/*! modules/share-buttons/assets/js/frontend/frontend-legacy */ "../modules/share-buttons/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy12 = _interopRequireDefault(__webpack_require__(/*! modules/slides/assets/js/frontend/frontend-legacy */ "../modules/slides/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy13 = _interopRequireDefault(__webpack_require__(/*! modules/social/assets/js/frontend/frontend-legacy */ "../modules/social/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy14 = _interopRequireDefault(__webpack_require__(/*! modules/table-of-contents/assets/js/frontend/frontend-legacy */ "../modules/table-of-contents/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy15 = _interopRequireDefault(__webpack_require__(/*! modules/theme-builder/assets/js/frontend/frontend-legacy */ "../modules/theme-builder/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy16 = _interopRequireDefault(__webpack_require__(/*! modules/theme-elements/assets/js/frontend/frontend-legacy */ "../modules/theme-elements/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy17 = _interopRequireDefault(__webpack_require__(/*! modules/woocommerce/assets/js/frontend/frontend-legacy */ "../modules/woocommerce/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy18 = _interopRequireDefault(__webpack_require__(/*! modules/loop-builder/assets/js/frontend/frontend-legacy */ "../modules/loop-builder/assets/js/frontend/frontend-legacy.js")); var _frontendLegacy19 = _interopRequireDefault(__webpack_require__(/*! modules/mega-menu/assets/js/frontend/frontend-legacy */ "../modules/mega-menu/assets/js/frontend/frontend-legacy.js")); const extendDefaultHandlers = defaultHandlers => { const handlers = { animatedText: _frontendLegacy.default, carousel: _frontendLegacy2.default, countdown: _frontendLegacy3.default, form: _frontendLegacy4.default, gallery: _frontendLegacy5.default, hotspot: _frontendLegacy6.default, lottie: _frontendLegacy7.default, nav_menu: _frontendLegacy8.default, popup: _frontendLegacy9.default, posts: _frontendLegacy10.default, share_buttons: _frontendLegacy11.default, slides: _frontendLegacy12.default, social: _frontendLegacy13.default, themeBuilder: _frontendLegacy15.default, themeElements: _frontendLegacy16.default, woocommerce: _frontendLegacy17.default, tableOfContents: _frontendLegacy14.default, loopBuilder: _frontendLegacy18.default, megaMenu: _frontendLegacy19.default }; return { ...defaultHandlers, ...handlers }; }; elementorProFrontend.on('elementor-pro/modules/init:before', () => { elementorFrontend.hooks.addFilter('elementor-pro/frontend/handlers', extendDefaultHandlers); }); /***/ }), /***/ "../assets/dev/js/frontend/utils/icons/e-icons.js": /*!********************************************************!*\ !*** ../assets/dev/js/frontend/utils/icons/e-icons.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.close = void 0; var _manager = _interopRequireDefault(__webpack_require__(/*! ./manager */ "../assets/dev/js/frontend/utils/icons/manager.js")); // This file is automatically generated, please don't change anything in this file. const iconsManager = new _manager.default('eicon'); const close = { get element() { const svgData = { path: 'M742 167L500 408 258 167C246 154 233 150 217 150 196 150 179 158 167 167 154 179 150 196 150 212 150 229 154 242 171 254L408 500 167 742C138 771 138 800 167 829 196 858 225 858 254 829L496 587 738 829C750 842 767 846 783 846 800 846 817 842 829 829 842 817 846 804 846 783 846 767 842 750 829 737L588 500 833 258C863 229 863 200 833 171 804 137 775 137 742 167Z', width: 1000, height: 1000 }; return iconsManager.createSvgElement('close', svgData); } }; exports.close = close; /***/ }), /***/ "../assets/dev/js/frontend/utils/icons/manager.js": /*!********************************************************!*\ !*** ../assets/dev/js/frontend/utils/icons/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 _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../node_modules/@babel/runtime/helpers/defineProperty.js")); class IconsManager { constructor(elementsPrefix) { this.prefix = `${elementsPrefix}-`; if (!IconsManager.symbolsContainer) { const symbolsContainerId = 'e-font-icon-svg-symbols'; IconsManager.symbolsContainer = document.getElementById(symbolsContainerId); if (!IconsManager.symbolsContainer) { IconsManager.symbolsContainer = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); IconsManager.symbolsContainer.setAttributeNS(null, 'style', 'display: none;'); IconsManager.symbolsContainer.setAttributeNS(null, 'class', symbolsContainerId); document.body.appendChild(IconsManager.symbolsContainer); } } } createSvgElement(name, _ref) { let { path, width, height } = _ref; const elementName = this.prefix + name, elementSelector = '#' + this.prefix + name; // Create symbol if not exist yet. if (!IconsManager.iconsUsageList.includes(elementName)) { if (!IconsManager.symbolsContainer.querySelector(elementSelector)) { const symbol = document.createElementNS('http://www.w3.org/2000/svg', 'symbol'); symbol.id = elementName; symbol.innerHTML = ''; symbol.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height); IconsManager.symbolsContainer.appendChild(symbol); } IconsManager.iconsUsageList.push(elementName); } const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); svg.innerHTML = ''; svg.setAttributeNS(null, 'class', 'e-font-icon-svg e-' + elementName); return svg; } } exports["default"] = IconsManager; (0, _defineProperty2.default)(IconsManager, "symbolsContainer", void 0); (0, _defineProperty2.default)(IconsManager, "iconsUsageList", []); /***/ }), /***/ "../assets/dev/js/frontend/utils/scroll.js": /*!*************************************************!*\ !*** ../assets/dev/js/frontend/utils/scroll.js ***! \*************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; if (window.elementorCommon) { window.elementorCommon.helpers.softDeprecated('Scroll util from "/dev/js/frontend/utils/scroll"', '3.1.0', 'elementorModules.utils.Scroll'); } var _default = elementorModules.utils.Scroll; exports["default"] = _default; /***/ }), /***/ "../assets/dev/js/preview/utils/document-handle.js": /*!*********************************************************!*\ !*** ../assets/dev/js/preview/utils/document-handle.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { /* provided dependency */ var __ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n")["__"]; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SAVE_CONTEXT = exports.EDIT_CONTEXT = void 0; exports.createElement = createElement; exports["default"] = addDocumentHandle; const EDIT_HANDLE_CLASS_NAME = 'elementor-document-handle'; const EDIT_MODE_CLASS_NAME = 'elementor-edit-mode'; const EDIT_CONTEXT = 'edit'; exports.EDIT_CONTEXT = EDIT_CONTEXT; const SAVE_HANDLE_CLASS_NAME = 'elementor-document-save-back-handle'; const SAVE_CONTEXT = 'save'; /** * @param {Object} handleTarget * @param {HTMLElement} handleTarget.element * @param {string|number} handleTarget.id - Document ID. * @param {string} handleTarget.title * @param {string} context - Edit/Save * @param {Function|null} onCloseDocument - Callback to run when outgoing document is closed. * @param {string} selector */ exports.SAVE_CONTEXT = SAVE_CONTEXT; function addDocumentHandle(_ref) { let { element, id, title = __('Template', 'elementor-pro') } = _ref; let context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : EDIT_CONTEXT; let onCloseDocument = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; let selector = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; if (EDIT_CONTEXT === context) { if (!id || !element) { throw Error('`id` and `element` are required.'); } if (isCurrentlyEditing(element) || hasHandle(element)) { return; } } const handleElement = createHandleElement({ title, onClick: () => onDocumentClick(id, context, onCloseDocument, selector) }, context); element.prepend(handleElement); if (EDIT_CONTEXT === context) { element.dataset.editableElementorDocument = id; } } /** * @param {HTMLElement} element * * @return {boolean} Whether the element is currently being edited. */ function isCurrentlyEditing(element) { return element.classList.contains(EDIT_MODE_CLASS_NAME); } /** * @param {HTMLElement} element * * @return {boolean} Whether the element has a handle. */ function hasHandle(element) { return !!element.querySelector(`:scope > .${EDIT_HANDLE_CLASS_NAME}`); } /** * @param {Object} handleProperties * @param {string} handleProperties.title * @param {Function} handleProperties.onClick * @param {string} context * * @return {HTMLElement} The newly generated Handle element */ function createHandleElement(_ref2, context) { let { title, onClick } = _ref2; const element = createElement({ tag: 'div', classNames: EDIT_CONTEXT === context ? [EDIT_HANDLE_CLASS_NAME] : [EDIT_HANDLE_CLASS_NAME, SAVE_HANDLE_CLASS_NAME], children: [createElement({ tag: 'i', classNames: [getHandleIcon(context)] }), createElement({ tag: 'div', classNames: [`${EDIT_CONTEXT === context ? EDIT_HANDLE_CLASS_NAME : SAVE_HANDLE_CLASS_NAME}__title`], children: [document.createTextNode(EDIT_CONTEXT === context ? __('Edit %s', 'elementor-pro').replace('%s', title) : __('Save %s', 'elementor-pro').replace('%s', title))] })] }); element.addEventListener('click', onClick); return element; } function getHandleIcon(context) { let icon = 'eicon-edit'; if (SAVE_CONTEXT === context) { icon = elementorFrontend.config.is_rtl ? 'eicon-arrow-right' : 'eicon-arrow-left'; } return icon; } /** * Util for creating HTML element. * * @param {Object} elementProperties * @param {string} elementProperties.tag * @param {string[]} elementProperties.classNames * @param {HTMLElement[]} elementProperties.children * * @return {HTMLElement} Generated Element */ function createElement(_ref3) { let { tag, classNames = [], children = [] } = _ref3; const element = document.createElement(tag); element.classList.add(...classNames); children.forEach(child => element.appendChild(child)); return element; } /** * @param {string|number} id * @param {string} context * @param {Function|null} onCloseDocument * @param {string} selector * @return {Promise} */ async function onDocumentClick(id, context) { let onCloseDocument = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; let selector = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; if (EDIT_CONTEXT === context) { window.top.$e.internal('panel/state-loading'); await window.top.$e.run('editor/documents/switch', { id: parseInt(id), onClose: onCloseDocument, selector }); window.top.$e.internal('panel/state-ready'); } else { elementorCommon.api.internal('panel/state-loading'); elementorCommon.api.run('editor/documents/switch', { id: elementor.config.initial_document.id, mode: 'save', shouldScroll: false, selector }).finally(() => elementorCommon.api.internal('panel/state-ready')); } } /***/ }), /***/ "../modules/animated-headline/assets/js/frontend/frontend-legacy.js": /*!**************************************************************************!*\ !*** ../modules/animated-headline/assets/js/frontend/frontend-legacy.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 _animatedHeadlines = _interopRequireDefault(__webpack_require__(/*! ./handlers/animated-headlines */ "../modules/animated-headline/assets/js/frontend/handlers/animated-headlines.js")); class _default extends elementorModules.Module { constructor() { super(); elementorFrontend.elementsHandler.attachHandler('animated-headline', _animatedHeadlines.default); } } exports["default"] = _default; /***/ }), /***/ "../modules/animated-headline/assets/js/frontend/handlers/animated-headlines.js": /*!**************************************************************************************!*\ !*** ../modules/animated-headline/assets/js/frontend/handlers/animated-headlines.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 _scroll = _interopRequireDefault(__webpack_require__(/*! elementor-pro/frontend/utils/scroll */ "../assets/dev/js/frontend/utils/scroll.js")); var _default = elementorModules.frontend.handlers.Base.extend({ svgPaths: { circle: ['M325,18C228.7-8.3,118.5,8.3,78,21C22.4,38.4,4.6,54.6,5.6,77.6c1.4,32.4,52.2,54,142.6,63.7 c66.2,7.1,212.2,7.5,273.5-8.3c64.4-16.6,104.3-57.6,33.8-98.2C386.7-4.9,179.4-1.4,126.3,20.7'], underline_zigzag: ['M9.3,127.3c49.3-3,150.7-7.6,199.7-7.4c121.9,0.4,189.9,0.4,282.3,7.2C380.1,129.6,181.2,130.6,70,139 c82.6-2.9,254.2-1,335.9,1.3c-56,1.4-137.2-0.3-197.1,9'], x: ['M497.4,23.9C301.6,40,155.9,80.6,4,144.4', 'M14.1,27.6c204.5,20.3,393.8,74,467.3,111.7'], strikethrough: ['M3,75h493.5'], curly: ['M3,146.1c17.1-8.8,33.5-17.8,51.4-17.8c15.6,0,17.1,18.1,30.2,18.1c22.9,0,36-18.6,53.9-18.6 c17.1,0,21.3,18.5,37.5,18.5c21.3,0,31.8-18.6,49-18.6c22.1,0,18.8,18.8,36.8,18.8c18.8,0,37.5-18.6,49-18.6c20.4,0,17.1,19,36.8,19 c22.9,0,36.8-20.6,54.7-18.6c17.7,1.4,7.1,19.5,33.5,18.8c17.1,0,47.2-6.5,61.1-15.6'], diagonal: ['M13.5,15.5c131,13.7,289.3,55.5,475,125.5'], double: ['M8.4,143.1c14.2-8,97.6-8.8,200.6-9.2c122.3-0.4,287.5,7.2,287.5,7.2', 'M8,19.4c72.3-5.3,162-7.8,216-7.8c54,0,136.2,0,267,7.8'], double_underline: ['M5,125.4c30.5-3.8,137.9-7.6,177.3-7.6c117.2,0,252.2,4.7,312.7,7.6', 'M26.9,143.8c55.1-6.1,126-6.3,162.2-6.1c46.5,0.2,203.9,3.2,268.9,6.4'], underline: ['M7.7,145.6C109,125,299.9,116.2,401,121.3c42.1,2.2,87.6,11.8,87.3,25.7'] }, getDefaultSettings() { const iterationDelay = this.getElementSettings('rotate_iteration_delay'), settings = { animationDelay: iterationDelay || 2500, // Letters effect lettersDelay: iterationDelay * 0.02 || 50, // Typing effect typeLettersDelay: iterationDelay * 0.06 || 150, selectionDuration: iterationDelay * 0.2 || 500, // Clip effect revealDuration: iterationDelay * 0.24 || 600, revealAnimationDelay: iterationDelay * 0.6 || 1500, // Highlighted headline highlightAnimationDuration: this.getElementSettings('highlight_animation_duration') || 1200, highlightAnimationDelay: this.getElementSettings('highlight_iteration_delay') || 8000 }; settings.typeAnimationDelay = settings.selectionDuration + 800; settings.selectors = { headline: '.elementor-headline', dynamicWrapper: '.elementor-headline-dynamic-wrapper', dynamicText: '.elementor-headline-dynamic-text' }; settings.classes = { dynamicText: 'elementor-headline-dynamic-text', dynamicLetter: 'elementor-headline-dynamic-letter', textActive: 'elementor-headline-text-active', textInactive: 'elementor-headline-text-inactive', letters: 'elementor-headline-letters', animationIn: 'elementor-headline-animation-in', typeSelected: 'elementor-headline-typing-selected', activateHighlight: 'e-animated', hideHighlight: 'e-hide-highlight' }; return settings; }, getDefaultElements() { var selectors = this.getSettings('selectors'); return { $headline: this.$element.find(selectors.headline), $dynamicWrapper: this.$element.find(selectors.dynamicWrapper), $dynamicText: this.$element.find(selectors.dynamicText) }; }, getNextWord($word) { return $word.is(':last-child') ? $word.parent().children().eq(0) : $word.next(); }, switchWord($oldWord, $newWord) { $oldWord.removeClass('elementor-headline-text-active').addClass('elementor-headline-text-inactive'); $newWord.removeClass('elementor-headline-text-inactive').addClass('elementor-headline-text-active'); this.setDynamicWrapperWidth($newWord); }, singleLetters() { var classes = this.getSettings('classes'); this.elements.$dynamicText.each(function () { var $word = jQuery(this), letters = $word.text().split(''), isActive = $word.hasClass(classes.textActive); $word.empty(); letters.forEach(function (letter) { var $letter = jQuery('', { class: classes.dynamicLetter }).text(letter); if (isActive) { $letter.addClass(classes.animationIn); } $word.append($letter); }); $word.css('opacity', 1); }); }, showLetter($letter, $word, bool, duration) { var self = this, classes = this.getSettings('classes'); $letter.addClass(classes.animationIn); if (!$letter.is(':last-child')) { setTimeout(function () { self.showLetter($letter.next(), $word, bool, duration); }, duration); } else if (!bool) { setTimeout(function () { self.hideWord($word); }, self.getSettings('animationDelay')); } }, hideLetter($letter, $word, bool, duration) { var self = this, settings = this.getSettings(); $letter.removeClass(settings.classes.animationIn); if (!$letter.is(':last-child')) { setTimeout(function () { self.hideLetter($letter.next(), $word, bool, duration); }, duration); } else if (bool) { setTimeout(function () { self.hideWord(self.getNextWord($word)); }, self.getSettings('animationDelay')); } }, showWord($word, $duration) { var self = this, settings = self.getSettings(), animationType = self.getElementSettings('animation_type'); if ('typing' === animationType) { self.showLetter($word.find('.' + settings.classes.dynamicLetter).eq(0), $word, false, $duration); $word.addClass(settings.classes.textActive).removeClass(settings.classes.textInactive); } else if ('clip' === animationType) { self.elements.$dynamicWrapper.animate({ width: $word.width() + 10 }, settings.revealDuration, function () { setTimeout(function () { self.hideWord($word); }, settings.revealAnimationDelay); }); } }, hideWord($word) { var self = this, settings = self.getSettings(), classes = settings.classes, letterSelector = '.' + classes.dynamicLetter; if (!this.isLoopMode && $word.is(':last-child')) { return; } var animationType = self.getElementSettings('animation_type'), nextWord = self.getNextWord($word); if ('typing' === animationType) { self.elements.$dynamicWrapper.addClass(classes.typeSelected); setTimeout(function () { self.elements.$dynamicWrapper.removeClass(classes.typeSelected); $word.addClass(settings.classes.textInactive).removeClass(classes.textActive).children(letterSelector).removeClass(classes.animationIn); }, settings.selectionDuration); setTimeout(function () { self.showWord(nextWord, settings.typeLettersDelay); }, settings.typeAnimationDelay); } else if (self.elements.$headline.hasClass(classes.letters)) { var bool = $word.children(letterSelector).length >= nextWord.children(letterSelector).length; self.hideLetter($word.find(letterSelector).eq(0), $word, bool, settings.lettersDelay); self.showLetter(nextWord.find(letterSelector).eq(0), nextWord, bool, settings.lettersDelay); self.setDynamicWrapperWidth(nextWord); } else if ('clip' === animationType) { self.elements.$dynamicWrapper.animate({ width: '2px' }, settings.revealDuration, function () { self.switchWord($word, nextWord); self.showWord(nextWord); }); } else { self.switchWord($word, nextWord); setTimeout(function () { self.hideWord(nextWord); }, settings.animationDelay); } }, setDynamicWrapperWidth($word) { const animationType = this.getElementSettings('animation_type'); if ('clip' !== animationType && 'typing' !== animationType) { this.elements.$dynamicWrapper.css('width', $word.width()); } }, animateHeadline() { var self = this, animationType = self.getElementSettings('animation_type'), $dynamicWrapper = self.elements.$dynamicWrapper; if ('clip' === animationType) { $dynamicWrapper.width($dynamicWrapper.width() + 10); } else if ('typing' !== animationType) { self.setDynamicWrapperWidth(self.elements.$dynamicText); } // Trigger animation setTimeout(function () { self.hideWord(self.elements.$dynamicText.eq(0)); }, self.getSettings('animationDelay')); }, getSvgPaths(pathName) { var pathsInfo = this.svgPaths[pathName], $paths = jQuery(); pathsInfo.forEach(function (pathInfo) { $paths = $paths.add(jQuery('', { d: pathInfo })); }); return $paths; }, addHighlight() { const elementSettings = this.getElementSettings(), $svg = jQuery('', { xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 500 150', preserveAspectRatio: 'none' }).html(this.getSvgPaths(elementSettings.marker)); this.elements.$dynamicWrapper.append($svg[0].outerHTML); }, rotateHeadline() { var settings = this.getSettings(); // Insert for each letter of a changing word if (this.elements.$headline.hasClass(settings.classes.letters)) { this.singleLetters(); } // Initialise headline animation this.animateHeadline(); }, initHeadline() { const headlineStyle = this.getElementSettings('headline_style'); if ('rotate' === headlineStyle) { this.rotateHeadline(); } else if ('highlight' === headlineStyle) { this.addHighlight(); this.activateHighlightAnimation(); } this.deactivateScrollListener(); }, activateHighlightAnimation() { const settings = this.getSettings(), classes = settings.classes, $headline = this.elements.$headline; $headline.removeClass(classes.hideHighlight).addClass(classes.activateHighlight); if (!this.isLoopMode) { return; } setTimeout(() => { $headline.removeClass(classes.activateHighligh).addClass(classes.hideHighlight); }, settings.highlightAnimationDuration + settings.highlightAnimationDelay * .8); setTimeout(() => { this.activateHighlightAnimation(false); }, settings.highlightAnimationDuration + settings.highlightAnimationDelay); }, activateScrollListener() { const scrollBuffer = -100; this.intersectionObservers.startAnimation.observer = _scroll.default.scrollObserver({ offset: `0px 0px ${scrollBuffer}px`, callback: event => { if (event.isInViewport) { this.initHeadline(); } } }); this.intersectionObservers.startAnimation.element = this.elements.$headline[0]; this.intersectionObservers.startAnimation.observer.observe(this.intersectionObservers.startAnimation.element); }, deactivateScrollListener() { this.intersectionObservers.startAnimation.observer.unobserve(this.intersectionObservers.startAnimation.element); }, onInit() { elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments); this.intersectionObservers = { startAnimation: { observer: null, element: null } }; this.isLoopMode = 'yes' === this.getElementSettings('loop'); this.activateScrollListener(); } }); exports["default"] = _default; /***/ }), /***/ "../modules/carousel/assets/js/frontend/frontend-legacy.js": /*!*****************************************************************!*\ !*** ../modules/carousel/assets/js/frontend/frontend-legacy.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 _mediaCarousel = _interopRequireDefault(__webpack_require__(/*! ./handlers/media-carousel */ "../modules/carousel/assets/js/frontend/handlers/media-carousel.js")); var _testimonialCarousel = _interopRequireDefault(__webpack_require__(/*! ./handlers/testimonial-carousel */ "../modules/carousel/assets/js/frontend/handlers/testimonial-carousel.js")); class _default extends elementorModules.Module { constructor() { super(); elementorFrontend.elementsHandler.attachHandler('media-carousel', _mediaCarousel.default); elementorFrontend.elementsHandler.attachHandler('testimonial-carousel', _testimonialCarousel.default); elementorFrontend.elementsHandler.attachHandler('reviews', _testimonialCarousel.default); } } exports["default"] = _default; /***/ }), /***/ "../modules/carousel/assets/js/frontend/handlers/base.js": /*!***************************************************************!*\ !*** ../modules/carousel/assets/js/frontend/handlers/base.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; class CarouselBase extends elementorModules.frontend.handlers.SwiperBase { getDefaultSettings() { return { selectors: { swiperContainer: '.elementor-main-swiper', swiperSlide: '.swiper-slide' }, slidesPerView: { widescreen: 3, desktop: 3, laptop: 3, tablet_extra: 3, tablet: 2, mobile_extra: 2, mobile: 1 } }; } getDefaultElements() { const selectors = this.getSettings('selectors'), elements = { $swiperContainer: this.$element.find(selectors.swiperContainer) }; elements.$slides = elements.$swiperContainer.find(selectors.swiperSlide); return elements; } getEffect() { return this.getElementSettings('effect'); } getDeviceSlidesPerView(device) { const slidesPerViewKey = 'slides_per_view' + ('desktop' === device ? '' : '_' + device); return Math.min(this.getSlidesCount(), +this.getElementSettings(slidesPerViewKey) || this.getSettings('slidesPerView')[device]); } getSlidesPerView(device) { if ('slide' === this.getEffect()) { return this.getDeviceSlidesPerView(device); } return 1; } getDeviceSlidesToScroll(device) { const slidesToScrollKey = 'slides_to_scroll' + ('desktop' === device ? '' : '_' + device); return Math.min(this.getSlidesCount(), +this.getElementSettings(slidesToScrollKey) || 1); } getSlidesToScroll(device) { if ('slide' === this.getEffect()) { return this.getDeviceSlidesToScroll(device); } return 1; } getSpaceBetween(device) { let propertyName = 'space_between'; if (device && 'desktop' !== device) { propertyName += '_' + device; } return this.getElementSettings(propertyName).size || 0; } getSwiperOptions() { const elementSettings = this.getElementSettings(); const swiperOptions = { grabCursor: true, initialSlide: this.getInitialSlide(), slidesPerView: this.getSlidesPerView('desktop'), slidesPerGroup: this.getSlidesToScroll('desktop'), spaceBetween: this.getSpaceBetween(), loop: 'yes' === elementSettings.loop, speed: elementSettings.speed, effect: this.getEffect(), preventClicksPropagation: false, slideToClickedSlide: true, handleElementorBreakpoints: true }; if ('yes' === elementSettings.lazyload) { swiperOptions.lazy = { loadPrevNext: true, loadPrevNextAmount: 1 }; } if (elementSettings.show_arrows) { swiperOptions.navigation = { prevEl: '.elementor-swiper-button-prev', nextEl: '.elementor-swiper-button-next' }; } if (elementSettings.pagination) { swiperOptions.pagination = { el: '.swiper-pagination', type: elementSettings.pagination, clickable: true }; } if ('cube' !== this.getEffect()) { const breakpointsSettings = {}, breakpoints = elementorFrontend.config.responsive.activeBreakpoints; Object.keys(breakpoints).forEach(breakpointName => { breakpointsSettings[breakpoints[breakpointName].value] = { slidesPerView: this.getSlidesPerView(breakpointName), slidesPerGroup: this.getSlidesToScroll(breakpointName), spaceBetween: this.getSpaceBetween(breakpointName) }; }); swiperOptions.breakpoints = breakpointsSettings; } if (!this.isEdit && elementSettings.autoplay) { swiperOptions.autoplay = { delay: elementSettings.autoplay_speed, disableOnInteraction: !!elementSettings.pause_on_interaction }; } return swiperOptions; } getDeviceBreakpointValue(device) { if (!this.breakpointsDictionary) { const breakpoints = elementorFrontend.config.responsive.activeBreakpoints; this.breakpointsDictionary = {}; Object.keys(breakpoints).forEach(breakpointName => { this.breakpointsDictionary[breakpointName] = breakpoints[breakpointName].value; }); } return this.breakpointsDictionary[device]; } updateSpaceBetween(propertyName) { const deviceMatch = propertyName.match('space_between_(.*)'), device = deviceMatch ? deviceMatch[1] : 'desktop', newSpaceBetween = this.getSpaceBetween(device); if ('desktop' !== device) { this.swiper.params.breakpoints[this.getDeviceBreakpointValue(device)].spaceBetween = newSpaceBetween; } else { this.swiper.params.spaceBetween = newSpaceBetween; } this.swiper.params.spaceBetween = newSpaceBetween; this.swiper.update(); } async onInit() { elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments); if (1 >= this.getSlidesCount()) { return; } const Swiper = elementorFrontend.utils.swiper; this.swiper = await new Swiper(this.elements.$swiperContainer, this.getSwiperOptions()); const elementSettings = this.getElementSettings(); if ('yes' === elementSettings.pause_on_hover) { this.togglePauseOnHover(true); } // Expose the swiper instance in the frontend this.elements.$swiperContainer.data('swiper', this.swiper); } getChangeableProperties() { return { autoplay: 'autoplay', pause_on_hover: 'pauseOnHover', pause_on_interaction: 'disableOnInteraction', autoplay_speed: 'delay', speed: 'speed', width: 'width' }; } updateSwiperOption(propertyName) { if (0 === propertyName.indexOf('width')) { this.swiper.update(); return; } const elementSettings = this.getElementSettings(), newSettingValue = elementSettings[propertyName], changeableProperties = this.getChangeableProperties(); let propertyToUpdate = changeableProperties[propertyName], valueToUpdate = newSettingValue; // Handle special cases where the value to update is not the value that the Swiper library accepts switch (propertyName) { case 'autoplay': if (newSettingValue) { valueToUpdate = { delay: elementSettings.autoplay_speed, disableOnInteraction: 'yes' === elementSettings.pause_on_interaction }; } else { valueToUpdate = false; } break; case 'autoplay_speed': propertyToUpdate = 'autoplay'; valueToUpdate = { delay: newSettingValue, disableOnInteraction: 'yes' === elementSettings.pause_on_interaction }; break; case 'pause_on_hover': this.togglePauseOnHover('yes' === newSettingValue); break; case 'pause_on_interaction': valueToUpdate = 'yes' === newSettingValue; break; } // 'pause_on_hover' is implemented by the handler with event listeners, not the Swiper library if ('pause_on_hover' !== propertyName) { this.swiper.params[propertyToUpdate] = valueToUpdate; } this.swiper.update(); } onElementChange(propertyName) { if (1 >= this.getSlidesCount()) { return; } if (0 === propertyName.indexOf('width')) { this.swiper.update(); // If there is another thumbs slider, like in the Media Carousel widget. if (this.thumbsSwiper) { this.thumbsSwiper.update(); } return; } // This is for handling the responsive control 'space_between'. // Responsive controls require a separate way of handling, and some currently don't work // (Swiper bug, currently exists in v5.3.6) TODO: update Swiper when bug is fixed and handle responsive controls if (0 === propertyName.indexOf('space_between')) { this.updateSpaceBetween(propertyName); return; } const changeableProperties = this.getChangeableProperties(); if (Object.prototype.hasOwnProperty.call(changeableProperties, propertyName)) { this.updateSwiperOption(propertyName); } } onEditSettingsChange(propertyName) { if (1 >= this.getSlidesCount()) { return; } if ('activeItemIndex' === propertyName) { this.swiper.slideToLoop(this.getEditSettings('activeItemIndex') - 1); } } } exports["default"] = CarouselBase; /***/ }), /***/ "../modules/carousel/assets/js/frontend/handlers/media-carousel.js": /*!*************************************************************************!*\ !*** ../modules/carousel/assets/js/frontend/handlers/media-carousel.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 _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/carousel/assets/js/frontend/handlers/base.js")); class MediaCarousel extends _base.default { isSlideshow() { return 'slideshow' === this.getElementSettings('skin'); } getDefaultSettings() { const defaultSettings = super.getDefaultSettings(...arguments); if (this.isSlideshow()) { defaultSettings.selectors.thumbsSwiper = '.elementor-thumbnails-swiper'; defaultSettings.slidesPerView = { widescreen: 5, desktop: 5, laptop: 5, tablet_extra: 5, tablet: 4, mobile_extra: 4, mobile: 3 }; } return defaultSettings; } getSlidesPerViewSettingNames() { if (!this.slideshowElementSettings) { this.slideshowElementSettings = ['slides_per_view']; const activeBreakpoints = elementorFrontend.config.responsive.activeBreakpoints; Object.keys(activeBreakpoints).forEach(breakpointName => { this.slideshowElementSettings.push('slides_per_view_' + breakpointName); }); } return this.slideshowElementSettings; } getElementSettings(setting) { if (-1 !== this.getSlidesPerViewSettingNames().indexOf(setting) && this.isSlideshow()) { setting = 'slideshow_' + setting; } return super.getElementSettings(setting); } getDefaultElements() { const selectors = this.getSettings('selectors'), defaultElements = super.getDefaultElements(...arguments); if (this.isSlideshow()) { defaultElements.$thumbsSwiper = this.$element.find(selectors.thumbsSwiper); } return defaultElements; } getEffect() { if ('coverflow' === this.getElementSettings('skin')) { return 'coverflow'; } return super.getEffect(); } getSlidesPerView(device) { if (this.isSlideshow()) { return 1; } if ('coverflow' === this.getElementSettings('skin')) { return this.getDeviceSlidesPerView(device); } return super.getSlidesPerView(device); } getSwiperOptions() { const options = super.getSwiperOptions(); if (this.isSlideshow()) { options.loopedSlides = this.getSlidesCount(); delete options.pagination; delete options.breakpoints; } return options; } async onInit() { await super.onInit(); const slidesCount = this.getSlidesCount(); if (!this.isSlideshow() || 1 >= slidesCount) { return; } const elementSettings = this.getElementSettings(), loop = 'yes' === elementSettings.loop, breakpointsSettings = {}, breakpoints = elementorFrontend.config.responsive.activeBreakpoints, desktopSlidesPerView = this.getDeviceSlidesPerView('desktop'); Object.keys(breakpoints).forEach(breakpointName => { breakpointsSettings[breakpoints[breakpointName].value] = { slidesPerView: this.getDeviceSlidesPerView(breakpointName), spaceBetween: this.getSpaceBetween(breakpointName) }; }); const thumbsSliderOptions = { slidesPerView: desktopSlidesPerView, initialSlide: this.getInitialSlide(), centeredSlides: elementSettings.centered_slides, slideToClickedSlide: true, spaceBetween: this.getSpaceBetween(), loopedSlides: slidesCount, loop, breakpoints: breakpointsSettings, handleElementorBreakpoints: true }; if ('yes' === elementSettings.lazyload) { thumbsSliderOptions.lazy = { loadPrevNext: true, loadPrevNextAmount: 1 }; } const Swiper = elementorFrontend.utils.swiper; this.swiper.controller.control = this.thumbsSwiper = await new Swiper(this.elements.$thumbsSwiper, thumbsSliderOptions); // Expose the swiper instance in the frontend this.elements.$thumbsSwiper.data('swiper', this.thumbsSwiper); this.thumbsSwiper.controller.control = this.swiper; } } exports["default"] = MediaCarousel; /***/ }), /***/ "../modules/carousel/assets/js/frontend/handlers/testimonial-carousel.js": /*!*******************************************************************************!*\ !*** ../modules/carousel/assets/js/frontend/handlers/testimonial-carousel.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 _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/carousel/assets/js/frontend/handlers/base.js")); class TestimonialCarousel extends _base.default { getDefaultSettings() { const defaultSettings = super.getDefaultSettings(); defaultSettings.slidesPerView = { desktop: 1 }; Object.keys(elementorFrontend.config.responsive.activeBreakpoints).forEach(breakpointName => { defaultSettings.slidesPerView[breakpointName] = 1; }); if (defaultSettings.loop) { defaultSettings.loopedSlides = this.getSlidesCount(); } return defaultSettings; } getEffect() { return 'slide'; } } exports["default"] = TestimonialCarousel; /***/ }), /***/ "../modules/countdown/assets/js/frontend/frontend-legacy.js": /*!******************************************************************!*\ !*** ../modules/countdown/assets/js/frontend/frontend-legacy.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 _countdown = _interopRequireDefault(__webpack_require__(/*! ./handlers/countdown */ "../modules/countdown/assets/js/frontend/handlers/countdown.js")); class _default extends elementorModules.Module { constructor() { super(); elementorFrontend.elementsHandler.attachHandler('countdown', _countdown.default); } } exports["default"] = _default; /***/ }), /***/ "../modules/countdown/assets/js/frontend/handlers/countdown.js": /*!*********************************************************************!*\ !*** ../modules/countdown/assets/js/frontend/handlers/countdown.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _default = elementorModules.frontend.handlers.Base.extend({ cache: null, cacheElements() { const $countDown = this.$element.find('.elementor-countdown-wrapper'); this.cache = { $countDown, timeInterval: null, elements: { $countdown: $countDown.find('.elementor-countdown-wrapper'), $daysSpan: $countDown.find('.elementor-countdown-days'), $hoursSpan: $countDown.find('.elementor-countdown-hours'), $minutesSpan: $countDown.find('.elementor-countdown-minutes'), $secondsSpan: $countDown.find('.elementor-countdown-seconds'), $expireMessage: $countDown.parent().find('.elementor-countdown-expire--message') }, data: { id: this.$element.data('id'), endTime: new Date($countDown.data('date') * 1000), actions: $countDown.data('expire-actions'), evergreenInterval: $countDown.data('evergreen-interval') } }; }, onInit() { elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments); this.cacheElements(); if (0 < this.cache.data.evergreenInterval) { this.cache.data.endTime = this.getEvergreenDate(); } this.initializeClock(); }, updateClock() { const self = this, timeRemaining = this.getTimeRemaining(this.cache.data.endTime); jQuery.each(timeRemaining.parts, function (timePart) { const $element = self.cache.elements['$' + timePart + 'Span']; let partValue = this.toString(); if (1 === partValue.length) { partValue = 0 + partValue; } if ($element.length) { $element.text(partValue); } }); if (timeRemaining.total <= 0) { clearInterval(this.cache.timeInterval); this.runActions(); } }, initializeClock() { const self = this; this.updateClock(); this.cache.timeInterval = setInterval(function () { self.updateClock(); }, 1000); }, runActions() { const self = this; // Trigger general event for 3rd patry actions self.$element.trigger('countdown_expire', self.$element); if (!this.cache.data.actions) { return; } this.cache.data.actions.forEach(function (action) { switch (action.type) { case 'hide': self.cache.$countDown.hide(); break; case 'redirect': if (action.redirect_url) { window.location.href = action.redirect_url; } break; case 'message': self.cache.elements.$expireMessage.show(); break; } }); }, getTimeRemaining(endTime) { const timeRemaining = endTime - new Date(); let seconds = Math.floor(timeRemaining / 1000 % 60), minutes = Math.floor(timeRemaining / 1000 / 60 % 60), hours = Math.floor(timeRemaining / (1000 * 60 * 60) % 24), days = Math.floor(timeRemaining / (1000 * 60 * 60 * 24)); if (days < 0 || hours < 0 || minutes < 0) { seconds = minutes = hours = days = 0; } return { total: timeRemaining, parts: { days, hours, minutes, seconds } }; }, getEvergreenDate() { const self = this, id = this.cache.data.id, interval = this.cache.data.evergreenInterval, dueDateKey = id + '-evergreen_due_date', intervalKey = id + '-evergreen_interval', localData = { dueDate: localStorage.getItem(dueDateKey), interval: localStorage.getItem(intervalKey) }, initEvergreen = function () { var evergreenDueDate = new Date(); self.cache.data.endTime = evergreenDueDate.setSeconds(evergreenDueDate.getSeconds() + interval); localStorage.setItem(dueDateKey, self.cache.data.endTime); localStorage.setItem(intervalKey, interval); return self.cache.data.endTime; }; if (null === localData.dueDate && null === localData.interval) { return initEvergreen(); } if (null !== localData.dueDate && interval !== parseInt(localData.interval, 10)) { return initEvergreen(); } if (localData.dueDate > 0 && parseInt(localData.interval, 10) === interval) { return localData.dueDate; } } }); exports["default"] = _default; /***/ }), /***/ "../modules/forms/assets/js/frontend/frontend-legacy.js": /*!**************************************************************!*\ !*** ../modules/forms/assets/js/frontend/frontend-legacy.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 _formSteps = _interopRequireDefault(__webpack_require__(/*! ./handlers/form-steps */ "../modules/forms/assets/js/frontend/handlers/form-steps.js")); var _formSender = _interopRequireDefault(__webpack_require__(/*! ./handlers/form-sender */ "../modules/forms/assets/js/frontend/handlers/form-sender.js")); var _formRedirect = _interopRequireDefault(__webpack_require__(/*! ./handlers/form-redirect */ "../modules/forms/assets/js/frontend/handlers/form-redirect.js")); var _recaptcha = _interopRequireDefault(__webpack_require__(/*! ./handlers/recaptcha */ "../modules/forms/assets/js/frontend/handlers/recaptcha.js")); var _date = _interopRequireDefault(__webpack_require__(/*! ./handlers/fields/date */ "../modules/forms/assets/js/frontend/handlers/fields/date.js")); var _time = _interopRequireDefault(__webpack_require__(/*! ./handlers/fields/time */ "../modules/forms/assets/js/frontend/handlers/fields/time.js")); class _default extends elementorModules.Module { constructor() { super(); const formHandlers = [_formSteps.default, _formSender.default, _formRedirect.default]; elementorFrontend.elementsHandler.attachHandler('form', [...formHandlers, _recaptcha.default, _date.default, _time.default]); elementorFrontend.elementsHandler.attachHandler('subscribe', formHandlers); } } exports["default"] = _default; /***/ }), /***/ "../modules/forms/assets/js/frontend/handlers/fields/data-time-field-base.js": /*!***********************************************************************************!*\ !*** ../modules/forms/assets/js/frontend/handlers/fields/data-time-field-base.js ***! \***********************************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; class DataTimeFieldBase extends elementorModules.frontend.handlers.Base { getDefaultSettings() { return { selectors: { fields: this.getFieldsSelector() }, classes: { useNative: 'elementor-use-native' } }; } getDefaultElements() { const { selectors } = this.getDefaultSettings(); return { $fields: this.$element.find(selectors.fields) }; } addPicker(element) { const { classes } = this.getDefaultSettings(), $element = jQuery(element); if ($element.hasClass(classes.useNative)) { return; } element.flatpickr(this.getPickerOptions(element)); } onInit() { super.onInit(...arguments); this.elements.$fields.each((index, element) => this.addPicker(element)); } } exports["default"] = DataTimeFieldBase; /***/ }), /***/ "../modules/forms/assets/js/frontend/handlers/fields/date.js": /*!*******************************************************************!*\ !*** ../modules/forms/assets/js/frontend/handlers/fields/date.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 _dataTimeFieldBase = _interopRequireDefault(__webpack_require__(/*! ./data-time-field-base */ "../modules/forms/assets/js/frontend/handlers/fields/data-time-field-base.js")); class DateField extends _dataTimeFieldBase.default { getFieldsSelector() { return '.elementor-date-field'; } getPickerOptions(element) { const $element = jQuery(element); return { minDate: $element.attr('min') || null, maxDate: $element.attr('max') || null, allowInput: true }; } } exports["default"] = DateField; /***/ }), /***/ "../modules/forms/assets/js/frontend/handlers/fields/time.js": /*!*******************************************************************!*\ !*** ../modules/forms/assets/js/frontend/handlers/fields/time.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 _dataTimeFieldBase = _interopRequireDefault(__webpack_require__(/*! ./data-time-field-base */ "../modules/forms/assets/js/frontend/handlers/fields/data-time-field-base.js")); class TimeField extends _dataTimeFieldBase.default { getFieldsSelector() { return '.elementor-time-field'; } getPickerOptions() { return { noCalendar: true, enableTime: true, allowInput: true }; } } exports["default"] = TimeField; /***/ }), /***/ "../modules/forms/assets/js/frontend/handlers/form-redirect.js": /*!*********************************************************************!*\ !*** ../modules/forms/assets/js/frontend/handlers/form-redirect.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _default = elementorModules.frontend.handlers.Base.extend({ getDefaultSettings() { return { selectors: { form: '.elementor-form' } }; }, getDefaultElements() { var selectors = this.getSettings('selectors'), elements = {}; elements.$form = this.$element.find(selectors.form); return elements; }, bindEvents() { this.elements.$form.on('form_destruct', this.handleSubmit); }, handleSubmit(event, response) { if ('undefined' !== typeof response.data.redirect_url) { location.href = response.data.redirect_url; } } }); exports["default"] = _default; /***/ }), /***/ "../modules/forms/assets/js/frontend/handlers/form-sender.js": /*!*******************************************************************!*\ !*** ../modules/forms/assets/js/frontend/handlers/form-sender.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _default = elementorModules.frontend.handlers.Base.extend({ getDefaultSettings() { return { selectors: { form: '.elementor-form', submitButton: '[type="submit"]' }, action: 'elementor_pro_forms_send_form', ajaxUrl: elementorProFrontend.config.ajaxurl }; }, getDefaultElements() { const selectors = this.getSettings('selectors'), elements = {}; elements.$form = this.$element.find(selectors.form); elements.$submitButton = elements.$form.find(selectors.submitButton); return elements; }, bindEvents() { this.elements.$form.on('submit', this.handleSubmit); const $fileInput = this.elements.$form.find('input[type=file]'); if ($fileInput.length) { $fileInput.on('change', this.validateFileSize); } }, validateFileSize(event) { const $field = jQuery(event.currentTarget), files = $field[0].files; if (!files.length) { return; } const maxSize = parseInt($field.attr('data-maxsize')) * 1024 * 1024, maxSizeMessage = $field.attr('data-maxsize-message'); const filesArray = Array.prototype.slice.call(files); filesArray.forEach(file => { if (maxSize < file.size) { $field.parent().addClass('elementor-error').append('' + maxSizeMessage + '').find(':input').attr('aria-invalid', 'true'); this.elements.$form.trigger('error'); } }); }, beforeSend() { const $form = this.elements.$form; $form.animate({ opacity: '0.45' }, 500).addClass('elementor-form-waiting'); $form.find('.elementor-message').remove(); $form.find('.elementor-error').removeClass('elementor-error'); $form.find('div.elementor-field-group').removeClass('error').find('span.elementor-form-help-inline').remove().end().find(':input').attr('aria-invalid', 'false'); this.elements.$submitButton.attr('disabled', 'disabled').find('> span').prepend(' '); }, getFormData() { const formData = new FormData(this.elements.$form[0]); formData.append('action', this.getSettings('action')); formData.append('referrer', location.toString()); return formData; }, onSuccess(response) { const $form = this.elements.$form; this.elements.$submitButton.removeAttr('disabled').find('.elementor-form-spinner').remove(); $form.animate({ opacity: '1' }, 100).removeClass('elementor-form-waiting'); if (!response.success) { if (response.data.errors) { jQuery.each(response.data.errors, function (key, title) { $form.find('#form-field-' + key).parent().addClass('elementor-error').append('' + title + '').find(':input').attr('aria-invalid', 'true'); }); $form.trigger('error'); } $form.append(''); } else { $form.trigger('submit_success', response.data); // For actions like redirect page $form.trigger('form_destruct', response.data); $form.trigger('reset'); if ('undefined' !== typeof response.data.message && '' !== response.data.message) { $form.append(''); } } }, onError(xhr, desc) { const $form = this.elements.$form; $form.append(''); this.elements.$submitButton.html(this.elements.$submitButton.text()).removeAttr('disabled'); $form.animate({ opacity: '1' }, 100).removeClass('elementor-form-waiting'); $form.trigger('error'); }, handleSubmit(event) { const self = this, $form = this.elements.$form; event.preventDefault(); if ($form.hasClass('elementor-form-waiting')) { return false; } this.beforeSend(); jQuery.ajax({ url: self.getSettings('ajaxUrl'), type: 'POST', dataType: 'json', data: self.getFormData(), processData: false, contentType: false, success: self.onSuccess, error: self.onError }); } }); exports["default"] = _default; /***/ }), /***/ "../modules/forms/assets/js/frontend/handlers/form-steps.js": /*!******************************************************************!*\ !*** ../modules/forms/assets/js/frontend/handlers/form-steps.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; class FormSteps extends elementorModules.frontend.handlers.Base { getDefaultSettings() { return { selectors: { form: '.elementor-form', fieldsWrapper: '.elementor-form-fields-wrapper', fieldGroup: '.elementor-field-group', stepWrapper: '.elementor-field-type-step', stepField: '.e-field-step', submitWrapper: '.elementor-field-type-submit', submitButton: '[type="submit"]', buttons: '.e-form__buttons', buttonWrapper: '.e-form__buttons__wrapper', button: '.e-form__buttons__wrapper__button', indicator: '.e-form__indicators__indicator', indicatorProgress: '.e-form__indicators__indicator__progress', indicatorProgressMeter: '.e-form__indicators__indicator__progress__meter', formHelpInline: '.elementor-form-help-inline' }, classes: { hidden: 'elementor-hidden', column: 'elementor-column', fieldGroup: 'elementor-field-group', elementorButton: 'elementor-button', step: 'e-form__step', buttons: 'e-form__buttons', buttonWrapper: 'e-form__buttons__wrapper', button: 'e-form__buttons__wrapper__button', indicators: 'e-form__indicators', indicator: 'e-form__indicators__indicator', indicatorIcon: 'e-form__indicators__indicator__icon', indicatorNumber: 'e-form__indicators__indicator__number', indicatorLabel: 'e-form__indicators__indicator__label', indicatorProgress: 'e-form__indicators__indicator__progress', indicatorProgressMeter: 'e-form__indicators__indicator__progress__meter', indicatorSeparator: 'e-form__indicators__indicator__separator', indicatorInactive: 'e-form__indicators__indicator--state-inactive', indicatorActive: 'e-form__indicators__indicator--state-active', indicatorCompleted: 'e-form__indicators__indicator--state-completed', indicatorShapeCircle: 'e-form__indicators__indicator--shape-circle', indicatorShapeSquare: 'e-form__indicators__indicator--shape-square', indicatorShapeRounded: 'e-form__indicators__indicator--shape-rounded', indicatorShapeNone: 'e-form__indicators__indicator--shape-none' } }; } getDefaultElements() { const { selectors } = this.getSettings(), elements = { $form: this.$element.find(selectors.form) }; elements.$fieldsWrapper = elements.$form.children(selectors.fieldsWrapper); elements.$stepWrapper = elements.$fieldsWrapper.children(selectors.stepWrapper); elements.$stepField = elements.$stepWrapper.children(selectors.stepField); elements.$fieldGroup = elements.$fieldsWrapper.children(selectors.fieldGroup); elements.$submitWrapper = elements.$fieldsWrapper.children(selectors.submitWrapper); elements.$submitButton = elements.$submitWrapper.children(selectors.submitButton); return elements; } onInit() { super.onInit(...arguments); if (!this.isStepsExist()) { return; } this.data = { steps: [], indicatorsWithObjectTags: [] }; this.state = { currentStep: 0, stepsType: '', stepsShape: '' }; this.buildSteps(); this.elements = { ...this.elements, ...this.createStepsIndicators(), ...this.createStepsButtons() }; this.initProgressBar(); this.extractResponsiveSizeFromSubmitWrapper(); } bindEvents() { if (!this.isStepsExist()) { return; } this.elements.$form.on({ submit: () => this.resetForm(), keydown: e => { if (13 === e.keyCode && !this.isLastStep() && 'textarea' !== e.target.localName) { e.preventDefault(); this.applyStep('next'); } }, error: () => this.onFormError() }); } isStepsExist() { return this.elements.$stepWrapper.length; } initProgressBar() { const stepsSettings = this.getElementSettings(); if ('progress_bar' === stepsSettings.step_type) { this.setProgressBar(); } } buildSteps() { this.elements.$stepWrapper.each((index, el) => { const { selectors, classes } = this.getSettings(), $currentStep = jQuery(el); $currentStep.addClass(classes.step).removeClass(classes.fieldGroup, classes.column); if (index) { $currentStep.addClass(classes.hidden); } this.setStepData($currentStep.children(selectors.stepField)); $currentStep.append($currentStep.nextUntil(this.elements.$stepWrapper).not(this.elements.$submitWrapper)); }); } setStepData($stepElement) { const dataAttributes = ['label', 'previousButton', 'nextButton', 'iconUrl', 'iconLibrary', 'icon'], stepData = {}; dataAttributes.forEach(attr => { const attrValue = $stepElement.attr('data-' + attr); if (attrValue) { stepData[attr] = attrValue; } }); this.data.steps.push(stepData); } createStepsIndicators() { const stepsSettings = this.getElementSettings(), stepsElements = {}; if ('none' !== stepsSettings.step_type) { const { selectors, classes } = this.getSettings(), indicatorsTypeClass = classes.indicators + '--type-' + stepsSettings.step_type, indicatorsClasses = [classes.indicators, indicatorsTypeClass]; stepsElements.$indicatorsWrapper = jQuery('
', { class: indicatorsClasses.join(' ') }); stepsElements.$indicatorsWrapper.append(this.buildIndicators()); this.elements.$fieldsWrapper.before(stepsElements.$indicatorsWrapper); if ('progress_bar' === stepsSettings.step_type) { stepsElements.$progressBar = stepsElements.$indicatorsWrapper.find(selectors.indicatorProgress); stepsElements.$progressBarMeter = stepsElements.$indicatorsWrapper.find(selectors.indicatorProgressMeter); } else { stepsElements.$indicators = stepsElements.$indicatorsWrapper.find(selectors.indicator); stepsElements.$currentIndicator = stepsElements.$indicators.eq(this.state.currentStep); } } this.saveIndicatorsState(); return stepsElements; } buildIndicators() { const stepsSettings = this.getElementSettings(); return 'progress_bar' === stepsSettings.step_type ? this.buildProgressBar() : this.buildIndicatorsFromStepsData(); } buildProgressBar() { const { classes } = this.getSettings(), $progressBar = jQuery('
', { class: classes.indicatorProgress }), $progressBarMeter = jQuery('
', { class: classes.indicatorProgressMeter }); $progressBar.append($progressBarMeter); return $progressBar; } getProgressBarValue() { const totalSteps = this.data.steps.length, currentStep = this.state.currentStep, percentage = currentStep ? (currentStep + 1) / totalSteps * 100 : 100 / totalSteps; return Math.floor(percentage) + '%'; } setProgressBar() { const progressBarValue = this.getProgressBarValue(); this.updateProgressMeterCSSVariable(progressBarValue); this.elements.$progressBarMeter.text(progressBarValue); } updateProgressMeterCSSVariable(value) { this.$element[0].style.setProperty('--e-form-steps-indicator-progress-meter-width', value); } saveIndicatorsState() { const stepsSettings = this.getElementSettings(); this.state.stepsType = stepsSettings.step_type; if (!['none', 'text', 'progress_bar'].includes(stepsSettings.step_type)) { this.state.stepsShape = stepsSettings.step_icon_shape; } } buildIndicatorsFromStepsData() { const indicators = []; this.data.steps.forEach((stepObj, index) => { if (index) { indicators.push(this.getStepSeparator()); } indicators.push(this.getStepIndicatorElement(stepObj, index)); }); return indicators; } getStepIndicatorElement(stepObj, index) { const { classes } = this.getSettings(), stepsSettings = this.getElementSettings(), indicatorStateClass = this.getIndicatorStateClass(index), indicatorClasses = [classes.indicator, indicatorStateClass], $stepIndicator = jQuery('
', { class: indicatorClasses.join(' ') }); if (stepsSettings.step_type.includes('icon')) { $stepIndicator.append(this.getStepIconElement(stepObj)); } if (stepsSettings.step_type.includes('number')) { $stepIndicator.append(this.getStepNumberElement(index)); } if (stepsSettings.step_type.includes('text')) { $stepIndicator.append(this.getStepLabelElement(stepObj.label)); } return $stepIndicator; } getIndicatorStateClass(index) { const { classes } = this.getSettings(); if (index < this.state.currentStep) { return classes.indicatorCompleted; } else if (index > this.state.currentStep) { return classes.indicatorInactive; } return classes.indicatorActive; } getIndicatorShapeClass() { const stepsSettings = this.getElementSettings(), { classes } = this.getSettings(); return classes['indicatorShape' + this.firstLetterToUppercase(stepsSettings.step_icon_shape)]; } firstLetterToUppercase(str) { return str.charAt(0).toUpperCase() + str.slice(1); } getStepNumberElement(index) { const { classes } = this.getSettings(), numberClasses = [classes.indicatorNumber, this.getIndicatorShapeClass()]; return jQuery('
', { class: numberClasses.join(' '), text: index + 1 }); } getStepIconElement(stepObj) { const { classes } = this.getSettings(), iconClasses = [classes.indicatorIcon, this.getIndicatorShapeClass()], $icon = jQuery('
', { class: iconClasses.join(' ') }); if (stepObj.icon) { $icon.html(stepObj.icon); } else { let $iconElement; if (stepObj.iconLibrary) { $iconElement = jQuery('', { class: stepObj.iconLibrary }); } else { // Using the attributes inline when creating the object, otherwise the data attribute will not work. $iconElement = jQuery(``); // Updating an indicator svg fill color, when loaded inside an object tag with a separated scope. $iconElement.on('load', event => { event.target.contentDocument.querySelector('svg').style.fill = $iconElement.css('fill'); }); // Storing the indicators elements that contain object tags in order to change their fill color on steps change. this.data.indicatorsWithObjectTags.push($iconElement); } $icon.append($iconElement); } return $icon; } getStepLabelElement(label) { const { classes } = this.getSettings(); return jQuery('

Szédítő kalandok várnak a chicken road virtuális útjain, ahol a gyorsaság és a szerencse kulcsfontosságú

Szédítő kalandok várnak a chicken road virtuális útjain, ahol a gyorsaság és a szerencse kulcsfontosságú

A virtuális világ rengeteg izgalmat tartogat, és az egyik legnépszerűbb szórakozási forma a gyorsaságot és a reflexeket próbáló játékok játéka. Ebben a cikkben a „chicken road” nevű játékot vizsgáljuk meg, amely egy egyszerű, de addiktív koncepcióra épül: egy csirkének kell átkelnie egy forgalmas úton, elkerülve az érkező autókat. A játék célja, hogy minél messzebbre jusson, minden sikeres átkeléssel növelve a pontszámot. A sikerhez kulcsfontosságú a megfelelő időzítés és a gyors reakciók.

A „csirkés” játékok műfaja régóta népszerű a játékosok körében, a klasszikus arcade gépektől kezdve a modern mobil alkalmazásokig. Ezek a játékok gyakran egyszerű szabályokkal rendelkeznek, ami lehetővé teszi, hogy mindenki könnyen elkezdjen játszani, ugyanakkor a nehézségi szint fokozatosan emelkedik, így a játékosokat hosszú ideig lefoglalja. A „chicken road” is ilyen játék, ahol a cél a túlélés és a pontgyűjtés.

A Játék Mechanikája és Kihívásai

A „chicken road” játék alapvetően az időzítésről szól. A csirkének akkor kell elindulnia az út egy oldaláról a másikra, amikor elegendő hely van az autóknak, hogy elhaladhassanak anélkül, hogy elüssék. A játék nehézsége a járművek sebességének és gyakoriságának növelésével fokozódik, ami egyre nagyobb figyelmet és gyorsabb reakciókat igényel a játékostól. A játékosnak figyelembe kell vennie a különböző típusú járműveket is, mivel egyesek gyorsabbak, mások lassabbak, és a viselkedésük is eltérő lehet. A sikeres átkelések után a játékos pontokat gyűjt, amelyek felhasználhatók új csirkék feloldására, vagy a játék nehézségének növelésére.

A Pontozási Rendszer és a Bónuszok

A „chicken road” pontozási rendszere egyszerű, de hatékony. Minden sikeresen leküzdött sávért a játékos pontokat kap, és a pontok száma a sávok számával növekszik. A sorozatos sikeres átkelések bónuszpontokat eredményeznek, ami ösztönzi a játékosokat, hogy folyamatosan kockáztassanak. Egyes játékváltozatokban speciális bónuszok is megjelennek, például pillanatnyi sebességfokozás vagy autólassítás. Ezek a bónuszok segíthetnek a játékosnak a nehezebb szinteken való átkelésben, de ritkák, és nem szabad rájuk támaszkodni.

Szint Autók Sebessége Gyakoriság Maximális Pontszám
1 Alacsony Ritka 100
2 Közepes Közepes 200
3 Magas Gyakori 300
4 Nagyon Magas Nagyon Gyakori 500

A táblázat bemutatja a játék különböző szintjeit és a hozzájuk tartozó paramétereket. Ahogy a játékos halad a szinteken, a kihívás egyre nagyobb lesz, ami nagyobb koncentrációt és gyorsabb reakciókat igényel.

Stratégiák a Sikerhez

A „chicken road” játékban a sikerhez nem csak a gyors reakciók, hanem a megfelelő stratégia is hozzájárul. A játékosoknak figyelembe kell venniük az autók mozgását, és meg kell próbálniuk megtalálni azokat a réseket, ahol biztonságosan át tudnak kelni. Fontos a türelem is, mert nem mindig érdemes azonnal nekivágni az útnak, jobb megvárni a megfelelő pillanatot. A tapasztalt játékosok gyakran felismerik az autók mozgásának mintázatait, és ezek alapján tudnak előre reagálni a veszélyre. A játékban fontos szerepet játszik a kockázatvállalás is, mivel minél több sávot sikerül egyszerre átkelni, annál több pontot lehet szerezni, de egyúttal annál nagyobb a baleset veszélye.

A Reflexek és a Figyelem Fontossága

A „chicken road” játék elsősorban a reflexeket és a figyelmet teszi próbára. A játékosnak folyamatosan figyelemmel kell kísérnie a képernyőt, és azonnal reagálnia kell az autók mozgására. A lassú reakciók vagy a figyelemhiány könnyen balesethez vezethet. A rendszeres játék segíthet a reflexek javításában és a figyelem koncentrálásában, de fontos, hogy a játékos ne fáradjon el túlságosan, mert a fáradtság csökkentheti a reakcióidőt és növelheti a hibázás valószínűségét.

  • A játék előtt pihenj meg és győződj meg róla, hogy nem vagy fáradt.
  • Koncentrálj a képernyőre és figyelj az autók mozgására.
  • Ne siess, várj a megfelelő pillanatra az átkeléshez.
  • Légy türelmes és ne add fel, ha nem sikerül elsőre.

A fenti tippek segíthetnek a játékosoknak a „chicken road” játékban való sikeres teljesítményhez. A gyakorlás és a stratégiai gondolkodás kulcsfontosságú a magas pontszámok eléréséhez.

A Játék Változatai és Fejlesztései

A „chicken road” játéknak számos változata létezik, amelyek különböző funkciókkal és grafikai megoldásokkal rendelkeznek. Egyes változatokban új csirkék, autók vagy akadályok jelennek meg, amelyek megnehezítik a játékot. Más változatokban online többjátékos mód is elérhető, ahol a játékosok versenyezhetnek egymással a legmagasabb pontszámért. A játék folyamatosan fejlődik, és a fejlesztők rendszeresen adnak ki új frissítéseket, amelyek javítják a játékélményt és új kihívásokat kínálnak a játékosoknak. Az egyik legnépszerűbb fejlesztés a virtuális valóság támogatása, amely még magával ragadóbb játékélményt nyújt.

A Virtuális Valóság Hatása a Játékélményre

A virtuális valóság használata a „chicken road” játékban teljesen új dimenziót nyit a játékosok számára. A VR-szemüveg viselésével a játékosok olyan érzést kapnak, mintha tényleg egy csirkének kellene átkelnie egy forgalmas úton. Ez a hatás sokkal intenzívebb, mint a hagyományos képernyőn való játék, és növeli a játék addiktív erejét. A VR-s változatban a játékosok jobban érzékelik a sebességet és a távolságot, ami még nagyobb kihívást jelent a számukra. A játék fejlesztői folyamatosan dolgoznak azon, hogy a VR-s változat még valósághűbb legyen és még több funkciót kínáljon a játékosoknak.

  1. A VR-szemüveg telepítése és konfigurálása.
  2. A játék letöltése és telepítése a VR-platformra.
  3. A játék elindítása és a beállítások testreszabása.
  4. A játék el kezdése és a kihívásokkal való szembenézés.

A fenti lépések betartásával a játékosok könnyedén elindulhatnak a virtuális valóságban a „chicken road” játékban.

A Játék Népszerűsége és Közössége

A „chicken road” játék rendkívül népszerű a játékosok körében, és hatalmas online közösséget von magával. A játékosok fórumokon, közösségi média platformokon és videómegosztó oldalakon cserélnek ki tapasztalatokat, stratégiákat és tippeket a játékban való sikeres teljesítményhez. Számos YouTube csatorna foglalkozik a játékkal, ahol a játékosok megosztják a legjobb pontszámaikat és a legizgalmasabb játékmeneteiket. A játék népszerűségét jelzi, hogy számos verseny és esemény szerveződik a játék körül, ahol a játékosok megmutathatják tudásukat és versenyezhetnek egymással.

A „chicken road” Jövője és a További Lehetőségek

A „chicken road” játék jövője ígéretesnek tűnik. A virtuális valóság és a mesterséges intelligencia további fejlesztései új lehetőségeket nyithatnak a játék számára. A mesterséges intelligencia felhasználásával a játék még realisztikusabb és kihívást jelentőbb lehet, mivel az autók viselkedése és a játék nehézsége a játékos egyéni képességeihez igazítható. A jövőben a játékban megjelenhetnek új játékmódok, például kooperatív mód, ahol a játékosok együtt dolgozhatnak a cél eléréséhez. A játék fejlesztői folyamatosan keresik azokat az új technológiákat és megoldásokat, amelyekkel a játékélményt tovább javíthatják és a játékosokat még sokáig lefoglalhatják. Ez a játék bizonyítja, hogy egy egyszerű koncepció is rendkívül addiktív lehet, ha megfelelően van megvalósítva és folyamatosan fejlesztik.

A „chicken road” egy jellegzetes példa arra, hogyan tud egy egyszerű, de addiktív játékmenet hosszú távon népszerű maradni a digitális szórakoztatóiparban. A folyamatos fejlesztések, az új technológiák integrálása, és a közösség aktív bevonása mind hozzájárulnak a játék sikeréhez és a jövőbeli növekedéshez. A játék lehetőséget biztosít a kikapcsolódásra, a stressz levezetésére, és a reflexek fejlesztésére, ami vonzóvá teszi a szélesebb közönség számára.

شرکت تولیدی دالینکوه پارسه

شرکت دانش بنیان صنعتی دالینکوه پارسه فعالیت خود را در سال 1394 با طراحی و ساخت قطعات صنعتی آغاز نمود. این شرکت با تکیه بر تجارب به دست آمده در این سال ها و دیدگاه حل مسئله در صنعت کشور با استفاده از ماشین آلات روزآمد و متخصصین توانمند اقدام به تولید نوع خاصی از دوزینگ پمپ، گیربکس های صنعتی و شیرآلات صنعتی برای صنایع مختلف می نماید.

تماس با ما

آدرس : سپیدان، کیلومتر 40 جاده شیراز-سپیدان، جاده هرایجان، شرکت دالینکوه پارسه

تلفن شرکت: 07132193216

کدپستی: 

فکس: 07132272697

ایمیل: info[@]dalinco[.]com

ایمیل: marketing[@]dalinco[.]com

آدرس : شیراز، خیابان ارم، کوچه22، پلاک 249

تلفن شرکت: 07132193216

کدپستی: 7143746448

فکس: 07132272697

ایمیل: info[@]dalinco[.]com

ایمیل: marketing[@]dalinco[.]com