: 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
getTerms(nextsearch, val);
nextsearch.tfOn('input', function () {
getTerms(nextsearch, val, this.value.trim(), true);
Themify.triggerEvent(this, 'queryPosts', {val: this.dataset.value});
nextsearch.tfClass('query_category_multiple')[0].value = val;
Themify.triggerEvent(this, 'queryPosts', {val: val});
v =data.default_post_type || 'post';
update(search, v, formatData(_this._cacheTypes));
Themify.triggerEvent(search, 'selectElement', {val: v});
if (_this._cacheTypes === null) {
get(search.parentNode, null, 'post_types').then(res => {
if (data.just_current === true && undefined == v) {
setTimeout(callback, 10);
} else if (is_term && !data.id && data.taxonomy !== undefined) {
getTerms(search, data.taxonomy);
search.tfOn('input', function () {
getTerms(search, data.taxonomy, this.value.trim(), true);
if (_data.query_filter) {
let selfVals=self.values,
query_filter = self.create([
wrap_class: 'tb_query_filter' + (selfVals.query_date_from || selfVals.query_date_to ? '' : ' tf_hide')
wrap_class: 'tb_query_filter' + (selfVals.query_authors ? '' : ' tf_hide'),
dataset: 'custom_fields',
'NOT EXISTS': 'NOT EXISTS',
wrap_class: 'tb_query_filter' + (selfVals.query_cf_key ? '' : ' tf_hide')
fr.appendChild(query_filter);
let hide_add_new = selfVals.query_cf_key && selfVals.query_authors && (selfVals.query_date_from || selfVals.query_date_to); /* if all advanced query fields have value, don't need to show the Add New button */
let tb_field = createElement('','tb_field'),
plusWrap = createElement('','tb_input tf_rel'),
plus = createElement('',{class:'tb_ui_dropdown_label tb_sort_fields_plus tf_plus_icon',tabindex:-1}),
ul = createElement('ul','tf_scrollbar');
if (!selfVals.query_date_from && !selfVals.query_date_to) {
ul.appendChild(createElement('li',{'data-id':'query_date'},i18n.dateq));
if (!selfVals.query_authors) {
ul.appendChild(createElement('li',{'data-id':'query_authors'},i18n.auhrq));
if (!selfVals.query_cf_key) {
ul.appendChild(createElement('li',{'data-id':'query_cf'},i18n.custq));
plus.appendChild(createElement('span','',i18n.addqf));
tb_field.append(createElement('','tb_label tb_empty_label'), plusWrap);
plusWrap.append(plus, ul);
fr.appendChild(tb_field);
ul.tfOn(_CLICK_, function (e) {
if (e.target.tagName === 'LI') {
let id = e.target.dataset.id;
this.closest('.tb_field[data-type="query_posts"], .tb_field[data-type="advanced_posts_query"]').querySelector('.' + id).classList.remove('tf_hide');
e.target.style.display = 'none';
e.target.removeAttribute('data-id');
if (!this.querySelector('[data-id]')) {
tb_field.classList.add('tf_hide');
tmp_el.parentNode.replaceChild(fr, tmp_el);
wrap_class: 'tb_disable_dc',
const input = self.getEl(id) || api.LightBox.el.querySelector('[data-input-id="' + id + '"]');
const wrap = input.closest('.tb_position_box_wrapper'),
handler = wrap.tfClass('tb_position_box_handle')[0],
label = wrap.tfClass('tb_position_box_label')[0],
positions = this._getPreDefinedPositions();
} else if (positions[v] !== undefined) {
label.textContent = this._getLabel(v);
handler.style.left = Math.ceil((v[0] * this.w) / 100) + 'px';
handler.style.top = Math.ceil((v[1] * this.h) / 100) + 'px';
{top,left,center,right,bottom} = i18n;
pos = top + ' ' + center;
pos = center + ' ' + left;
pos = center + ' ' + center;
pos = center + ' ' + right;
pos = bottom + ' ' + left;
pos = bottom + ' ' + center;
pos = bottom + ' ' + right;
const values = val.split(',');
pos = values[0] === '' ? 'Center Center' : 'X:' + values[0] + '% Y:' + values[1] + '%';
_getPreDefinedPositions() {
'right-center': '100,50',
'right-bottom': '100,100',
'center-center': '50,50',
'center-bottom': '50,100'
el = e.currentTarget.previousElementSibling,
item = e.target.closest('.tb_position_item');
const pos = item.dataset.pos.split(',');
} else if (left === '100') {
} else if (top === '100') {
el.style.left = left + 'px';
el.style.top = top + 'px';
this._changeUpdate(el, left, top);
_changeUpdate(helper, left, top) {
const l = +((left / this.w) * 100).toFixed(2),
t = +((top / this.h) * 100).toFixed(2),
label = helper.closest('.tb_position_box_wrapper').tfClass('tb_position_box_label')[0],
input = label.nextElementSibling;
input.value = l + ',' + t;
label.textContent = this._getLabel(l + ',' + t);
Themify.triggerEvent(input, 'change');
positions = this._getPreDefinedPositions(),
v = self.getStyleVal(data.id),
wrapper = createElement('','tb_position_box_wrapper'),
boxWrap = createElement('','tb_position_box_container tf_rel tf_inline_b'),
box = createElement('', 'tb_position_box tf_rel'),
handler = createElement('','tb_position_box_handle'),
input = self.hidden.render(data, self);
for (let i in positions) {
let pos = createElement('',{class: 'tb_position_item','data-pos':positions[i]}),
tooltip = createElement('span','themify_tooltip'),
vals = positions[i].split(',');
pos.style.left = vals[0] + '%';
pos.style.top = vals[1] + '%';
tooltip.appendChild(createElement('span','',this._getLabel(positions[i])));
pos.appendChild(tooltip);
handler.tfOn('pointerdown', function (e) {
e.stopImmediatePropagation();
dragX = this.offsetLeft - e.clientX,
dragY = this.offsetTop - e.clientY,
topBodyCl.add('tb_start_animate');
e.stopImmediatePropagation();
cancelAnimationFrame(timer);
timer = requestAnimationFrame(() => {
let clientX = dragX + e.clientX,
clientY = dragY + e.clientY;
} else if (clientX < 0) {
} else if (clientY < 0) {
el.style.left = clientX + 'px';
el.style.top = clientY + 'px';
_this._changeUpdate(el, clientX, clientY);
e.stopImmediatePropagation();
cancelAnimationFrame(timer);
this.tfOff('pointermove', _startDrag, {passive: true, once: true})
.tfOff('pointermove', _move, {passive: true})
.tfOff('lostpointercapture pointerup', _up, {passive: true, once: true});
topBodyCl.remove('tb_start_animate');
this.tfOn('lostpointercapture pointerup', _up, {passive: true, once: true})
.tfOn('pointermove', _startDrag, {passive: true, once: true})
.tfOn('pointermove', _move, {passive: true})
.setPointerCapture(e.pointerId);
boxWrap.append(handler, box);
wrapper.appendChild(boxWrap);
if (data.after !== undefined) {
wrapper.appendChild(self.after(data));
wrapper.append(createElement('', 'tb_position_box_label'), input);
self.afterRun.push(() => {
const css = getComputedStyle(box);
_this.w = parseInt(css.getPropertyValue('width'));
_this.h = parseInt(css.getPropertyValue('height'));
_this.update(data.id, v, self);
if (data.prop === 'background-position') {
data.wrap_class??= 'tb_group_element_image tb_image_options';
self.range.update(id,v,self);
this.updateSlider(id,self);
const range=self.getEl(id),
container=range.closest('.tb_slider_container'),
wr=container.tfClass('tb_slider_wrapper')[0],
output=wr.tfTag('output')[0].dataset,
select=container.tfTag('select')[0],
dataset=select[select.selectedIndex].dataset,
slider=wr.querySelector('input[type="range"]'),
min=parseFloat(dataset.min),
max=parseFloat(dataset.max),
output.unit = select.value;
slider.step = dataset.increment;
wrSt.setProperty('--tb_slider_min', min);
wrSt.setProperty('--tb_slider_before', v);
wrSt.setProperty('--tb_slider_max', max);
const container = createElement('','tb_slider_container tf_w'),
wrapper = createElement('',{class:'tb_slider_wrapper tf_rel tf_w',tabindex:'-1'}),
up = createElement('input'),
low = createElement('input'),
outputUp = createElement('output','tb_slider_output tb_slider_output_high'),
outputLow = createElement('output','tb_slider_output'),
fr = createDocumentFragment();
st = '--tb_slider_before:',
event=self.clicked==='styling'?'keyup':'change';
if (data.options !== undefined) {
if (data.options.min !== undefined) {
if (data.options.max !== undefined) {
if (data.options.unit !== undefined) {
if (data.options.range !== undefined) {
if (data.options.default !== undefined) {
def = data.options.default;
if (data.options.step !== undefined) {
step = data.options.step;
inputRange = !!data.options.inputRange;
wrapper.append(up, outputUp);
input = self.hidden.render(data, self);
wrapper.appendChild(input);
const clone = api.Helper.cloneObject(data),
Object.assign(clone, options);
clone.class = clone.options = '';
clone.increment = clone.step;
const rangeWrap = self.range.render(clone, self).querySelector('.tb_range_input'),
selectUnit=rangeWrap.querySelector('select');
inputRange=rangeWrap.querySelector('.tb_range');
val=inputRange.tfOn(event, e => {
up.value = e.currentTarget.value;
Themify.triggerEvent(up, 'input');
}, {passive: true}).value;
dataset=selectUnit[selectUnit.selectedIndex].dataset;
u=selectUnit.tfOn('change',()=>{
this.updateSlider(id,self);
fr.appendChild(rangeWrap);
up.type = low.type = 'range';
up.step = low.step = step;