: 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
mid = self._stylesData[id].mid;
self.select.update(mid, self.getStyleVal(mid), self);
for (let rangeField in ranges) {
let type = rangeField === 'hue' ? 'angle' : 'range',
fid = id + '_' + rangeField;
self[type].update(fid, self.getStyleVal(fid), self);
const sel = data.selector,
ranges = this._getFields(),
f = createDocumentFragment(),
ul = createElement('ul', 'tb_seperate_items tb_filters_fields'),
for (let rangeField in ranges) {
let rField = ranges[rangeField],
li = createElement('li');
rField.id = data.id + '_' + rangeField;
rField.class = 'tb_filters_field';
rField.type = rangeField === 'hue' ? 'angle' : 'range';
li.appendChild(self.create([rField]));
const help = createElement('','tb_help tf_rel'),
helpContent = createElement('', 'tb_help_content tf_hide tf_box'),
icon = createElement('i',{class:'icon',tabindex:-1});
helpContent.innerHTML = i18n[text] || text;
icon.appendChild(api.Helper.getIcon('ti-help'));
help.append(icon, helpContent);
return createElement('span', 'tb_tooltip_up',i18n[text] || text);
const d = createElement('small');
d.innerHTML = i18n[text] || text;
const afterElem = createElement('span','tb_input_after',i18n[data.after] || data.after);
if ((data.label === undefined || data.label === '')
&& (data.help !== undefined && data.help !== '')) {
afterElem.appendChild(this.help(data.help));
self.checkbox.update(id, self.getStyleVal(id), self);
_controlChange(el, args) {
el.tfOn('change', function () {
this.value = this.checked === true ? args.on.name : (args.off?.name || '');
if ('visibility' === ThemifyConstructor.clicked && null !== api.activeModel) {
api.activeModel.visibilityLabel();
let clone = api.Helper.cloneObject(data),
label = createElement('','switch_label'),
v = self.getStyleVal(data.id);
if (clone.class === undefined) {
clone.class = 'toggle_switch';
clone.class += ' toggle_switch';
let options = clone.options;
if (options === undefined || options === 'simple') {
if (options === 'simple') {
if (clone.default === 'on') {
v = state === 'on' ? (options.on.name ?? '') : (options.off?.name ?? '');
state = options.on.name === v ? 'on' : 'off';
let val=options[i].value;
if (clone.after === undefined && val !== undefined) {
label.dataset[i] = i18n[val]?? val;
const k = Object.keys(options)[0];
clone.options = [options[k]];
clone.wrap_checkbox??= '';
clone.wrap_checkbox += ' tb_switcher';
const checkBox = self.checkboxGenerate('checkbox', clone),
sw = checkBox.querySelector('.toggle_switch');
sw.checked = state === 'on';
this._controlChange(sw, orig);
sw.parentNode.appendChild(label);
self._initControl(sw, data);
self.width.update(id, v, self);
/* explicit FALSE means to hide the option */
if ( ! minid && false !== minid ) {
if ( ! maxid && false !== maxid ) {
return self.width.render(data, self, minid, maxid, units);
self.range.update(id, v, self);
render(data, self, minId, maxId, units) {
wrapClass = 'tb_wrap_' + prop + '_field';
label: prop === 'width' ? 'w' : 'ht',
id: id + '_auto_' + prop,
{value: prop === 'width' ? 'a_wd' : 'a_ht', name: 'auto'}
checked: {hide: wrapClass},
not_checked: {show: wrapClass}
label: prop === 'width' ? 'mi_wd' : 'm_ht',
label: prop === 'width' ? 'ma_wd' : 'mx_ht',
const range = v.split('/'),
inputs = self.getEl(id).closest('.tb_aspect_ratio').tfClass('tb_range');
self.hidden.update(id, v, self);
inputs[0].value = inputs[0].classList.contains('tb_aspect_to') ? to : from;
inputs[1].value = inputs[1].classList.contains('tb_aspect_to') ? to : from;
const v = self.getStyleVal(data.id) || '',
wrap_class: 'tb_aspect_ratio',
fields = self.create([opt]),
hidden = fields.querySelector('#' + data.id);
for (let inputs = fields.querySelectorAll('.tb_lb_option'), i = inputs.length - 1; i > -1; --i) {
if (inputs[i] !== hidden) {
inputs[i].tfOn('keyup', e => {
const el = e.currentTarget;
requestAnimationFrame(() => {
index = el.classList.contains('tb_aspect_to') ? 1 : 0,
nextIndex = index === 1 ? 0 : 1;
hidden.value = oldV.join('/');
Themify.triggerEvent(hidden, 'change');
self.range.update(id, v, self);
self.range.update(id, v, self);
render(data, self, units) {
const res = self.create([{
wrap_class: data.wrap_class,
description: data.description,
if (data.prop === 'font-size') {
self.range.update(id, v, self);
const units = data.units || {
res = self.fontSize.render(data, self, units);
self.range.update(id, v, self);
const units = data.units || {
res = self.fontSize.render(data, self, units);
const id2 = self._stylesData[id].id2;
self.radio.update(id, v, self);
self.radio.update(id2, self.getStyleVal(id2), self);
const selector = data.selector,
wrap_class: 'tb_multi_fonts',
id: data.id + '_regular',
options: self.getOptions('font_style'),
options: self.getOptions('font_weight'),
self.select.update(id, v, self);
for (let sides = ['top', 'right', 'bottom', 'left'], i = sides.length - 1; i > -1; --i) {
let sid = id + '_' + sides[i],
self.range.update(sid, self.getStyleVal(sid), self);
self.checkbox.update(autoId, self.getStyleVal(autoId), self);
const {id,selector,prop} = data,