/*! elementor - v3.23.0 - 05-08-2024 */ /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "../assets/dev/js/editor/container/container.js": /*!******************************************************!*\ !*** ../assets/dev/js/editor/container/container.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; /* provided dependency */ var __ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n")["__"]; 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 _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "../node_modules/@babel/runtime/helpers/slicedToArray.js")); var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js")); var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js")); var _assertThisInitialized2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js")); var _inherits2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js")); var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js")); var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js")); var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../node_modules/@babel/runtime/helpers/defineProperty.js")); var _argsObject = _interopRequireDefault(__webpack_require__(/*! ../../modules/imports/args-object */ "../assets/dev/js/modules/imports/args-object.js")); var _panel = _interopRequireDefault(__webpack_require__(/*! ./panel */ "../assets/dev/js/editor/container/panel.js")); var _childrenArray = _interopRequireDefault(__webpack_require__(/*! ./model/children-array */ "../assets/dev/js/editor/container/model/children-array.js")); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } /** * @typedef {import('../../../../lib/backbone/backbone.marionette')} Backbone * @typedef {import('../../../../lib/backbone/backbone.marionette')} Marionette * @typedef {import('../elements/views/base')} BaseElementView * @typedef {import('../elements/views/section')} SectionView * @typedef {import('../views/base-container')} BaseContainer * @typedef {import('../elements/models/base-element-model')} BaseElementModel */ /** * TODO: ViewsOptions * * @typedef {(Marionette.View|Marionette.CompositeView|BaseElementView|SectionView|BaseContainer)} ViewsOptions */ var Container = /*#__PURE__*/function (_ArgsObject) { (0, _inherits2.default)(Container, _ArgsObject); var _super = _createSuper(Container); /** * Function constructor(). * * Create container. * * @param {{}} args * * @throws {Error} */ function Container(args) { var _this; (0, _classCallCheck2.default)(this, Container); _this = _super.call(this, args); // Validate args. /** * Container type. * * @type {string} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "type", void 0); /** * Container id. * * @type {string} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "id", void 0); /** * Document Object. * * @type {{}} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "document", void 0); /** * Container model. * * @type {(Backbone.Model|BaseElementModel)} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "model", void 0); /** * Container settings. * * @type {Backbone.Model} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "settings", void 0); /** * Container view. * * @type {ViewsOptions} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "view", void 0); /** * Container parent. * * @type {Container} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "parent", void 0); /** * Container children(s). * * @type {ChildrenArray} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "children", new _childrenArray.default()); /** * Container dynamic. * * @type {Backbone.Model} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "dynamic", void 0); /** * Container globals. * * @type {Backbone.Model} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "globals", void 0); /** * Container label. * * @type {string} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "label", void 0); /** * Container controls. * * @type {{}} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "controls", {}); /** * Repeaters containers * * @type {{}} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "repeaters", {}); /** * Container renderer (The one who render). * * @type {Container} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderer", void 0); /** * Container panel. * * @type {Panel} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "panel", void 0); /** * Controls placeholders. * * @type {{}} */ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "placeholders", {}); _this.validateArgs(args); args = Object.entries(args); // If empty. if (0 === args.length) { throw Error('Container cannot be empty.'); } // Set properties, if not defined - keep the defaults. args.forEach(function (_ref) { var _ref2 = (0, _slicedToArray2.default)(_ref, 2), key = _ref2[0], value = _ref2[1]; _this[key] = 'undefined' === typeof value ? _this[key] : value; }); if ('undefined' === typeof _this.renderer) { _this.renderer = (0, _assertThisInitialized2.default)(_this); } if (!_this.document) { _this.document = elementor.documents.getCurrent(); } _this.dynamic = new Backbone.Model(_this.settings.get('__dynamic__')); _this.globals = new Backbone.Model(_this.settings.get('__globals__')); _this.panel = new _panel.default((0, _assertThisInitialized2.default)(_this)); _this.initialize(); return _this; } (0, _createClass2.default)(Container, [{ key: "initialize", value: function initialize() { if (this.isViewElement()) { this.addToParent(); this.handleChildrenRecursive(); this.view.on('destroy', this.removeFromParent.bind(this)); } this.handleRepeaterChildren(); } }, { key: "validateArgs", value: function validateArgs(args) { this.requireArgumentType('type', 'string', args); this.requireArgumentType('id', 'string', args); this.requireArgumentInstance('settings', Backbone.Model, args); this.requireArgumentInstance('model', Backbone.Model, args); // Require it, unless it's forced to be `false`. if (false !== args.parent) { this.requireArgumentInstance('parent', elementorModules.editor.Container, args); } } /** * Function getGroupRelatedControls(). * * Example: * Settings = { typography_typography: 'whatever', button_text_color: 'whatever' }; * Result { control_name: controlValue, ... - and so on }; * `Object.keys( Result ) = [ 'typography_typography', 'typography_font_family', 'typography_font_size', 'typography_font_size_tablet', 'typography_font_size_mobile', 'typography_font_weight', 'typography_text_transform', 'typography_font_style', 'typography_text_decoration', 'typography_line_height', 'typography_line_height_tablet', 'typography_line_height_mobile', 'typography_letter_spacing', 'typography_letter_spacing_tablet', 'typography_letter_spacing_mobile', 'button_text_color' ]`. * * @param {{}} settings * * @return {{}} result */ }, { key: "getGroupRelatedControls", value: function getGroupRelatedControls(settings) { var _this2 = this; var result = {}; Object.keys(settings).forEach(function (settingKey) { Object.values(_this2.controls).forEach(function (control) { var _this2$controls$setti; if (settingKey === control.name) { result[control.name] = control; } else if ((_this2$controls$setti = _this2.controls[settingKey]) !== null && _this2$controls$setti !== void 0 && _this2$controls$setti.groupPrefix) { var groupPrefix = _this2.controls[settingKey].groupPrefix; if (control.name.toString().startsWith(groupPrefix)) { result[control.name] = control; } } }); }); return result; } /** * Function getAffectingControls(). * * @return {{}} All controls that effecting the container. */ }, { key: "getAffectingControls", value: function getAffectingControls() { var _this3 = this; var result = {}, activeControls = this.settings.getActiveControls(); Object.entries(activeControls).forEach(function (_ref3) { var _ref4 = (0, _slicedToArray2.default)(_ref3, 2), controlName = _ref4[0], control = _ref4[1]; var controlValue = _this3.settings.get(control.name); if (control.global && !(controlValue !== null && controlValue !== void 0 && controlValue.length)) { var _this3$globals$get; if ((_this3$globals$get = _this3.globals.get(control.name)) !== null && _this3$globals$get !== void 0 && _this3$globals$get.length || _this3.getGlobalDefault(controlName).length) { control.global.utilized = true; result[controlName] = control; return; } } if (control.dynamic) { if (_this3.dynamic.get(controlName)) { control.dynamic.utilized = true; result[controlName] = control; return; } } if (controlValue === control.default) { return; } if (!controlValue) { return; } if ('object' === (0, _typeof2.default)(controlValue) && Object.values(controlValue).join() === Object.values(control.default).join()) { return; } result[controlName] = control; }); return result; } /** * Function getParentAncestry(). * * Recursively run over all parents from current container till the top * * @return {Array.} All parent as flat array. */ }, { key: "getParentAncestry", value: function getParentAncestry() { var result = []; var parent = this; while (parent) { result.push(parent); parent = parent.parent; } return result; } }, { key: "handleChildrenRecursive", value: function handleChildrenRecursive() { var _this$view$children; if ((_this$view$children = this.view.children) !== null && _this$view$children !== void 0 && _this$view$children.length) { Object.values(this.view.children._views).forEach(function (view) { if (!view.container) { return; } var container = view.container; // Since the way 'global-widget' rendered, it does not have parent sometimes. if (container.parent.children) { container.parent.children[view._index] = container; } container.handleChildrenRecursive(); }); } else { this.children.clear(); } } }, { key: "addToParent", value: function addToParent() { if (!this.parent.children || this.isRepeaterItem()) { return; } // On create container tell the parent where it was created. this.parent.children.splice(this.view._index, 0, this); } }, { key: "removeFromParent", value: function removeFromParent() { var _this4 = this; if (!this.parent.children || this.isRepeater()) { return; } // When delete container its should notify its parent, that his children is dead. this.parent.children = this.parent.children.filter(function (filtered) { return filtered.id !== _this4.id; }); } }, { key: "handleRepeaterChildren", value: function handleRepeaterChildren() { var _this5 = this; Object.values(this.controls).forEach(function (control) { if (!control.is_repeater) { return; } var model = new Backbone.Model({ name: control.name }); _this5.repeaters[control.name] = new elementorModules.editor.Container({ type: Container.TYPE_REPEATER, id: control.name, model: model, settings: model, view: _this5.view, parent: _this5, label: control.label || control.name, controls: {}, renderer: _this5.renderer }); _this5.settings.get(control.name).forEach(function (rowModel, index) { _this5.addRepeaterItem(control.name, rowModel, index); }); }); // Backwards Compatibility: if there is only one repeater (type=repeater), set it's children as current children. // Since 3.0.0. if (['widget', 'document'].includes(this.type)) { var repeaters = Object.values(this.controls).filter(function (control) { return 'repeater' === control.type; }); if (!this.model.get('supportRepeaterChildren') && 1 === repeaters.length) { Object.defineProperty(this, 'children', { get: function get() { elementorDevTools.deprecation.deprecated('children', '3.0.0', 'container.repeaters[ repeaterName ].children'); return this.repeaters[repeaters[0].name].children; } }); } } } /** * Function addRepeaterItem(). * * The method add repeater item, find the repeater control by it name, and create new container for the item. * * @param {string} repeaterName * @param {Backbone.Model} rowSettingsModel * @param {number} index * * @return {Container} container */ }, { key: "addRepeaterItem", value: function addRepeaterItem(repeaterName, rowSettingsModel, index) { var rowId = rowSettingsModel.get('_id'); // TODO: Temp backwards compatibility. since 2.8.0. if (!rowId) { rowId = 'bc-' + elementorCommon.helpers.getUniqueId(); rowSettingsModel.set('_id', rowId); } this.repeaters[repeaterName].children.splice(index, 0, new elementorModules.editor.Container({ type: Container.TYPE_REPEATER_ITEM, id: rowSettingsModel.get('_id'), model: new Backbone.Model({ name: repeaterName }), settings: rowSettingsModel, view: this.view, parent: this.repeaters[repeaterName], label: this.label + ' ' + __('Item', 'elementor'), controls: rowSettingsModel.options.controls, renderer: this.renderer })); return this.repeaters[repeaterName]; } /** * Function lookup(). * * If the view were destroyed, try to find it again if it exists. * * TODO: Refactor. * * @return {Container} container */ }, { key: "lookup", value: function lookup() { var _this$renderer$view; var result = this; if (!this.renderer) { return this; } if (this !== this.renderer && (_this$renderer$view = this.renderer.view) !== null && _this$renderer$view !== void 0 && _this$renderer$view.isDisconnected && this.renderer.view.isDisconnected()) { this.renderer = this.renderer.lookup(); } if (undefined === this.view || !this.view.lookup || !this.view.isDisconnected()) { // Hack For repeater item the result is the parent container. if (Container.TYPE_REPEATER_ITEM === this.type) { this.settings = this.parent.parent.settings.get(this.model.get('name')).findWhere({ _id: this.id }); } return result; } var lookup = this.view.lookup(); if (lookup) { result = lookup.getContainer(); // Hack For repeater item the result is the parent container. if (Container.REPEATER === this.type) { this.settings = result.settings.get(this.model.get('name')).findWhere({ _id: this.id }); return this; } // If lookup were done, new container were created and parent does not know about it. if (result.parent.children) { result.parent.children[result.view._index] = result; } } return result; } /** * @param {Function} callback - A callback function. * @deprecated since 3.5.0, use `container.children.findRecursive( callback )` instead. */ }, { key: "findChildrenRecursive", value: function findChildrenRecursive(callback) { elementorDevTools.deprecation.deprecated('container.findChildrenRecursive( callback )', '3.5.0', 'container.children.findRecursive( callback )'); return this.children.findRecursive(callback); } /** * @param {Function} callback - A callback function. * @deprecated since 3.5.0, use `container.children.forEachRecursive( callback )` instead. */ }, { key: "forEachChildrenRecursive", value: function forEachChildrenRecursive(callback) { elementorDevTools.deprecation.deprecated('container.forEachChildrenRecursive( callback )', '3.5.0', 'container.children.forEachRecursive( callback )'); return this.children.forEachRecursive(callback); } /** * Function render(). * * Call view render. * * Run's `this.renderer.view.renderOnChange( this.settings ) `. * When `this.renderer` exist. * */ }, { key: "render", value: function render() { if (!this.renderer) { return; } this.renderer.view.renderOnChange(this.settings); } }, { key: "renderUI", value: function renderUI() { if (!this.renderer) { return; } this.renderer.view.renderUI(); } }, { key: "isEditable", value: function isEditable() { return 'edit' === elementor.channels.dataEditMode.request('activeMode') && 'open' === this.document.editor.status; } }, { key: "isDesignable", value: function isDesignable() { return elementor.userCan('design') && this.isEditable(); } }, { key: "isGridContainer", value: function isGridContainer() { return 'grid' === this.parent.settings.get('container_type'); } /** * @return {boolean} */ }, { key: "isLocked", value: function isLocked() { return this.model.get('isLocked'); } }, { key: "isRepeater", value: function isRepeater() { return Container.TYPE_REPEATER === this.type; } }, { key: "isRepeaterItem", value: function isRepeaterItem() { return Container.TYPE_REPEATER_ITEM === this.type; } }, { key: "isViewElement", value: function isViewElement() { return this.view && this.model.get('elType'); } }, { key: "getSetting", value: function getSetting(name) { var localOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var localValue = this.settings.get(name); if (localOnly) { return localValue; } // Try to get the value in the order: Global, Local, Global default. var globalValue; if (this.getGlobalKey(name)) { globalValue = this.getGlobalValue(name); } return globalValue || localValue || this.getGlobalDefault(name); } }, { key: "getGlobalKey", value: function getGlobalKey(name) { return this.globals.get(name); } }, { key: "getGlobalValue", value: function getGlobalValue(name) { var control = this.controls[name], globalKey = this.getGlobalKey(name), globalArgs = $e.data.commandExtractArgs(globalKey), data = $e.data.getCache($e.components.get('globals'), globalArgs.command, globalArgs.args.query); if (!(data !== null && data !== void 0 && data.value)) { return; } var id = data.id; var value; // It's a global settings with additional controls in group. if (control.groupType) { // A regex containing all of the active breakpoints' prefixes ('_mobile', '_tablet' etc.). var responsivePrefixRegex = elementor.breakpoints.getActiveMatchRegex(); var propertyName = control.name.replace(control.groupPrefix, '').replace(responsivePrefixRegex, ''); if (!data.value[elementor.config.kit_config.typography_prefix + propertyName]) { return; } propertyName = propertyName.replace('_', '-'); value = "var( --e-global-".concat(control.groupType, "-").concat(id, "-").concat(propertyName, " )"); if (elementor.config.ui.defaultGenericFonts && control.groupPrefix + 'font_family' === control.name) { value += ", ".concat(elementor.config.ui.defaultGenericFonts); } } else { value = "var( --e-global-".concat(control.type, "-").concat(id, " )"); } return value; } /** * Determine if a control's global value is applied. * It actually checks if the local value is different than the global value. * * @param {string} controlName - Control name * @return {boolean} true if a control's global value is applied */ }, { key: "isGlobalApplied", value: function isGlobalApplied(controlName) { return this.getSetting(controlName) !== this.settings.get(controlName); } }, { key: "getGlobalDefault", value: function getGlobalDefault(controlName) { var _this$controls$contro; var controlGlobalArgs = (_this$controls$contro = this.controls[controlName]) === null || _this$controls$contro === void 0 ? void 0 : _this$controls$contro.global; if (controlGlobalArgs !== null && controlGlobalArgs !== void 0 && controlGlobalArgs.default) { // Temp fix. var controlType = this.controls[controlName].type; if ('color' === controlType) { controlType = 'colors'; } // End temp fix // If the control is a color/typography control and default colors/typography are disabled, don't return the global value. if (!elementor.config.globals.defaults_enabled[controlType]) { return ''; } var _$e$data$commandExtra = $e.data.commandExtractArgs(controlGlobalArgs.default), command = _$e$data$commandExtra.command, args = _$e$data$commandExtra.args, result = $e.data.getCache($e.components.get('globals'), command, args.query); return result === null || result === void 0 ? void 0 : result.value; } // No global default. return ''; } }]); return Container; }(_argsObject.default); exports["default"] = Container; // TODO: Swap those backwards compatibility is required. (0, _defineProperty2.default)(Container, "TYPE_REPEATER", 'repeater-control'); (0, _defineProperty2.default)(Container, "TYPE_REPEATER_ITEM", 'repeater'); /***/ }), /***/ "../assets/dev/js/editor/container/model/children-array.js": /*!*****************************************************************!*\ !*** ../assets/dev/js/editor/container/model/children-array.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; 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 _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js")); var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js")); var _inherits2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js")); var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js")); var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js")); var _wrapNativeSuper2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/wrapNativeSuper */ "../node_modules/@babel/runtime/helpers/wrapNativeSuper.js")); function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } /** * @typedef {import('../container')} Container */ var ChildrenArray = /*#__PURE__*/function (_Array) { (0, _inherits2.default)(ChildrenArray, _Array); var _super = _createSuper(ChildrenArray); function ChildrenArray() { (0, _classCallCheck2.default)(this, ChildrenArray); return _super.apply(this, arguments); } (0, _createClass2.default)(ChildrenArray, [{ key: "clear", value: function clear() { this.length = 0; } /** * Function findRecursive(). * * Will run over children recursively and pass the children to the callback till the callback returns positive value. * * @param {function(Container) : *} callback * * @return {Container|false} child */ }, { key: "findRecursive", value: function findRecursive(callback) { var _iterator = _createForOfIteratorHelper(this), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var container = _step.value; if (callback(container)) { return container; } if (container.children.length) { var foundChildren = container.children.findRecursive(callback); if (foundChildren) { return foundChildren; } } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return false; } /** * Function forEachRecursive(). * * Will run over children recursively. * * @param {function(Container) : *} callback * * @return {void} */ }, { key: "forEachRecursive", value: function forEachRecursive(callback) { var _iterator2 = _createForOfIteratorHelper(this), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var container = _step2.value; callback(container); if (container.children.length) { container.children.forEachRecursive(callback); } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } } /** * Function someRecursive(). * * Will run over children recursively, breaks if the callback return true. * * @param {function(Container) : *} callback */ }, { key: "someRecursive", value: function someRecursive(callback) { var _iterator3 = _createForOfIteratorHelper(this), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var _container$children; var container = _step3.value; if (callback(container)) { return true; } if ((_container$children = container.children) !== null && _container$children !== void 0 && _container$children.length) { if (container.children.someRecursive(callback)) { return true; } } } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } return false; } }]); return ChildrenArray; }( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Array)); exports["default"] = ChildrenArray; /***/ }), /***/ "../assets/dev/js/editor/container/panel.js": /*!**************************************************!*\ !*** ../assets/dev/js/editor/container/panel.js ***! \**************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; 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 _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js")); var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js")); /** * @typedef {import('./container')} Container */ var Panel = /*#__PURE__*/function () { /** * Function constructor(). * * Create constructor panel. * * @param {Container} container */ function Panel(container) { (0, _classCallCheck2.default)(this, Panel); this.container = container; } /** * Function refresh(). * * Refresh the panel. */ (0, _createClass2.default)(Panel, [{ key: "refresh", value: function refresh() { if ($e.routes.isPartOf('panel/editor')) { $e.routes.refreshContainer('panel'); } } /** * Function closeEditor(). * * Route to `panel/elements/categories` */ }, { key: "closeEditor", value: function closeEditor() { $e.route('panel/elements/categories'); } }, { key: "getControlView", value: function getControlView(name) { var editor = elementor.getPanelView().getCurrentPageView(); return editor.children.findByModelCid(this.getControlModel(name).cid); } }, { key: "getControlModel", value: function getControlModel(name) { var editor = elementor.getPanelView().getCurrentPageView(); return editor.collection.findWhere({ name: name }); } }]); return Panel; }(); exports["default"] = Panel; /***/ }), /***/ "../assets/dev/js/editor/elements/models/base-settings.js": /*!****************************************************************!*\ !*** ../assets/dev/js/editor/elements/models/base-settings.js ***! \****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); var _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js")); var BaseSettingsModel; /** * @name BaseSettingsModel */ BaseSettingsModel = Backbone.Model.extend({ options: {}, initialize: function initialize(data, options) { var self = this; // Keep the options for cloning self.options = options; self.controls = elementor.mergeControlsSettings(options.controls); self.validators = {}; if (!self.controls) { return; } var attrs = data || {}, defaults = {}; _.each(self.controls, function (control) { // Check features since they does not exist in tests. var isUIControl = control.features && -1 !== control.features.indexOf('ui'); if (isUIControl) { return; } var controlName = control.name; if ('object' === (0, _typeof2.default)(control.default)) { defaults[controlName] = structuredClone(control.default); } else { defaults[controlName] = control.default; } var isDynamicControl = control.dynamic && control.dynamic.active, hasDynamicSettings = isDynamicControl && attrs.__dynamic__ && attrs.__dynamic__[controlName]; if (isDynamicControl && !hasDynamicSettings && control.dynamic.default) { if (!attrs.__dynamic__) { attrs.__dynamic__ = {}; } attrs.__dynamic__[controlName] = control.dynamic.default; hasDynamicSettings = true; } // Check if the value is a plain object ( and not an array ) var isMultipleControl = jQuery.isPlainObject(control.default); if (undefined !== attrs[controlName] && isMultipleControl && !_.isObject(attrs[controlName]) && !hasDynamicSettings) { elementorCommon.debug.addCustomError(new TypeError('An invalid argument supplied as multiple control value'), 'InvalidElementData', 'Element `' + (self.get('widgetType') || self.get('elType')) + '` got <' + attrs[controlName] + '> as `' + controlName + '` value. Expected array or object.'); delete attrs[controlName]; } if (undefined === attrs[controlName]) { attrs[controlName] = defaults[controlName]; } }); self.defaults = defaults; self.handleRepeaterData(attrs); self.set(attrs); }, convertRepeaterValueToCollection: function convertRepeaterValueToCollection(attrs, repeaterControl) { return new Backbone.Collection(attrs[repeaterControl.name], { model: function model(attributes, options) { options = options || {}; options.controls = {}; Object.values(repeaterControl.fields).forEach(function (item) { options.controls[item.name] = item; }); // TODO: Cannot be deleted, since it handle repeater items after repeater widget creation. if (!attributes._id) { attributes._id = elementorCommon.helpers.getUniqueId(); } return new BaseSettingsModel(attributes, options); } }); }, handleRepeaterData: function handleRepeaterData(attrs) { var self = this; _.each(this.controls, function (field) { if (field.is_repeater) { // TODO: Apply defaults on each field in repeater fields if (!(attrs[field.name] instanceof Backbone.Collection)) { attrs[field.name] = self.convertRepeaterValueToCollection(attrs, field); } } }); }, getFontControls: function getFontControls() { return this.getControlsByType('font'); }, getIconsControls: function getIconsControls() { return this.getControlsByType('icons'); }, getControlsByType: function getControlsByType(type) { return _.filter(this.getActiveControls(), function (control) { return type === control.type; }); }, getStyleControls: function getStyleControls(controls, attributes) { var self = this; controls = structuredClone(self.getActiveControls(controls, attributes)); var styleControls = []; jQuery.each(controls, function () { var _control$dynamic; var control = this, controlDefaultSettings = elementor.config.controls[control.type]; control = jQuery.extend({}, controlDefaultSettings, control); if (control.fields) { var styleFields = []; if (!(self.attributes[control.name] instanceof Backbone.Collection)) { self.attributes[control.name] = self.convertRepeaterValueToCollection(self.attributes, control); } self.attributes[control.name].each(function (item) { styleFields.push(self.getStyleControls(control.fields, item.attributes)); }); control.styleFields = styleFields; } if (control.fields || (_control$dynamic = control.dynamic) !== null && _control$dynamic !== void 0 && _control$dynamic.active || self.isGlobalControl(control, controls) || self.isStyleControl(control.name, controls)) { styleControls.push(control); } }); return styleControls; }, isGlobalControl: function isGlobalControl(control, controls) { var _globalControl$global, _this$attributes$__gl; var controlGlobalKey = control.name; if (control.groupType) { controlGlobalKey = control.groupPrefix + control.groupType; } var globalControl = controls[controlGlobalKey]; if (!((_globalControl$global = globalControl.global) !== null && _globalControl$global !== void 0 && _globalControl$global.active)) { return false; } var globalValue = (_this$attributes$__gl = this.attributes.__globals__) === null || _this$attributes$__gl === void 0 ? void 0 : _this$attributes$__gl[controlGlobalKey]; return !!globalValue; }, isStyleControl: function isStyleControl(attribute, controls) { controls = controls || this.controls; var currentControl = _.find(controls, function (control) { return attribute === control.name; }); return currentControl && !_.isEmpty(currentControl.selectors); }, getClassControls: function getClassControls(controls) { controls = controls || this.controls; return _.filter(controls, function (control) { return !_.isUndefined(control.prefix_class); }); }, isClassControl: function isClassControl(attribute) { var currentControl = _.find(this.controls, function (control) { return attribute === control.name; }); return currentControl && !_.isUndefined(currentControl.prefix_class); }, getControl: function getControl(id) { return _.find(this.controls, function (control) { return id === control.name; }); }, getActiveControls: function getActiveControls(controls, attributes) { var activeControls = {}; if (!controls) { controls = this.controls; } if (!attributes) { attributes = this.attributes; } attributes = this.parseGlobalSettings(attributes, controls); jQuery.each(controls, function (controlKey, control) { if (elementor.helpers.isActiveControl(control, attributes, controls)) { activeControls[controlKey] = control; } }); return activeControls; }, clone: function clone() { return new BaseSettingsModel(elementorCommon.helpers.cloneObject(this.attributes), elementorCommon.helpers.cloneObject(this.options)); }, setExternalChange: function setExternalChange(key, value) { var self = this, settingsToChange; if ('object' === (0, _typeof2.default)(key)) { settingsToChange = key; } else { settingsToChange = {}; settingsToChange[key] = value; } self.set(settingsToChange); jQuery.each(settingsToChange, function (changedKey, changedValue) { self.trigger('change:external:' + changedKey, changedValue); }); }, parseDynamicSettings: function parseDynamicSettings(settings, options, controls) { var self = this; settings = elementorCommon.helpers.cloneObject(settings || self.attributes); options = options || {}; controls = controls || this.controls; jQuery.each(controls, function () { var control = this, valueToParse; if (control.is_repeater) { valueToParse = settings[control.name]; valueToParse.forEach(function (value, key) { valueToParse[key] = self.parseDynamicSettings(value, options, control.fields); }); return; } valueToParse = settings.__dynamic__ && settings.__dynamic__[control.name]; if (!valueToParse) { return; } var dynamicSettings = control.dynamic; if (undefined === dynamicSettings) { dynamicSettings = elementor.config.controls[control.type].dynamic; } if (!dynamicSettings || !dynamicSettings.active) { return; } var dynamicValue; try { dynamicValue = elementor.dynamicTags.parseTagsText(valueToParse, dynamicSettings, elementor.dynamicTags.getTagDataContent); } catch (error) { if (elementor.dynamicTags.CACHE_KEY_NOT_FOUND_ERROR !== error.message) { throw error; } dynamicValue = ''; if (options.onServerRequestStart) { options.onServerRequestStart(); } elementor.dynamicTags.refreshCacheFromServer(function () { if (options.onServerRequestEnd) { options.onServerRequestEnd(); } }); } if (dynamicSettings.property) { settings[control.name][dynamicSettings.property] = dynamicValue; } else { settings[control.name] = dynamicValue; } }); return settings; }, parseGlobalSettings: function parseGlobalSettings(settings, controls) { var _this = this; settings = elementorCommon.helpers.cloneObject(settings); controls = controls || this.controls; jQuery.each(controls, function (index, control) { var _settings$__globals__, _globalSettings; var valueToParse; if (control.is_repeater) { valueToParse = settings[control.name]; valueToParse.forEach(function (value, key) { valueToParse[key] = _this.parseGlobalSettings(value, control.fields); }); return; } valueToParse = (_settings$__globals__ = settings.__globals__) === null || _settings$__globals__ === void 0 ? void 0 : _settings$__globals__[control.name]; if (!valueToParse) { return; } var globalSettings = control.global; if (undefined === globalSettings) { globalSettings = elementor.config.controls[control.type].global; } if (!((_globalSettings = globalSettings) !== null && _globalSettings !== void 0 && _globalSettings.active)) { return; } var _$e$data$commandExtra = $e.data.commandExtractArgs(valueToParse), command = _$e$data$commandExtra.command, args = _$e$data$commandExtra.args, globalValue = $e.data.getCache($e.components.get('globals'), command, args.query); if (control.groupType) { settings[control.name] = 'custom'; } else { settings[control.name] = globalValue; } }); return settings; }, removeDataDefaults: function removeDataDefaults(data, controls) { var _this2 = this; jQuery.each(data, function (key) { var control = controls[key]; if (!control) { return; } // TODO: use `save_default` in text|textarea controls. if (control.save_default || ('text' === control.type || 'textarea' === control.type) && data[key]) { return; } if (control.is_repeater) { data[key].forEach(function (repeaterRow) { _this2.removeDataDefaults(repeaterRow, control.fields); }); return; } if (_.isEqual(data[key], control.default)) { delete data[key]; } }); }, toJSON: function toJSON(options) { var data = Backbone.Model.prototype.toJSON.call(this); options = options || {}; delete data.widgetType; delete data.elType; delete data.isInner; _.each(data, function (attribute, key) { if (attribute && attribute.toJSON) { data[key] = attribute.toJSON(); } }); if (options.remove && -1 !== options.remove.indexOf('default')) { this.removeDataDefaults(data, this.controls); } return structuredClone(data); } }); /** * @name BaseSettingsModel */ module.exports = BaseSettingsModel; /***/ }), /***/ "../assets/dev/js/editor/elements/views/behaviors/inner-tabs.js": /*!**********************************************************************!*\ !*** ../assets/dev/js/editor/elements/views/behaviors/inner-tabs.js ***! \**********************************************************************/ /***/ ((module) => { "use strict"; var InnerTabsBehavior; InnerTabsBehavior = Marionette.Behavior.extend({ onRenderCollection: function onRenderCollection() { this.handleInnerTabs(this.view); }, handleInnerTabs: function handleInnerTabs(parent) { var closedClass = 'e-tab-close', activeClass = 'e-tab-active', tabsWrappers = parent.children.filter(function (view) { return 'tabs' === view.model.get('type'); }); _.each(tabsWrappers, function (view) { view.$el.find('.elementor-control-content').remove(); var tabsId = view.model.get('name'), tabs = parent.children.filter(function (childView) { return 'tab' === childView.model.get('type') && childView.model.get('tabs_wrapper') === tabsId; }); _.each(tabs, function (childView, index) { view._addChildView(childView); var tabId = childView.model.get('name'), controlsUnderTab = parent.children.filter(function (controlView) { return tabId === controlView.model.get('inner_tab'); }); if (0 === index) { childView.$el.addClass(activeClass); } else { _.each(controlsUnderTab, function (controlView) { controlView.$el.addClass(closedClass); }); } }); }); }, onChildviewControlTabClicked: function onChildviewControlTabClicked(childView) { var closedClass = 'e-tab-close', activeClass = 'e-tab-active', tabClicked = childView.model.get('name'), childrenUnderTab = this.view.children.filter(function (view) { return 'tab' !== view.model.get('type') && childView.model.get('tabs_wrapper') === view.model.get('tabs_wrapper'); }), siblingTabs = this.view.children.filter(function (view) { return 'tab' === view.model.get('type') && childView.model.get('tabs_wrapper') === view.model.get('tabs_wrapper'); }); _.each(siblingTabs, function (view) { view.$el.removeClass(activeClass); }); childView.$el.addClass(activeClass); _.each(childrenUnderTab, function (view) { if (view.model.get('inner_tab') === tabClicked) { view.$el.removeClass(closedClass); } else { view.$el.addClass(closedClass); } }); elementor.getPanelView().updateScrollbar(); } }); module.exports = InnerTabsBehavior; /***/ }), /***/ "../assets/dev/js/editor/utils/is-instanceof.js": /*!******************************************************!*\ !*** ../assets/dev/js/editor/utils/is-instanceof.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } /** * Some FileAPI objects such as FileList, DataTransferItem and DataTransferItemList has inconsistency with the retrieved * object (from events, etc.) and the actual JavaScript object so a regular instanceof doesn't work. This function can * check whether it's instanceof by using the objects constructor and prototype names. * * @param object * @param constructors * @return {boolean} */ var _default = function _default(object, constructors) { constructors = Array.isArray(constructors) ? constructors : [constructors]; var _iterator = _createForOfIteratorHelper(constructors), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _constructor = _step.value; if (object.constructor.name === _constructor.prototype[Symbol.toStringTag]) { return true; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return false; }; exports["default"] = _default; /***/ }), /***/ "../assets/dev/js/editor/utils/module.js": /*!***********************************************!*\ !*** ../assets/dev/js/editor/utils/module.js ***! \***********************************************/ /***/ ((module) => { "use strict"; var EditorModule = elementorModules.Module.extend({ onInit: function onInit() { var _this = this; var $window = jQuery(window); $window.on('elementor:init-components', this.onElementorInitComponents.bind(this)); $window.on('elementor:loaded', function () { _this.onElementorLoaded(); elementor.on('document:loaded', _this.onDocumentLoaded.bind(_this)); }); $window.on('elementor:init', this.onElementorReady); }, // TODO: Delete as soon as possible. getEditorControlView: function getEditorControlView(name) { var editor = elementor.getPanelView().getCurrentPageView(); return editor.children.findByModelCid(this.getEditorControlModel(name).cid); }, // TODO: Delete as soon as possible. getEditorControlModel: function getEditorControlModel(name) { var editor = elementor.getPanelView().getCurrentPageView(); return editor.collection.findWhere({ name: name }); }, onElementorReady: function onElementorReady() { this.onElementorInit(); elementor.on('frontend:init', this.onElementorFrontendInit.bind(this)).on('preview:loaded', this.onElementorPreviewLoaded.bind(this)); } }); EditorModule.prototype.onElementorLoaded = function () {}; EditorModule.prototype.onElementorInit = function () {}; EditorModule.prototype.onElementorPreviewLoaded = function () {}; EditorModule.prototype.onDocumentLoaded = function () {}; EditorModule.prototype.onElementorFrontendInit = function () {}; EditorModule.prototype.onElementorInitComponents = function () {}; module.exports = EditorModule; /***/ }), /***/ "../assets/dev/js/editor/views/controls-popover.js": /*!*********************************************************!*\ !*** ../assets/dev/js/editor/views/controls-popover.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; /* provided dependency */ var __ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n")["__"]; 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")); var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js")); var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js")); var ControlsPopover = /*#__PURE__*/function () { function ControlsPopover(child) { (0, _classCallCheck2.default)(this, ControlsPopover); this.child = child; this.$popover = jQuery('
', { class: 'elementor-controls-popover' }); child.$el.before(this.$popover); this.$popover.append(child.$el); this.popoverToggleView = child._parent.children.findByIndex(child._index - 1); // Add the "Typography" header to the popover if ('typography' === this.child.model.attributes.groupType) { this.createPopoverHeader(); } } (0, _createClass2.default)(ControlsPopover, [{ key: "addChild", value: function addChild(child) { this.$popover.append(child.$el); } }, { key: "createPopoverHeader", value: function createPopoverHeader() { var _this = this; var $popoverToggleControl = this.$popover.prev(), // Get the existing reset button. $resetLabel = $popoverToggleControl.find('.elementor-control-popover-toggle-reset-label'); this.$popoverHeader = jQuery('
', { class: 'e-group-control-header' }).html('' + __('Typography', 'elementor') + ''); this.$headerControlsWrapper = jQuery('
', { class: 'e-control-tools' }); // Give the reset button the control tool styling, and add a click event so clicking on it closes the popover. $resetLabel.addClass('e-control-tool').on('click', function () { return _this.onResetButtonClick(); }); // Move the popover toggle reset button into the popover header. this.$headerControlsWrapper.append($resetLabel); this.$popoverHeader.append(this.$headerControlsWrapper); var globalConfig = this.popoverToggleView.model.get('global'); if (globalConfig !== null && globalConfig !== void 0 && globalConfig.active) { this.createAddButton(); } this.$popover.prepend(this.$popoverHeader).addClass('e-controls-popover--typography'); } }, { key: "onResetButtonClick", value: function onResetButtonClick() { this.$popover.hide(); var groupControlName = this.child.model.get('groupPrefix') + 'typography', args = { container: this.child.options.container, settings: (0, _defineProperty2.default)({}, groupControlName, '') }; if (this.child.options.container.globals.get(groupControlName)) { // The Disable Globals command applies global settings locally, // so disabling the global shouldn't actually change the appearance of the widget. $e.run('document/globals/disable', args); } else { $e.run('document/elements/settings', args); } } }, { key: "onAddButtonClick", value: function onAddButtonClick() { this.popoverToggleView.onAddGlobalButtonClick(); } }, { key: "createAddButton", value: function createAddButton() { var _this2 = this; this.$addButton = jQuery('

Ανακαλύπτοντας νέες προοπτικές στον κόσμο της διασκέδασης με αναλυτικές spinanga κριτικεσ που εμπνέο

Ανακαλύπτοντας νέες προοπτικές στον κόσμο της διασκέδασης με αναλυτικές spinanga κριτικεσ που εμπνέουν.

Στον κόσμο των διαδικτυακών παιχνιδιών, οι spinanga κριτικεσ θεμελιώνουν μια νέα διάσταση της διασκέδασης και του ενθουσιασμού. Οι κριτικές αυτές προσφέρουν μια πολυδιάστατη αξιολόγηση των διαφορετικών καζίνο που υπάρχουν, δίνοντας έμφαση σε όλες τις πτυχές, από την εμπειρία χρήστη έως τα επιβραβευτικά συστήματα και τις προσφορές. Με την ταχεία ανάπτυξη της τεχνολογίας, οι χρήστες επιθυμούν να ενημερώνουν για τις καλύτερες επιλογές που έχουν στη διάθεσή τους. Είναι λοιπόν ζωτικής σημασίας να κατανοήσουμε πώς λειτουργούν αυτές οι κριτικές και πώς μπορούν να μας καθοδηγήσουν στην επιλογή ενός αξιόπιστου και διασκεδαστικού καζίνο.

Η ανάγκη για πληροφορίες είναι μεγαλύτερη από ποτέ καθώς οι επιλογές στο διαδικτυακό καζίνο αυξάνονται συνεχώς. Οι spinanga κριτικεσ αναλύουν διεξοδικά τις παρεχόμενες υπηρεσίες, τις αναγκαίες άδειες λειτουργίας και τις πολιτικές ασφαλείας των καζίνο. Αυτές οι πληροφορίες είναι κρίσιμου χαρακτήρα για κάθε παίκτη, καθώς διασφαλίζουν ότι η εμπειρία παιχνιδιού είναι τόσο ασφαλής όσο και ευχάριστη. Σημαντικό είναι οι κριτικές αυτές να είναι αξιόπιστες και ειλικρινείς, καθώς αυτό βοηθά στη διαμόρφωση της γνώμης και της επιλογής του παίκτη.

Η μόδα των διαδικτυακών καζίνο δεν είναι απλώς μια τάση, αλλά μια επανάσταση στη ψυχαγωγία. Οι spinanga κριτικεσ συμβάλλουν στην ενημέρωση των παικτών σχετικά με τις εναλλακτικές επιλογές και τους οδηγούν να ανακαλύψουν νέα παιχνίδια και καταθέσεις. Η κριτική ανταγωνίζεται την εμπειρία, καθώς οι χρήστες προσπαθούν να συνδυάσουν την ψυχαγωγία με την ευχέρεια του διαδικτύου. Ειδικά σε έναν κόσμο όπου οι διαδικτυακές αλληλεπιδράσεις είναι καθημερινές, η θετική και αρνητική ανατροφοδότηση μπορεί να έχει σοβαρές επιρροές στην απόφαση ενός χρήστη.

Πέρα από την απλή αναφορά στα καζίνο, οι spinanga κριτικεσ προσφέρουν επίσης στατιστικά στοιχεία και συγκρίσεις που είναι απαραίτητα για τους παίκτες. Μέσα από συγκριτικούς πίνακες και βαθμολογίες, οι χρήστες μπορούν να ελέγξουν γρήγορα ποια καζίνο τους προσφέρουν τις καλύτερες δυνατές εμπειρίες. Οι κριτικές αυτές ενισχύουν την αίσθηση της κοινότητας, καθώς οι παίκτες μοιράζονται τις ιστορίες τους και τις απόψεις τους, παρέχοντας έναν πλούτο πληροφοριών και εμπειριών.

Με όλα αυτά κατά νου, είναι σημαντικό να κατανοήσουμε πώς να αξιολογήσουμε τις κριτικές αυτές, καθώς και να επιλέξουμε καζίνο που προσφέρουν όχι μόνο ψυχαγωγία αλλά και ασφάλεια. Οι κριτικές αυτές δεν είναι μόνο για το παιχνίδι, αλλά και για τη συνολική εμπειρία του χρήστη και την ικανοποίηση που προκύπτει από αυτή.

Η σημασία των spinanga κριτικεσ

Οι spinanga κριτικεσ είναι κρίσιμες για κάθε παίκτη που αναζητά την καλύτερη δυνατή εμπειρία στα διαδικτυακά καζίνο. Παρέχουν λεπτομερείς πληροφορίες για την ασφάλεια, τις μεθόδους πληρωμής, τις προσφορές αλλά και την υποστήριξη πελατών. Αυτές οι κριτικές λειτουργούν ως οδηγός για τους νεοεισερχόμενους και τους έμπειρους παίκτες, καθιστώντας ευκολότερη την επιλογή ενός αξιόπιστου καζίνο. Ο ρόλος τους είναι διττός: να πληροφορθούν οι παίκτες για τις επιλογές που έχουν, αλλά και να καθοδηγήσουν τους παρόχους προς τη βελτίωση των υπηρεσιών τους.

Ο παρακάτω πίνακας συγκρίνει μερικά από τα πιο δημοφιλή διαδικτυακά καζίνο και τις αξιολογήσεις τους σύμφωνα με τις spinanga κριτικεσ:

Καζίνο
Βαθμολογία
Προσφορές
Μεθόδοι Πληρωμής
Καζίνο Α 9.5 50% μπόνους Πιστωτική κάρτα, PayPal
Καζίνο Β 8.8 Δωρεάν περιστροφές Διατραπεζικά, Skrill
Καζίνο Γ 9.0 20% επιστροφή χρημάτων Χρεωστική κάρτα, Neteller

Πώς να επιλέξετε το κατάλληλο καζίνο

Η επιλογή του κατάλληλου καζίνο είναι μια διαδικασία που απαιτεί προσοχή και έρευνα. Μερικοί παράγοντες που πρέπει να λάβετε υπόψη περιλαμβάνουν τις spinanga κριτικεσ, τις αδειοδοτήσεις, την ποικιλία παιχνιδιών και την υποστήριξη πελατών. Είναι πολύ σημαντικό να διαβάσετε αρκετές κριτικές προτού αποφασίσετε. Αυτό θα σας δώσει μια καλή εικόνα για το πώς λειτουργεί το καζίνο και πώς αντιδρούν οι άλλοι παίκτες στις υπηρεσίες τους.

Επιπλέον, οι άδειες παιχνιδιών είναι επίσης κρίσιμες. Καζίνο που είναι εγγεγραμμένα και ελεγμένα από αξιόπιστες αρχές είναι πιο αξιόπιστα και ασφαλή. Ελέγξτε τη διαθεσιμότητα των εμπορικών σημάτων και αν είναι επιστοποιημένα από κατάλληλες ρυθμιστικές Αρχές.

Αξιολόγηση και κριτικές των παικτών

Η αξιολόγηση των διαδικτυακών καζίνο από τους παίκτες έχει αναδειχθεί κυρίως μέσω των spinanga κριτικεσ. Αυτές οι κριτικές συνήθως περιλαμβάνουν προσωπικές εμπειρίες από το παιχνίδι και τις υπηρεσίες που παρέχονται. Η γνώμη των παικτών έχει μεγάλη σημασία καθώς δείχνει την πραγματική εμπειρία του χρήστη και αποφαίνεται για την ποιότητα των υπηρεσιών του καζίνο. Επίσης, είναι σημαντικό να αναφέρονται οποιαδήποτε προβλήματα με την εμπειρία, από την ασφάλεια μέχρι την εξυπηρέτηση πελατών.

Οι παίκτες μπορούν να αξιολογήσουν διάφορες πτυχές όπως:

  • Εμπειρία χρήσης
  • Ταχύτητα πληρωμών
  • Προβλήματα υποστήριξης
  • Διαφορετικά παιχνίδια

Διαδικασία διαμαρτυρίας

Αν οι χρήστες αντιμετωπίσουν προβλήματα ή δεν είναι ικανοποιημένοι με την εμπειρία τους, είναι σημαντικό να γνωρίζουν τη διαδικασία διαμαρτυρίας. Οι περισσότερες φορές οι πλατφόρμες καζίνο έχουν κατευθυντήριες γραμμές για την υποστήριξη των πελατών τους. Σε αυτές μπορεί να περιλαμβάνονται email ή καταχωρίσεις φόρμας, όπου οι παίκτες μπορούν να αναφέρουν τα θέματα που προκύπτουν. Δε θα πρέπει επίσης να ξεχνάμε την σημασία της έγκαιρης επικοινωνίας για την ταχύτερη λύση των προβλημάτων.

Για την αποτελεσματική επίλυση των προβλημάτων, οι χρήστες πρέπει να είναι προετοιμασμένοι να παρέχουν λεπτομέρειες, όπως αριθμούς λογαριασμού ή κάποιες αποδείξεις πληρωμών. Αυτό βοηθά τους πράκτορες υποστήριξης να κατανοήσουν τα ζητήματα πιο γρήγορα.

Ασφάλεια και υπευθυνότητα στα καζίνο

Η ασφάλεια των παικτών είναι ένα άκρως σοβαρό θέμα στον κόσμο των διαδικτυακών καζίνο. Οι spinanga κριτικεσ συχνά αναλύουν την ασφάλεια των παρόχων και τις τεχνολογίες προστασίας που χρησιμοποιούν. Καζίνο που χρησιμοποιούν κρυπτογράφηση SSL και άλλες πλατφόρμες ασφάλειας προσφέρουν υψηλότερο επίπεδο εμπιστοσύνης στους χρήστες. Είναι επίσης σημαντικό να διασφαλίζεται ότι τα προσωπικά δεδομένα των παικτών διατηρούνται ιδιωτικά και ασφαλή.

Η υπευθυνότητα είναι επίσης κρίσιμη. Τα καζίνο πρέπει να διαθέτουν εργαλεία για να βοηθήσουν τους παίκτες να θέσουν όρια στα παιχνίδια τους και να προλαμβάνουν τον εθισμό. Υποστηριζόμενες υπηρεσίες, όπως η επιλογή αυτο-αποκλεισμού, βοηθούν τους παίκτες να ελέγξουν την κατανάλωσή τους και να διαφυλάξουν την ευημερία τους. Οι κριτικές παίζουν ρόλο εδώ, πώς οι παίκτες αναφέρουν αν η πλατφόρμα υποστηρίζει τέτοιες επιλογές.

Διαχείριση χρημάτων

Η διαχείριση χρημάτων είναι άλλη μία πτυχή που αναλύεται στις spinanga κριτικεσ. Οι παίκτες θα πρέπει να θέτουν προϋπολογισμό και να τηρούν τον προγραμματισμό τους χωρίς να υπερβαίνουν τις δαπάνες τους. Πολλά καζίνο προσφέρουν εργαλεία προϋπολογισμού που μπορεί να βοηθήσουν τους χρήστες να παρακολουθήσουν την κίνησή τους. Εάν οι παίκτες βλέπουν ότι αρχίζουν να αποκλίνουν από τον προγραμματισμένο τους προυπολογισμό, είναι σημαντικό να λάβουν υπόψιν τους και να υπενθυμίσουν την υπευθυνότητα.

Στην ανάλυση ασφάλειας υπάρχει επίσης η πρόσβαση σε ηλεκτρονικά εργαλεία που βοηθούν τους παίκτες στην αναγνώριση ρίσκων και στην αντιμετώπισή τους. Η εκπαίδευση και η ενημέρωση γύρω από αυτές τις πρακτικές είναι προτεραιότητα και είναι μια περιοχή που θα μπορούσε να βελτιωθεί αρκετά.

Προσφορές και Μπόνους

Αυτή τη στιγμή, οι διαδικτυακές πλατφόρμες καζίνο προσφέρουν ποικιλία προσφορών και μπόνους, οι οποίες συχνά αναλύονται στις spinanga κριτικεσ. Αυτές οι προσφορές μπορεί να περιλαμβάνουν μπόνους εγγραφής, δωρεάν περιστροφές και άλλες προωθητικές ενέργειες που ενθαρρύνουν τους παίκτες να δοκιμάσουν νέα παιχνίδια. Είναι σημαντικό να κατανοήσουμε τους όρους και τις προϋποθέσεις που σχετίζονται με αυτές τις προσφορές, καθώς συχνά υπάρχουν απαιτήσεις στοιχηματισμού που πρέπει να πληρούνται πριν από την εκταμίευση των κερδών.

Στον παρακάτω πίνακα, συγκρίνουμε διαφορετικά μπόνους από επιλεγμένα καζίνο:

Καζίνο
Μπόνους Εγγραφής
Δωρεάν Περιστροφές
Ελάχιστη Κατάθεση
Καζίνο Δ 100% έως 200€ 30 περιστροφές 10€
Καζίνο Ε 150% έως 300€ 50 περιστροφές 20€
Καζίνο ΣΤ 200% έως 500€ 100 περιστροφές 15€

Στρατηγική εκμετάλλευσης προσφορών

Η στρατηγική για τη σωστή εκμετάλλευση των προσφορών είναι επίσης κάτι που εξετάζεται στις spinanga κριτικεσ. Παίκτες που γνωρίζουν πώς να χρησιμοποιήσουν τις προσφορές με τον καλύτερο τρόπο μπορούν να μεγιστοποιήσουν την εμπειρία τους και τις πιθανότητες κέρδους. Είναι ζωτικής σημασίας να κατανοήσουν πώς να εκπληρώσουν τις απαιτήσεις στοιχηματισμού πριν εκταμιεύσουν τα κέρδη τους.

Επίσης, οι παίκτες μπορούν να αξιολογήσουν τις καλύτερες στιγμές για να εγγραφούν και να επωφεληθούν από τις προσφορές, συνήθως κατά τη διάρκεια των επετειακών εκδηλώσεων ή των θερινών εκπτώσεων. Οι ενημερώσεις από τις κριτικές παίζουν ρόλο για το πότε και πώς θα απολαύσετε τις προσφορές αυτά.

Δημοφιλή παιχνίδια στα καζίνο

Είναι σημαντικό να γνωρίζουμε ποια παιχνίδια είναι διαθέσιμα στα διαδικτυακά καζίνο. Οι spinanga κριτικεσ συνήθως περιλαμβάνουν αναφορές σε δημοφιλή παιχνίδια όπως ρουλέτα, πόκερ, κουλοχέρηδες και μπλακτζακ. Πολλοί παίκτες προτιμούν παιχνίδια που παρέχουν τέτοιας μορφής διασκέδαση και κοινωνική αλληλεπίδραση.

Μερικά από τα πιο δημοφιλή παιχνίδια περιλαμβάνουν:

  1. Ρουλέτα
  2. Κουλοχέρηδες
  3. Μπλακτζακ
  4. Πόκερ
  5. Μπακαρά

Πώς να επιλέξετε το κατάλληλο παιχνίδι

Η επιλογή του κατάλληλου παιχνιδιού εξαρτάται από τις προτιμήσεις και τους στόχους του παίκτη. Κάποιοι προτιμούν παιχνίδια τύχης όπως οι κουλοχέρηδες, ενώ άλλοι επιλέγουν στρατηγικά παιχνίδια όπως το πόκερ ή το μπλακτζακ. Είναι σημαντικό να διαβάσετε τις κριτικές και να δοκιμάσετε παιχνιδια πριν αποδεχτείτε την τελική σας απόφαση. Πολλά καζίνο προσφέρουν δωρεάν εκδόσεις των παιχνιδιών τους, έτσι οι παίκτες μπορούν να εξοικειωθούν με τις παραμέτρους πριν στοιχηματίσουν πραγματικά χρήματα.

Αξιολογώντας παιχνίδια όπως η ρουλέτα, μπορεί να διαπιστώσετε αν η συγκεκριμένη έκδοση έχει προοδευτικά τζακπότ ή άλλες εκδόσεις που μπορεί να είναι πιο ελκυστικές. Η φήμη του παιχνιδιού και η εμπειρία των άλλων παικτών επηρεάζουν επίσης την επιλογή σας.

Κλείνοντας

Με τις spinanga κριτικεσ να παίζουν καθοριστικό ρόλο στη διαμόρφωση της εμπειρίας των παικτών, είναι σαφές ότι οι πληροφορίες και οι αξιολογήσεις είναι βασικά εργαλεία που βοηθούν τους χρήστες να κάνουν τις σωστές επιλογές. Η ασφάλεια, η ευκολία χρήσης και οι διαθέσιμες προσφορές είναι στοιχεία που πρέπει να εξετάζονται προσεκτικά. Κάθε παίκτης θα πρέπει να είναι ενήμερος για τις επιλογές του και να αξιοποιεί στο έπακρο την εμπειρία του στα διαδικτυακά καζίνο, εστιάζοντας στην ψυχαγωγία και τη διασκέδαση.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio