/*! 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('

Διαδικτυακά Pokies στην Αυστραλία – Ο καλύτερος κατάλογος Pokies με πραγματικά χρήματα για το 2026

Fale com um Advogado

Preencha o formulário abaixo e receba nosso contato:

Ξεκινήστε με γρήγορα στοιχήματα και ορίστε ένα συγκεκριμένο όριο για το τι σας βολεύει να πληρώνετε. Δείτε τις εταιρείες τυχερών παιχνιδιών που αναφέρονται στις καλύτερες επιλογές μας. Όλες έχουν ελεγχθεί και θα σας εμπιστευτούν οι Αυστραλοί παίκτες. Θα συντονιστείτε με τις λειτουργίες μπόνους, θα δοκιμάσετε τα νέα βήματα και θα unlimluck.io/el-gr/promo-code/ επιλέξετε τα στοιχήματά σας έξυπνα. Μερικά από τα καλύτερα αυστραλιανά συστήματα διαδικτυακών καζίνο προσφέρουν πόντους υποστήριξης για κάθε ανατροπή. πράγματα που θα μπορούσατε ενδεχομένως να ανταλλάξετε για να έχετε μπόνους, μικρότερες καταβολές, αν όχι προσωπικές ιδέες για δώρα. Τα 100% δωρεάν παιχνίδια είναι πραγματικά διασκεδαστικά για συμπεριφορά, ωστόσο, μόνο τα διαδικτυακά καζίνο με πραγματικό νόμισμα σας δίνουν την ευκαιρία να εξαργυρώσετε πραγματικά κέρδη.

Αλλά για τις νέες περιστροφές χωρίς στοιχήματα, αξίζει τον κόπο. Δεν διαθέτει ένα παραδοσιακό μπόνους με πρόσκληση. Δίνουν μια μεγάλη γκάμα από κουλοχέρηδες από ομάδες όπως το Gamble'letter Go και το NetEnt. Έχω εξετάσει πολλά προγράμματα τους τελευταίους 6 μήνες.

Τα νέα βήματα υπολογισμού αμφισβητούν την αξία τους, δεν υπάρχει μεμονωμένο παράδειγμα και πολλοί επαγγελματίες αποσύρουν μπόνους. Δεν διασφαλίζει ότι τα χρήματα θα φανούν στην τσέπη σας τη στιγμή που αναμένεται μια απόσπαση. Δείξτε ότι προέρχεται από το ζωντανό λόμπι και ελέγξτε τον πίνακα γνώσεων, επειδή οι χειριστές συχνά εργάζονται σε επιλογές που δημιουργούν RTP. Το Deadwood εκτελεί τους μηχανισμούς xNudge της νέας εταιρείας και μπορείτε να χρησιμοποιήσετε τους μηχανισμούς xSplit, έτσι οι τροχοί μεγαλώνουν και θα έχετε ώθηση στα κέρδη για το σετ στην ικανότητα take-aside του Insane West.

the casino application

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

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

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

no deposit bonus for cool cat casino

Ανεξάρτητα από αυτό, απευθύνονται σε παίκτες που εφαρμόζουν επί του παρόντος νέους χαρακτήρες, ιστορίες ή άλλα θέματα. Τα κοινωνικά κουλοχέρηδες προσελκύουν παίκτες σε διάφορες πόλεις και θα βρείτε προγράμματα, από την Αρχαία Αίγυπτο μέχρι το Nuts Western, μαζί με επιλογές που προέρχονται από τα θέματα της Δυτικής εποχής. «Είχα δέκα καρτέλες να ξεκλειδώσω, αλλά δεν εμπιστευόμουν μερικές από αυτές. Ο αριθμός του Elias με έριξε σε δύο επιλογές γρήγορα, και οι σημειώσεις για την απόδοση πληρωμής με έσωσαν από μια τεράστια φρίκη στη συνέχεια». Αν το καζίνο τείνει να κάνει αυτά τα ηλεκτρικά εργαλεία αδύνατα να βρεθούν, το θεωρώ ως ένα μεγάλο προειδοποιητικό σημάδι. Περιττό να πω ότι πρέπει πρώτα να αποσύρετε τυχόν άχρηστα χρήματα και, αν αφήνετε κάποια κενά όταν χρειάζεται, χρειάζεστε μια αυτο-διαφορετική λύση αντί για ένα απλό κλείσιμο. Βλέπετε έναν πραγματικό ιδιώτη μεσίτη για μια ροή υψηλής ευκρίνειας και ορίζετε στοιχήματα εφαρμογής σε μια δυναμική επικάλυψη στην οθόνη σας.

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

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

Σήμερα, μπορούμε να παίξουμε κουλοχέρηδες σε ιστοσελίδες χωρίς να εξερευνήσουμε τις παραδοσιακές δομές γραμμών πληρωμής. Σε ορισμένες περιπτώσεις, θα πρέπει να στοιχηματίσετε το μέγιστο ποσό χρυσών νομισμάτων για κάθε γραμμή για να διεκδικήσετε το τζάκποτ σας, οπότε φροντίστε να διαβάσετε τα αποτελέσματα και τους κανονισμούς όταν παίζετε μια online θέση. Σήμερα, αντί να έχετε μία ή τρεις πλευρικές σειρές ως νικηφόρα περιγράμματα, μπορείτε να επιλέξετε να παίξετε για δεκάδες, στην πραγματικότητα μια μεγάλη ποικιλία γραμμών πληρωμής ταυτόχρονα. Το παιχνίδι πρωταγωνιστεί στο κινητό σας, χρησιμοποιώντας την μοναδική αιτία της οθόνης αφής σας για να τοποθετήσετε σύντομα και εύκολα στοιχήματα. Κάθε μία από αυτές τις ιστοσελίδες κουλοχέρηδων προσφέρει επίσης παιχνίδια καζίνο για κινητά τηλέφωνα και συσκευές tablet, που διαθέτουν κουλοχέρηδες για κινητά για iPhone, iPad, Android, συσκευές BlackBerry και πολλά άλλα.

casino 440 no deposit bonus

Επομένως, συνεχίστε να διατηρείτε το όραμά σας για ολοκαίνουργια μπόνους online καζίνο με πραγματικά χρήματα σε αυτούς τους ιστότοπους. Αυτού του είδους οι προσφορές είναι ένας πολύ καλός τρόπος για να σας βοηθήσουν να πουλήσετε το δικό σας κεφάλαιο και να δοκιμάσετε τα νεότερα online κουλοχέρηδες αντί να ξοδέψετε πολλά. Θέλουμε να απολαύσετε όλα αυτά τα παιχνίδια εδώ, τουλάχιστον χρησιμοποιώντας ένα καλό VPN. Το περισσότερο δεν σημαίνει πολλά για τους πελάτες μας αν δεν μπορούν πραγματικά να αποκτήσουν αυτά τα παιχνίδια εκτός Αυστραλίας. Τα πρόσθετα μπόνους, όπως wilds, respins, bonus cycles και πολλά άλλα, είναι τα στοιχεία που κάνουν αυτά τα παιχνίδια να ξεχωρίζουν.

Μόλις αναφέρουμε «καλύτερα πληρώνοντας», εννοούμε ένα online καζίνο με πραγματικό εισόδημα που σας βοηθά να διατηρήσετε περισσότερα από τα χρήματά σας όλα αυτά τα χρόνια. Ένα εκπαιδευμένο online καζίνο με πραγματικό εισόδημα στην Αυστραλία λύνει ένα πρόβλημα με μειωμένα κέρδη, δίκαιη ορολογία μπόνους και σας προσφέρει κουλοχέρηδες με πραγματικό εισόδημα που αξίζει να δοκιμάσετε. Αυτό σημαίνει ότι τα έπαθλα μπορούν να φτάσουν τα 10 δολάρια μακριά από μεγάλα ποσά, ακόμα κι αν οι Αυστραλοί δεν έχουν πρόσβαση σε τέτοιου είδους κουλοχέρηδες με μεγάλο τζάκποτ λόγω των νόμων και κανονισμών. Εάν θέλετε να παίξετε σε μια ξένη εταιρεία τυχερών παιχνιδιών, σας προτείνουμε να χρησιμοποιήσετε ένα αξιόπιστο VPN (ψηφιακός ιδιωτικός κύκλος) για να έχετε ένα επιπλέον επίπεδο ασφάλειας στο διαδίκτυο. Σύμφωνα με αυστηρούς κανόνες που ορίζονται από τη νομοθεσία τους για τα στοιχήματα, οι ξένες εταιρείες τυχερών παιχνιδιών προσπαθούν να διασφαλίσουν την προστασία των χρηστών και την ισότητα των παιχνιδιών και προσφέρουν προσιτές επιλογές ποσοστού και μια σειρά από νομισματικές βάσεις. Εάν δεν θέλετε να το κάνετε αμέσως, εάν επιλέξετε να κάνετε μια καλή κατάθεση χρημάτων, θα μπορούσατε να επωφεληθείτε από ορισμένα εξαιρετικά κίνητρα καλωσορίσματος που προσφέρονται.

Οι Αυστραλοί προγραμματιστές είναι γνωστοί για το εύκολο παιχνίδι, τις υψηλότερες προοπτικές πληρωμής και τα καινοτόμα χαρακτηριστικά που σας δίνουν τη δυνατότητα να συνεχίσετε οτιδήποτε συναρπαστικό. Διαθέτει μεγαλύτερα γραφικά, μεγάλη μεταβλητότητα και πολλά ακόμη κέρδη. Το Gonzo's Trip Megaways, από το NetEnt/Red-colored Tiger, θα σας δώσει μια φιλική προς τους μαθητές αίσθηση με γνωστούς τεχνικούς και μια ζωντανή ανατροπή.

Κουλοχέρηδες με υψηλό RTP

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

free online casino games 7700

Με πολλά πρότυπα, λογαριασμούς μεταβλητότητας, παραγωγικότητα και χαρακτηριστικά, τα pokies προσφέρουν ιδιαίτερα ποικίλα είδη, προσφορές και πολλά γραφικά που επιτρέπουν μια πιο προσαρμοσμένη εμπειρία παιχνιδιού. Οι online αυστραλιανές εταιρείες τυχερών παιχνιδιών προσφέρουν μια μεγάλη ποικιλία μπόνους καζίνο για να βελτιώσετε τα καζίνο σας. Λάβετε υπόψη ότι μπορεί να μην είναι ένα συγκεκριμένο στοιχείο, αλλά είναι πολύ σοφή η απόφαση για το πόσο συχνά πληρώνουν τα νέα παιχνίδια. Ωστόσο, δεν είναι, συγκεκριμένες ομάδες απόδοσης pokies θα πληρώσουν ή οποιοιδήποτε άλλοι μηχανισμοί αυτοκινήτων που έχουν μη σταθερές γραμμές πληρωμής, απαιτώντας βήμα 3, 4 ή περισσότερα σημάδια για να κερδίσετε. Οι κατασκευαστές pokies όπως η BGaming και η Playtech διεξάγουν ολοκληρωμένη αξιολόγηση για να καθορίσουν την απόδοση long-identity ενός παιχνιδιού, που ονομάζεται RTP, η οποία είναι ένα βασικό μέγεθος για όλα τα online pokies με πραγματικά χρήματα. Μπορεί να κατηγοριοποιηθεί και να υποκατηγοριοποιηθεί με βάση ορισμένες μετρήσεις, όπως η έκθεση, τα κέρδη και η συχνότητα νίκης.

Posts Recentes

Διαδικτυακά Pokies στην Αυστραλία – Ο καλύτερος κατάλογος Pokies με πραγματικά χρήματα για το 2026

Ξεκινήστε με γρήγορα στοιχήματα και ορίστε ένα συγκεκριμένο όριο για το τι σας βολεύει να πληρώνετε. Δείτε τις εταιρείες τυχερών παιχνιδιών που αναφέρονται στις καλύτερες

LEIA MAIS »