: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
data.help = 'custom_css_help';
const el = self.text.render(data, self);
api.activeModel.options(el.querySelector('#' + data.id), data.type);
required: {rule: 'custom_css_id', message: 'errorId'},
wrap_class : 'tb_disable_dc'
if (data.accordion !== false) {
wrap_class: 'tb_field_group_css'
el = self.create([inputArgs], self);
const input=el.querySelector('#custom_css_id');
if (self.component === 'row') {
api.activeModel.options(input, data.type);
const _this= e.currentTarget,
validate=api.Forms.getValidator('custom_css_id')(_this,api.activeModel.el),
errorText=validate===false? i18n.errorId:validate,
error1=_this.parentNode.tfClass('tb_field_error_msg')[0];
api.activeModel.el.id=_this.value;
_this.after(createElement('span','tb_field_error_msg',errorText));
error1.textContent=errorText;
const hidden = self.getEl(id);
let input = createElement('input'),
value = self.getStyleVal(data.id) ?? data.value??data.default??'';
if (value && typeof value === 'object') {
value = JSON.stringify(value);
if (self.is_repeat === true) {
input.className = self.is_sort === true ? 'tb_lb_sort_child' : 'tb_lb_option_child';
input.dataset.inputId = data.id;
input.className = 'tb_lb_option';
if (data.class !== undefined) {
input.className += ' ' + data.class;
return self._initControl(input, data);
data.options = self.getOptions('frame');
data.class = 'tb_frame tf_scrollbar';
not_empty: {show: ['tb_frame_multi_wrap', 'tb_frame_color']},
empty: {hide: ['tb_frame_multi_wrap', 'tb_frame_color']}
return self.layout.render(data, self);
data.control = {event: 'keyup', control_type: 'change', selector: '.module-title'};
return self.text.render(data, self);
const fr = createDocumentFragment(),
input = self.text.render(data, self),
link = createElement( 'button', { class : 'tb_add_link' },i18n.addl );
link.tfOn(_CLICK_, async function() {
if ( typeof TB_Link_Lightbox === 'undefined' ) {
await Themify.loadJs( Themify.builder_url+'js/editor/lazy-components/link-lightbox.js', );
wrap_class: ' tb_compact_radios',
permalink: {show: ['open_link','no_follow'], hide: 'custom_link'},
custom: {show: ['open_link','no_follow','custom_link'], hide: 'open_link'},
none: {hide: ['custom_link', 'open_link', 'no_follow']}
wrap_class: ' tb_compact_radios',
lightbox: {show: 'tb_t_m_lightbox'},
regular: {hide: 'tb_t_m_lightbox'},
newtab: {hide: 'tb_t_m_lightbox'}
wrap_class: 'tb_t_m_lightbox',
const btn = createElement('button',{type:'button',class:'builder_button',id:data.id},data.name);
if (data.class !== undefined) {
btn.className += ' ' + data.class;
return self._initControl(btn, data);
const el = self.text.render(data, self);
api.activeModel.options(el.querySelector('#' + data.id), data.type);
return createElement('',{id:data.id,class:'module-widget-form-container wp-core-ui tb_lb_option'});
const d = createDocumentFragment(),
filter = createElement('',{id:'available-widgets-filter',class:'tf_inline_b tf_vmiddle tf_rel'}),
loader = createElement('i','tb_loading_widgets tf_loader'),
search = createElement('input',{type:'text',id:'widgets-search',autocomplete:'off',placeholder:i18n.search_widget,'data-validation':'not_empty','data-error-msg':'widget_validate'}),
available = createElement('',{id:'available-widgets',class:'tf_scrollbar',tabindex:-1}),
select = createElement('',{id:data.id,class:'tb_lb_option tb_widget_select'}),
val = self.values[data.id],
select_widget = (item, instance_widget) => {
for (let i = all_items.length - 1; i > -1; --i) {
all_items[i].classList.remove('selected');
item.classList.add('selected');
const v = item.dataset.value;
search.value = item.tfClass('widget-title')[0].textContent;
available.style.display = 'none';
this._select(v, this._data[v].b, instance_widget, data);
for (let i in this._data) {
let w = createElement('',{class:'widget-tpl ' + this._data[i].b,'data-value':i}),
title = createElement('','widget-title');
title.appendChild(createElement('h3','',this._data[i].n));
w.tfOn(_CLICK_, function (e) {
self.settings[data.id] = this.dataset.value;
select_widget(this, null);
if (this._data[i].d !== undefined) {
let desc = createElement('','widget-description');
desc.innerHTML = this._data[i].d;
select_widget(w, self.values.instance_widget);
this._search(search, available);
filter.append(loader, search);
available.appendChild(select);
d.append(filter, available);
if (this._data === null) {
api.LocalFetch({action: 'tb_get_widget_items'}).then(data => {
api.Spinner.showLoader('error');
for (let i in themifyBuilder.widget_css) {
topThemify.loadCss(themifyBuilder.widget_css[i], null, themify_vars.wp);
themifyBuilder.widget_css = null;
_search(search, available) {
search.tfOn('focus', _this._show.bind(_this), {passive: true})
if (e.relatedTarget?.id !== 'available-widgets') {
available.style.display = 'none';
.tfOn('keyup', function () {
const val = this.value.trim(),
r = new RegExp(val, 'i'),
items = _this._el.tfClass('widget-tpl');
for (let i = 0; i < items.length; ++i) {
items[i].style.display = 'block';
let title = items[i].tfTag('h3')[0];
title = title.textContent || title.innerText;
items[i].style.display = r.test(title) ? '' : 'none';
//this.$el.next('.tb_field_error_msg').remove();
this._el.closest('#available-widgets').style.display = 'block';
_select(val, base, settings_instance, args) {
const instance = $('#instance_widget', api.LightBox.el),
const form = $(data.form);
instance.addClass('open').html(form.html());
for (let i in settings_instance) {
instance.find('[name="' + i + '"]').val(settings_instance[i]);
if (topWindow.wp.textWidgets) {
topWindow.wp.textWidgets.init();
delete topWindow.wp.textWidgets.widgetControls[settings_instance['widget-id']];
} else if (topWindow.wp.mediaWidgets) {
topWindow.wp.mediaWidgets.init();
delete topWindow.wp.mediaWidgets.widgetControls[settings_instance['widget-id']];
$(doc).trigger('widget-added', [instance]);
base === 'text' && ThemifyConstructor._initControl(instance.find('.wp-editor-area')[0], {control: {control_type: 'wp_editor', type: 'refresh'}});
const settings = api.Helper.cloneObject(args);
settings.id = instance[0].id;
instance.on('change', function () {
if (api.is_ajax_call === null) {
ThemifyConstructor.control.widget_select(this, settings);
ThemifyConstructor.control.widget_select(instance[0], settings);
instance.removeClass('tb_loading_widgets_form').find('select').wrap('<span class="tf_inline_b tf_vmiddle tf_rel"/>');
if (typeof data === 'object') {
const s = createElement('script');
doc.tfTag('script')[0].before(s);
recurisveLoader = (js, i) => {
Themify.loadJs(js[i].src, null, data.v).then(() => {
if (js[i].extra?.after) {
extra(js[i].extra.after);
i < len ? recurisveLoader(js, i) : initjJS();
if (!this._cache.has(base)) {
topBody.insertAdjacentHTML('beforeend', data.template);
body.insertAdjacentHTML('beforeend', data.template);
data.src.length > 0 ? recurisveLoader(data.src, 0) : initjJS();
instance.addClass('tb_loading_widgets_form').html('<div class="tf_loader"></div>');
// backward compatibility with how Widget module used to save data
for (let i in settings_instance) {
let old_pattern = i.match(/.*\[\d\]\[(.*)\]/);
if (old_pattern && old_pattern[1] !== undefined && Array.isArray(old_pattern)) {
delete settings_instance[ i ];
settings_instance[ old_pattern[1] ] = v;
action: 'module_widget_get_form',
tpl_loaded: this._cache.has(base) ? 1 : 0,
widget_instance: settings_instance
api.LocalFetch(ajaxData).then(data => {
this._cache.set(base, 1);
api.Spinner.showLoader('error');
const d = createElement('',data.class || '');
d.innerHTML = i18n[data.comment] || data.comment;
units: {deg: {max: 360}},
units: {'%': {max: 200}},
units: {'%': {max: 200}},
units: {'%': {max: 200}},
const ranges = this._getFields(),