/*! elementor - v3.28.0 - 01-04-2025 */
/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "../assets/dev/js/editor/components/dynamic-tags/control-behavior.js":
/*!***************************************************************************!*\
!*** ../assets/dev/js/editor/components/dynamic-tags/control-behavior.js ***!
\***************************************************************************/
/***/ ((module, __unused_webpack_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");
var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../node_modules/@babel/runtime/helpers/defineProperty.js"));
var TagPanelView = __webpack_require__(/*! elementor-dynamic-tags/tag-panel-view */ "../assets/dev/js/editor/components/dynamic-tags/tag-panel-view.js");
module.exports = Marionette.Behavior.extend({
tagView: null,
listenerAttached: false,
initialize: function initialize() {
if (!this.listenerAttached) {
this.listenTo(this.view.options.container.settings, 'change:external:__dynamic__', this.onAfterExternalChange);
this.listenerAttached = true;
}
},
shouldRenderTools: function shouldRenderTools() {
var hasDefault = this.getOption('dynamicSettings').default;
if (hasDefault) {
return false;
}
var isFeatureAvailableToUser = elementor.helpers.hasPro() && !elementor.helpers.hasProAndNotConnected(),
hasTags = this.getOption('tags').length > 0;
return !isFeatureAvailableToUser || hasTags;
},
renderTools: function renderTools() {
var _this = this;
if (!this.shouldRenderTools()) {
return;
}
var $dynamicSwitcher = jQuery(Marionette.Renderer.render('#tmpl-elementor-control-dynamic-switcher'));
$dynamicSwitcher.on('click', function (event) {
return _this.onDynamicSwitcherClick(event);
});
this.$el.find('.elementor-control-dynamic-switcher-wrapper').append($dynamicSwitcher);
this.ui.dynamicSwitcher = $dynamicSwitcher;
if ('color' === this.view.model.get('type')) {
if (this.view.colorPicker) {
this.moveDynamicSwitcherToColorPicker();
} else {
setTimeout(function () {
return _this.moveDynamicSwitcherToColorPicker();
});
}
}
// Add a Tipsy Tooltip to the Dynamic Switcher
this.ui.dynamicSwitcher.tipsy({
title: function title() {
return this.getAttribute('data-tooltip');
},
gravity: 's'
});
},
moveDynamicSwitcherToColorPicker: function moveDynamicSwitcherToColorPicker() {
var $colorPickerToolsContainer = this.view.colorPicker.$pickerToolsContainer;
this.ui.dynamicSwitcher.removeClass('elementor-control-unit-1').addClass('e-control-tool');
var $eyedropper = $colorPickerToolsContainer.find('.elementor-control-element-color-picker');
if ($eyedropper.length) {
this.ui.dynamicSwitcher.insertBefore($eyedropper);
} else {
$colorPickerToolsContainer.append(this.ui.dynamicSwitcher);
}
},
toggleDynamicClass: function toggleDynamicClass() {
this.$el.toggleClass('elementor-control-dynamic-value', this.isDynamicMode());
},
isDynamicMode: function isDynamicMode() {
var dynamicSettings = this.view.container.settings.get('__dynamic__');
return !!(dynamicSettings && dynamicSettings[this.view.model.get('name')]);
},
createTagsList: function createTagsList() {
var tags = _.groupBy(this.getOption('tags'), 'group'),
groups = elementor.dynamicTags.getConfig('groups'),
$tagsList = this.ui.tagsList = jQuery('<div>', {
class: 'elementor-tags-list'
}),
$tagsListInner = jQuery('<div>', {
class: 'elementor-tags-list__inner'
});
$tagsList.append($tagsListInner);
jQuery.each(groups, function (groupName) {
var groupTags = tags[groupName];
if (!groupTags) {
return;
}
var group = this,
$groupTitle = jQuery('<div>', {
class: 'elementor-tags-list__group-title'
}).text(group.title);
$tagsListInner.append($groupTitle);
groupTags.forEach(function (tag) {
var $tag = jQuery('<div>', {
class: 'elementor-tags-list__item'
});
$tag.text(tag.title).attr('data-tag-name', tag.name);
$tagsListInner.append($tag);
});
});
// Create and inject pro dynamic teaser template if Pro is not installed
if (!elementor.helpers.hasPro() && Object.keys(tags).length) {
var proTeaser = Marionette.Renderer.render('#tmpl-elementor-dynamic-tags-promo', {
promotionUrl: elementor.config.dynamicPromotionURL.replace('%s', this.view.model.get('name'))
});
$tagsListInner.append(proTeaser);
}
$tagsListInner.on('click', '.elementor-tags-list__item', this.onTagsListItemClick.bind(this));
elementorCommon.elements.$body.append($tagsList);
},
getTagsList: function getTagsList() {
if (!this.ui.tagsList) {
this.createTagsList();
}
return this.ui.tagsList;
},
toggleTagsList: function toggleTagsList() {
var $tagsList = this.getTagsList();
if ($tagsList.is(':visible')) {
$tagsList.hide();
return;
}
var direction = elementorCommon.config.isRTL ? 'left' : 'right';
$tagsList.show().position({
my: "".concat(direction, " top"),
at: "".concat(direction, " bottom+5"),
of: this.ui.dynamicSwitcher
});
},
setTagView: function setTagView(id, name, settings) {
if (this.tagView) {
this.tagView.destroy();
}
var tagView = this.tagView = new TagPanelView({
id: id,
name: name,
settings: settings,
controlName: this.view.model.get('name'),
dynamicSettings: this.getOption('dynamicSettings')
}),
elementContainer = this.view.options.container,
tagViewLabel = elementContainer.controls[tagView.options.controlName].label;
tagView.options.container = new elementorModules.editor.Container({
type: 'dynamic',
id: id,
model: tagView.model,
settings: tagView.model,
view: tagView,
parent: elementContainer,
label: elementContainer.label + ' ' + tagViewLabel,
controls: tagView.model.options.controls,
renderer: elementContainer
});
tagView.render();
this.$el.find('.elementor-control-tag-area').after(tagView.el);
this.listenTo(tagView, 'remove', this.onTagViewRemove.bind(this));
},
setDefaultTagView: function setDefaultTagView() {
var tagData = elementor.dynamicTags.tagTextToTagData(this.getDynamicValue());
this.setTagView(tagData.id, tagData.name, tagData.settings);
},
tagViewToTagText: function tagViewToTagText() {
var tagView = this.tagView;
return elementor.dynamicTags.tagDataToTagText(tagView.getOption('id'), tagView.getOption('name'), tagView.model);
},
getDynamicValue: function getDynamicValue() {
return this.view.container.dynamic.get(this.view.model.get('name'));
},
destroyTagView: function destroyTagView() {
if (this.tagView) {
this.tagView.destroy();
this.tagView = null;
}
},
showPromotion: function showPromotion() {
var hasProAndNotConnected = elementor.helpers.hasProAndNotConnected(),
dialogOptions = {
title: __('Dynamic Content', 'elementor'),
content: __('Create more personalized and dynamic sites by populating data from various sources with dozens of dynamic tags to choose from.', 'elementor'),
targetElement: this.ui.dynamicSwitcher,
position: {
blockStart: '-10'
},
actionButton: {
url: hasProAndNotConnected ? elementorProEditorConfig.urls.connect : elementor.config.dynamicPromotionURL.replace('%s', this.view.model.get('name')),
text: hasProAndNotConnected ? __('Connect & Activate', 'elementor') : __('Upgrade', 'elementor')
}
};
elementor.promotion.showDialog(dialogOptions);
},
onRender: function onRender() {
this.$el.addClass('elementor-control-dynamic');
this.renderTools();
this.toggleDynamicClass();
if (this.isDynamicMode()) {
this.setDefaultTagView();
}
},
onDynamicSwitcherClick: function onDynamicSwitcherClick(event) {
event.stopPropagation();
if (this.getOption('tags').length) {
this.toggleTagsList();
} else {
this.showPromotion();
}
},
onTagsListItemClick: function onTagsListItemClick(event) {
var $tag = jQuery(event.currentTarget);
this.setTagView(elementorCommon.helpers.getUniqueId(), $tag.data('tagName'), {});
// If an element has an active global value, disable it before applying the dynamic value.
if (this.view.getGlobalKey()) {
this.view.triggerMethod('unset:global:value');
}
if (this.isDynamicMode()) {
$e.run('document/dynamic/settings', {
container: this.view.options.container,
settings: (0, _defineProperty2.default)({}, this.view.model.get('name'), this.tagViewToTagText())
});
} else {
$e.run('document/dynamic/enable', {
container: this.view.options.container,
settings: (0, _defineProperty2.default)({}, this.view.model.get('name'), this.tagViewToTagText())
});
}
this.toggleDynamicClass();
this.toggleTagsList();
if (this.tagView.getTagConfig().settings_required) {
this.tagView.showSettingsPopup();
}
},
onTagViewRemove: function onTagViewRemove() {
$e.run('document/dynamic/disable', {
container: this.view.options.container,
settings: (0, _defineProperty2.default)({}, this.view.model.get('name'), this.tagViewToTagText())
});
this.toggleDynamicClass();
},
onAfterExternalChange: function onAfterExternalChange() {
this.destroyTagView();
if (this.isDynamicMode()) {
this.setDefaultTagView();
}
this.toggleDynamicClass();
},
onDestroy: function onDestroy() {
this.destroyTagView();
if (this.ui.tagsList) {
this.ui.tagsList.remove();
}
}
});
/***/ }),
/***/ "../assets/dev/js/editor/components/dynamic-tags/tag-controls-stack-empty.js":
/*!***********************************************************************************!*\
!*** ../assets/dev/js/editor/components/dynamic-tags/tag-controls-stack-empty.js ***!
\***********************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = Marionette.ItemView.extend({
className: 'elementor-tag-controls-stack-empty',
template: '#tmpl-elementor-tag-controls-stack-empty'
});
/***/ }),
/***/ "../assets/dev/js/editor/components/dynamic-tags/tag-controls-stack.js":
/*!*****************************************************************************!*\
!*** ../assets/dev/js/editor/components/dynamic-tags/tag-controls-stack.js ***!
\*****************************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
var EmptyView = __webpack_require__(/*! elementor-dynamic-tags/tag-controls-stack-empty */ "../assets/dev/js/editor/components/dynamic-tags/tag-controls-stack-empty.js");
module.exports = elementorModules.editor.views.ControlsStack.extend({
activeTab: 'content',
template: _.noop,
emptyView: EmptyView,
isEmpty: function isEmpty() {
// Ignore the section control
return this.collection.length < 2;
},
childViewOptions: function childViewOptions() {
return {
container: this.options.container
};
},
getNamespaceArray: function getNamespaceArray() {
var currentPageView = elementor.getPanelView().getCurrentPageView(),
eventNamespace = currentPageView.getNamespaceArray();
eventNamespace.push(currentPageView.activeSection);
eventNamespace.push(this.getOption('controlName'));
eventNamespace.push(this.getOption('name'));
return eventNamespace;
},
onRenderTemplate: function onRenderTemplate() {
this.activateFirstSection();
}
});
/***/ }),
/***/ "../assets/dev/js/editor/components/dynamic-tags/tag-panel-view.js":
/*!*************************************************************************!*\
!*** ../assets/dev/js/editor/components/dynamic-tags/tag-panel-view.js ***!
\*************************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
var TagControlsStack = __webpack_require__(/*! elementor-dynamic-tags/tag-controls-stack */ "../assets/dev/js/editor/components/dynamic-tags/tag-controls-stack.js");
module.exports = Marionette.ItemView.extend({
className: 'elementor-dynamic-cover e-input-style',
tagControlsStack: null,
templateHelpers: function templateHelpers() {
var helpers = {};
if (this.model) {
helpers.controls = this.model.options.controls;
}
return helpers;
},
ui: {
remove: '.elementor-dynamic-cover__remove'
},
events: function events() {
var events = {
'click @ui.remove': 'onRemoveClick'
};
if (this.hasSettings()) {
events.click = 'onClick';
}
return events;
},
getTemplate: function getTemplate() {
var config = this.getTagConfig(),
templateFunction = Marionette.TemplateCache.get('#tmpl-elementor-control-dynamic-cover'),
renderedTemplate = Marionette.Renderer.render(templateFunction, {
hasSettings: this.hasSettings(),
isRemovable: !this.getOption('dynamicSettings').default,
title: config.title,
content: config.panel_template
});
return Marionette.TemplateCache.prototype.compileTemplate(renderedTemplate.trim());
},
getTagConfig: function getTagConfig() {
return elementor.dynamicTags.getConfig('tags.' + this.getOption('name'));
},
initSettingsPopup: function initSettingsPopup() {
var settingsPopupOptions = {
className: 'elementor-tag-settings-popup',
position: {
my: 'left top+5',
at: 'left bottom',
of: this.$el,
autoRefresh: true
},
hide: {
ignore: '.select2-container'
}
};
var settingsPopup = elementorCommon.dialogsManager.createWidget('buttons', settingsPopupOptions);
this.getSettingsPopup = function () {
return settingsPopup;
};
},
hasSettings: function hasSettings() {
return !!Object.values(this.getTagConfig().controls).length;
},
showSettingsPopup: function showSettingsPopup() {
if (!this.tagControlsStack) {
this.initTagControlsStack();
}
var settingsPopup = this.getSettingsPopup();
if (settingsPopup.isVisible()) {
return;
}
settingsPopup.show();
},
initTagControlsStack: function initTagControlsStack() {
this.tagControlsStack = new TagControlsStack({
model: this.model,
controls: this.model.controls,
name: this.options.name,
controlName: this.options.controlName,
container: this.options.container,
el: this.getSettingsPopup().getElements('message')[0]
});
this.tagControlsStack.render();
},
initModel: function initModel() {
this.model = new elementorModules.editor.elements.models.BaseSettings(this.getOption('settings'), {
controls: this.getTagConfig().controls
});
},
initialize: function initialize() {
// The `model` should always be available.
this.initModel();
if (!this.hasSettings()) {
return;
}
this.initSettingsPopup();
this.listenTo(this.model, 'change', this.render);
},
onClick: function onClick() {
this.showSettingsPopup();
},
onRemoveClick: function onRemoveClick(event) {
event.stopPropagation();
this.destroy();
this.trigger('remove');
},
onDestroy: function onDestroy() {
if (this.hasSettings()) {
this.getSettingsPopup().destroy();
}
if (this.tagControlsStack) {
this.tagControlsStack.destroy();
}
}
});
/***/ }),
/***/ "../assets/dev/js/editor/components/validator/base.js":
/*!************************************************************!*\
!*** ../assets/dev/js/editor/components/validator