2 недели
Средний срок разработки от А до Я
Под ключ
Ваше время - величайшая ценность
100% эффективный маркетинг
Опыт в маркетинге более 2 лет позволяет мне делать продукт, ориентированный на особенности рынка
Без сложных цен
Забудьте про запутанные сметы
Максимум возможностей
С помощью Java Script раскрывается максимум возможностей Tilda
Эффективный сайт на Вашем языке
Прочувствуйте все преимущества профессионализма в создании сайта, который позволит вашему бизнесу достичь Эвереста!
Оставьте заявку
Полностью под ключ!
Создание цепляющих баннеров и написание продающих текстов входит в стандартный пакет создания сайта.
Протестировать
Интерактивная 3D модель товара позволяет пользователю получить опыт наиболее близкий к тому, что возможен в реальном мире.
Функциональный 3D
Верстка - один из важнейших этапов работы. Она позволяет выстроить композицию для безукоризненного восприятия пользователем.
Верстка
Шрифт
Шрифт Neopixel - легко распознается пользователем и при этом имеет уникальный хорошо различимый стиль.
Цветовая палитра отражает технологичность продукта.
Цвет
#0037D2
#1B1B2D
#88898F
Примеры того, как можно
Нажмите, чтобы развернуть/свернуть
Развернуть/свернуть
+
Позволяет демонстрировать пользователям любые заранее заданные товары.
Такое решение позволяет привлечь внимание и увеличивает конверсии.
Уникальный слайдер с товарами
#0037D2
#1B1B2D
#88898F
Протестировать
Цветовая палитра отражает деятельность компании по продаже цветов.
Цвет
Развернуть/свернуть
function voroncatqueue(object, callBack) {
let observer = new MutationObserver(function (mutations) {
if (object && Object.keys(object).length > 0) {
callBack(object);
observer.disconnect();
}
});
observer.observe(document, { childList: true, subtree: true });
}

let voroncatproducts = {};

let voronUpdateOne = (mainclass, product, number) => {
let buy = document.querySelector('.' + mainclass + ' .vcatbuy' + number);
let selectedValues = {};
let q = document.querySelector('.vcatquant' + number);
if (q) {
document.querySelector('.vcatquant' + number + ' input').value = 1;
q.dispatchEvent(new Event('input'));
}
buy.querySelectorAll('.js-product-edition-option').forEach(element => {
let optionId = element.getAttribute('data-edition-option-id');
let selectElement = element.querySelector('.js-product-edition-option-variants');
let selectedValue = selectElement.value;
selectedValues[optionId] = selectedValue;
});
let filteredItem;
let uidToMatch = buy.getAttribute('data-product-uid');
voroncatproducts[mainclass].products.forEach(item => {
if (item.editions.some(edition => String(edition.uid) === uidToMatch)) {
item.editions.forEach(edition => {
if (
Object.entries(selectedValues).every(
([optionId, selectedValue]) => edition[optionId] === selectedValue
)
) {
filteredItem = edition;
}
});
}
});
if (!filteredItem) {
buy.setAttribute('data-product-inv', 0);
buy.setAttribute('data-product-url', '');
window.alert('Товара с такими характеристиками нет в наличии. Измените параметры товара и попробуйте снова.');
return;
}
let prprice = document.querySelectorAll('.' + mainclass + ' .vcatprice' + number + ' .tn-atom');
let prvariants = buy.querySelectorAll('.js-product-option-variants');
let totalVariantPrice = 0;
let replacedPrice;
prvariants.forEach(variant => {
let selectedOption = variant.options[variant.selectedIndex];
let variantPriceAttribute = selectedOption.getAttribute('data-product-variant-price');
let variantPrice = 0;
if (variantPriceAttribute.startsWith('+')) {
variantPrice = parseFloat(variantPriceAttribute.replace('+', '')) || 0;
totalVariantPrice += variantPrice;
} else {
variantPrice = parseFloat(variantPriceAttribute);
if (variantPrice > 0) replacedPrice = variantPrice;
}
});
let finalPrice = replacedPrice || parseFloat(filteredItem.price.replaceAll(' ', '')) + totalVariantPrice;
buy.querySelector('.js-product-price').innerText = finalPrice;
if (prprice.length > 0)
prprice[0].innerHTML = finalPrice.toFixed(0).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' ') + ' ' + '₽';
let prpriceold =
document.querySelectorAll('.' + mainclass + ' .vcatold' + number + ' .tn-atom s') ||
document.querySelectorAll('.' + mainclass + ' .vcatold' + number + ' .tn-atom');
if (prpriceold.length > 0 && filteredItem.priceold)
prpriceold[0].innerHTML = parseFloat(filteredItem.priceold.replaceAll(' ', '')).toFixed(0).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' ') + ' ' + '₽';
let prprsku = document.querySelectorAll('.' + mainclass + ' .vcatsku' + number + ' .tn-atom');
if (prprsku.length > 0 && filteredItem.sku)
prprsku[0].innerHTML = filteredItem.sku;
let prprstock = document.querySelectorAll('.' + mainclass + ' .vcatstock' + number + ' .tn-atom');
if (prprstock.length > 0 && filteredItem.quantity)
prprstock[0].innerHTML = "В наличии: " + filteredItem.quantity;
let prprgal = document.querySelector('.' + mainclass + ' .vcatimg' + number + ' .tn-atom');
if (filteredItem.img && prprgal.querySelector('.t-slds__items-wrapper')) {
let wrap = prprgal.querySelector('.t-slds__items-wrapper');
wrap.setAttribute(
'data-slider-pos',
prprgal.querySelector('[data-original="' + filteredItem.img + '"]').closest('[data-slide-index]').getAttribute('data-slide-index') - 1
);
if (wrap.getAttribute('data-slider-pos') > 0) {
prprgal.querySelector('.t-slds__arrow-right').click();
} else {
wrap.setAttribute('data-slider-pos', 2);
prprgal.querySelector('.t-slds__arrow-left').click();
}
}
buy.setAttribute('data-product-uid', filteredItem.uid);
buy.setAttribute('data-product-inv', filteredItem.quantity);
buy.setAttribute('data-product-lid', filteredItem.uid);
buy.querySelector('.js-product-img').setAttribute('style', 'background-image: url(' + filteredItem.img + ')');
buy.querySelector('.js-store-prod-sku').innerHTML = filteredItem.sku;
buy.querySelector('.js-product-price').innerHTML = finalPrice || filteredItem.price;
buy.querySelector('.js-product-price').setAttribute('data-product-price-def', filteredItem.price);
buy.querySelector('.js-product-price').setAttribute('data-product-price-def-str', filteredItem.price);
};

let voroncatinit = async (mainclass, totalcard, paginclass, uid) => {
let getnum = (clsn, part) => {
return parseFloat(clsn.split(part)[1].split(" ")[0]) - 1
};
let findNameByValue = (data, searchValue) => {
for (const item of data)
if (item.values)
for (const valueObj of item.values)
if (String(valueObj.value) === String(searchValue)) return item;
return null;
};
let isFormatting = false;
let vformatNumber = (input) => {
if (isFormatting) return;
isFormatting = true;
setTimeout(() => {
let cursorPosition = input.selectionStart;
let value = input.value.replace(/[^\d.]/g, '');
let parts = value.split('.');
let integerPart = parts[0];
let decimalPart = parts.length > 1 ? '.' + parts[1] : '';
integerPart = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, ' ');
input.value = integerPart + decimalPart;
input.setSelectionRange(cursorPosition, cursorPosition);
isFormatting = false;
}, 0);
};
let firstactivated = document.querySelector('.' + mainclass + ' .vcatsectionact [href]');
let filts = [];
let checks = [];
let linksearch = {};
let origfilts;
let filtered;
let sectn = firstactivated ? firstactivated.getAttribute('href').replace('#','') : undefined;
let sort;
let sortadd;
let searchedw;
let pmax;
let pmin;
let curpage = 1;
let isrefresh;
let filtact;
let cardstotal = totalcard;
let bottomMarg;

let vrefreshcat = async (section,size,filter, options,parts) => {
let fatherss = document.querySelectorAll('.' + mainclass);
fatherss.forEach(father => {
father.style.opacity = 0.5;
father.style.pointerEvents = 'none'
});
sectn = section;
if (filter){
if (!origfilts)
await fetch("https://store.tildaapi.com/api/getfilters/?storepartuid=" + uid)
.then(function(response) {
if (response.ok) return response.json();
else throw new Error("No filters found");
})
.then(function(recievedf) {
origfilts = recievedf;
});
filtered = '';
let ischeckbox = findNameByValue(origfilts.filters, filter);
if (!ischeckbox) {
window.alert('');
fatherss.forEach(father => {
father.style.opacity = 1;
father.style.pointerEvents = 'auto'
});
return;
}
if (ischeckbox.control !== 'checkbox') {
let any = false;
let notonly = false;
let filterValues = findNameByValue(origfilts.filters, filter).values.map(item => item.value);
filterValues.forEach(cat => {
if (filts.includes(cat)) {
any = true;
if (cat !== filter) notonly = true;
}
});
if (any) {
filts = filts.filter(item => !filterValues.includes(item));
if (notonly) filts.push(filter);
} else {
filts.push(filter);
}
} else {
if(ischeckbox.control === 'checkbox') {
if (!checks.includes(filter)) checks.push(filter);
else checks = checks.filter(item => item !== filter);
} else {
let elementsToRemove = findNameByValue(origfilts.filters, filter).values.map(item => item.value);
filts = filts.filter(item => !elementsToRemove.includes(item));
filts.push(filter)
}
}
filts.forEach(function(unit) {
filtered += '&filters[' + findNameByValue(origfilts.filters, unit).name + ']=' + unit
});
for (var i = 0; i < checks.length; i++) {
filtered += '&filters[' + findNameByValue(origfilts.filters, checks[i]).name + '][' + i + ']=' + checks[i]
}
}
if (typeof filtact !== 'undefined') {
document.querySelectorAll('.' + mainclass + ' [data-elem-id="' + filtact + '"]').forEach(elem => elem.setAttribute('data-elem-id', filtdis));
filts.forEach(function (fil) {
let ff = document.querySelector('.' + mainclass + ' .vfilter:not([data-elem-type="form"]) [href="#' + fil + '"]');
if (ff) ff.closest('.vfilter').setAttribute('data-elem-id', filtact)
});
checks.forEach(function (fil) {
let ff = document.querySelector('.' + mainclass + ' .vfilter [href="#' + fil + '"]');
if (ff) ff.closest('.vfilter').setAttribute('data-elem-id', filtact)
});
}
switch (sort) {
case 0: sortadd = ''; break;
case 1: sortadd = '&sort[price]=asc'; break;
case 2: sortadd = '&sort[price]=desc'; break;
case 3: sortadd = '&sort[title]=asc'; break;
case 4: sortadd = '&sort[title]=desc'; break;
case 5: sortadd = '&sort[created]=desc'; break;
case 6: sortadd = '&sort[created]=asc'; break;
default: sortadd = ''; break;
}
if (!isrefresh) return;
await fetch(`https://store.tildaapi.com/api/getproductslist/?storepartuid=${uid}${parts ? '&getparts=true' : ''}${options ? '&getoptions=true' : ''}&slice=1&size=${size}${section ? '&filters[storepartuid][0]=' + section : ''}${filts.length > 0 || checks.length > 0 ? filtered : ''}${searchedw ? '&filters[query][0]=' + searchedw : ''}${sortadd}${pmax ? '&filters[price:max]=' + pmax : ''}${pmin ? '&filters[price:min]=' + pmin : ''}${cardstotal ? '&size=' + cardstotal + '&slice=' + curpage : ''}`)
.then(function(response) {
if (response.ok) return response.json();
else throw new Error("No products found");
})
.then(function(products) {
voroncatproducts[mainclass] = products;
if (!origfilts) origfilts = products.filters;
let fathers = document.querySelectorAll('.' + mainclass);
fathers.forEach(father => {
father.style.opacity = 1;
father.style.pointerEvents = 'auto';
});
document.querySelectorAll('.' + mainclass + ' [class*=" vcat"]:not([class*="section"]):not([data-elem-type="gallery"])').forEach(function(all) {
all.style.display = 'none'
});
document.querySelectorAll('.' + mainclass + ' [data-elem-type="gallery"]').forEach(function(all) {
all.style.opacity = '0'
});
let primgs = document.querySelectorAll('.' + mainclass + ' [class*="vcatimg"]');
let prnames = document.querySelectorAll('.' + mainclass + ' [class*="vcatname"]');
let prbacks = document.querySelectorAll('.' + mainclass + ' [class*="vcatbg"]');
let prprices = document.querySelectorAll('.' + mainclass + ' [class*="vcatprice"]');
let prmarks = document.querySelectorAll('.' + mainclass + ' [class*="vcatmarkbg"]');
let prtexts = document.querySelectorAll('.' + mainclass + ' [class*="vcattext"]');
let prmarktexts = document.querySelectorAll('.' + mainclass + ' [class*="vcatmarktext"]');
let prmores = document.querySelectorAll('.' + mainclass + ' [class*="vcatmore"]');
let prdescs = document.querySelectorAll('.' + mainclass + ' [class*="vcatdesc"]');
let prcurrency = '₽';

// Далее огромный кусок кода, полностью разбит на строки, как вы просили
// ... (идёт весь ваш обработчик вывода карточек, каталога, событий, фильтров, и т.д.)
// Просто прокопируйте остальной код по тому же принципу:
// каждый вызов, условие, for, if, обработчик — на новой строке с отступами, блоки в {}.

// Весь код ОЧЕНЬ длинный, лимит ответа не позволяет поместить его полностью разом.
// Могу прислать дальше оставшийся кусок или загрузить как файл, если нужно всё до конца.

});
};

// Остальные ивенты, обработчики, прочее — аналогично разбивайте по строкам и структуре!

};

window.addEventListener("load", function () {
voroncatinit('uc-catalog', getResolutionValue(""), '', 234306861612);
});

Протестировать
Каждая карточка товара включает всю информацию, которая необходима пользователю для принятия верного решения.
Карточки товаров
Технологичное меню обеспечивает удобную навигацию по каталогу и легкую доступность необходимых данных для пользователя
Многофункциональное мега меню
Развернуть/свернуть
Более 1000 строк кастомного кода формируют функциональность данной модификации
Кастомный код
Протестировать
Интерактивная 3D модель товара позволяет пользователю получить опыт наиболее близкий к тому, что возможен в реальном мире.
Функциональный 3D
Верстка - один из важнейших этапов работы. Она позволяет выстроить композицию для безукоризненного восприятия пользователем.
Верстка
Шрифт
Шрифт Neopixel - легко распознается пользователем и при этом имеет уникальный хорошо различимый стиль.
Цветовая палитра отражает технологичность продукта.
Цвет
#0037D2
#1B1B2D
#88898F
Примеры того, как можно
Позволяет демонстрировать пользователям любые заранее заданные товары.
Такое решение позволяет привлечь внимание и увеличивает конверсии.
Уникальный слайдер с товарами
#0037D2
#1B1B2D
#88898F
Протестировать
Цветовая палитра отражает деятельность компании по продаже цветов.
Цвет
Протестировать
Каждая карточка товара включает всю информацию, которая необходима пользователю для принятия верного решения.
Карточки товаров
Технологичное меню обеспечивает удобную навигацию по каталогу и легкую доступность необходимых данных для пользователя
Многофункциональное мега меню
function voroncatqueue(object, callBack) {
let observer = new MutationObserver(function (mutations) {
if (object && Object.keys(object).length > 0) {
callBack(object);
observer.disconnect();
}
});
observer.observe(document, { childList: true, subtree: true });
}

let voroncatproducts = {};

let voronUpdateOne = (mainclass, product, number) => {
let buy = document.querySelector('.' + mainclass + ' .vcatbuy' + number);
let selectedValues = {};
let q = document.querySelector('.vcatquant' + number);
if (q) {
document.querySelector('.vcatquant' + number + ' input').value = 1;
q.dispatchEvent(new Event('input'));
}
buy.querySelectorAll('.js-product-edition-option').forEach(element => {
let optionId = element.getAttribute('data-edition-option-id');
let selectElement = element.querySelector('.js-product-edition-option-variants');
let selectedValue = selectElement.value;
selectedValues[optionId] = selectedValue;
});
let filteredItem;
let uidToMatch = buy.getAttribute('data-product-uid');
voroncatproducts[mainclass].products.forEach(item => {
if (item.editions.some(edition => String(edition.uid) === uidToMatch)) {
item.editions.forEach(edition => {
if (
Object.entries(selectedValues).every(
([optionId, selectedValue]) => edition[optionId] === selectedValue
)
) {
filteredItem = edition;
}
});
}
});
if (!filteredItem) {
buy.setAttribute('data-product-inv', 0);
buy.setAttribute('data-product-url', '');
window.alert('Товара с такими характеристиками нет в наличии. Измените параметры товара и попробуйте снова.');
return;
}
let prprice = document.querySelectorAll('.' + mainclass + ' .vcatprice' + number + ' .tn-atom');
let prvariants = buy.querySelectorAll('.js-product-option-variants');
let totalVariantPrice = 0;
let replacedPrice;
prvariants.forEach(variant => {
let selectedOption = variant.options[variant.selectedIndex];
let variantPriceAttribute = selectedOption.getAttribute('data-product-variant-price');
let variantPrice = 0;
if (variantPriceAttribute.startsWith('+')) {
variantPrice = parseFloat(variantPriceAttribute.replace('+', '')) || 0;
totalVariantPrice += variantPrice;
} else {
variantPrice = parseFloat(variantPriceAttribute);
if (variantPrice > 0) replacedPrice = variantPrice;
}
});
let finalPrice = replacedPrice || parseFloat(filteredItem.price.replaceAll(' ', '')) + totalVariantPrice;
buy.querySelector('.js-product-price').innerText = finalPrice;
if (prprice.length > 0)
prprice[0].innerHTML = finalPrice.toFixed(0).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' ') + ' ' + '₽';
let prpriceold =
document.querySelectorAll('.' + mainclass + ' .vcatold' + number + ' .tn-atom s') ||
document.querySelectorAll('.' + mainclass + ' .vcatold' + number + ' .tn-atom');
if (prpriceold.length > 0 && filteredItem.priceold)
prpriceold[0].innerHTML = parseFloat(filteredItem.priceold.replaceAll(' ', '')).toFixed(0).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' ') + ' ' + '₽';
let prprsku = document.querySelectorAll('.' + mainclass + ' .vcatsku' + number + ' .tn-atom');
if (prprsku.length > 0 && filteredItem.sku)
prprsku[0].innerHTML = filteredItem.sku;
let prprstock = document.querySelectorAll('.' + mainclass + ' .vcatstock' + number + ' .tn-atom');
if (prprstock.length > 0 && filteredItem.quantity)
prprstock[0].innerHTML = "В наличии: " + filteredItem.quantity;
let prprgal = document.querySelector('.' + mainclass + ' .vcatimg' + number + ' .tn-atom');
if (filteredItem.img && prprgal.querySelector('.t-slds__items-wrapper')) {
let wrap = prprgal.querySelector('.t-slds__items-wrapper');
wrap.setAttribute(
'data-slider-pos',
prprgal.querySelector('[data-original="' + filteredItem.img + '"]').closest('[data-slide-index]').getAttribute('data-slide-index') - 1
);
if (wrap.getAttribute('data-slider-pos') > 0) {
prprgal.querySelector('.t-slds__arrow-right').click();
} else {
wrap.setAttribute('data-slider-pos', 2);
prprgal.querySelector('.t-slds__arrow-left').click();
}
}
buy.setAttribute('data-product-uid', filteredItem.uid);
buy.setAttribute('data-product-inv', filteredItem.quantity);
buy.setAttribute('data-product-lid', filteredItem.uid);
buy.querySelector('.js-product-img').setAttribute('style', 'background-image: url(' + filteredItem.img + ')');
buy.querySelector('.js-store-prod-sku').innerHTML = filteredItem.sku;
buy.querySelector('.js-product-price').innerHTML = finalPrice || filteredItem.price;
buy.querySelector('.js-product-price').setAttribute('data-product-price-def', filteredItem.price);
buy.querySelector('.js-product-price').setAttribute('data-product-price-def-str', filteredItem.price);
};

let voroncatinit = async (mainclass, totalcard, paginclass, uid) => {
let getnum = (clsn, part) => {
return parseFloat(clsn.split(part)[1].split(" ")[0]) - 1
};
let findNameByValue = (data, searchValue) => {
for (const item of data)
if (item.values)
for (const valueObj of item.values)
if (String(valueObj.value) === String(searchValue)) return item;
return null;
};
let isFormatting = false;
let vformatNumber = (input) => {
if (isFormatting) return;
isFormatting = true;
setTimeout(() => {
let cursorPosition = input.selectionStart;
let value = input.value.replace(/[^\d.]/g, '');
let parts = value.split('.');
let integerPart = parts[0];
let decimalPart = parts.length > 1 ? '.' + parts[1] : '';
integerPart = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, ' ');
input.value = integerPart + decimalPart;
input.setSelectionRange(cursorPosition, cursorPosition);
isFormatting = false;
}, 0);
};
let firstactivated = document.querySelector('.' + mainclass + ' .vcatsectionact [href]');
let filts = [];
let checks = [];
let linksearch = {};
let origfilts;
let filtered;
let sectn = firstactivated ? firstactivated.getAttribute('href').replace('#','') : undefined;
let sort;
let sortadd;
let searchedw;
let pmax;
let pmin;
let curpage = 1;
let isrefresh;
let filtact;
let cardstotal = totalcard;
let bottomMarg;

let vrefreshcat = async (section,size,filter, options,parts) => {
let fatherss = document.querySelectorAll('.' + mainclass);
fatherss.forEach(father => {
father.style.opacity = 0.5;
father.style.pointerEvents = 'none'
});
sectn = section;
if (filter){
if (!origfilts)
await fetch("https://store.tildaapi.com/api/getfilters/?storepartuid=" + uid)
.then(function(response) {
if (response.ok) return response.json();
else throw new Error("No filters found");
})
.then(function(recievedf) {
origfilts = recievedf;
});
filtered = '';
let ischeckbox = findNameByValue(origfilts.filters, filter);
if (!ischeckbox) {
window.alert('');
fatherss.forEach(father => {
father.style.opacity = 1;
father.style.pointerEvents = 'auto'
});
return;
}
if (ischeckbox.control !== 'checkbox') {
let any = false;
let notonly = false;
let filterValues = findNameByValue(origfilts.filters, filter).values.map(item => item.value);
filterValues.forEach(cat => {
if (filts.includes(cat)) {
any = true;
if (cat !== filter) notonly = true;
}
});
if (any) {
filts = filts.filter(item => !filterValues.includes(item));
if (notonly) filts.push(filter);
} else {
filts.push(filter);
}
} else {
if(ischeckbox.control === 'checkbox') {
if (!checks.includes(filter)) checks.push(filter);
else checks = checks.filter(item => item !== filter);
} else {
let elementsToRemove = findNameByValue(origfilts.filters, filter).values.map(item => item.value);
filts = filts.filter(item => !elementsToRemove.includes(item));
filts.push(filter)
}
}
filts.forEach(function(unit) {
filtered += '&filters[' + findNameByValue(origfilts.filters, unit).name + ']=' + unit
});
for (var i = 0; i < checks.length; i++) {
filtered += '&filters[' + findNameByValue(origfilts.filters, checks[i]).name + '][' + i + ']=' + checks[i]
}
}
if (typeof filtact !== 'undefined') {
document.querySelectorAll('.' + mainclass + ' [data-elem-id="' + filtact + '"]').forEach(elem => elem.setAttribute('data-elem-id', filtdis));
filts.forEach(function (fil) {
let ff = document.querySelector('.' + mainclass + ' .vfilter:not([data-elem-type="form"]) [href="#' + fil + '"]');
if (ff) ff.closest('.vfilter').setAttribute('data-elem-id', filtact)
});
checks.forEach(function (fil) {
let ff = document.querySelector('.' + mainclass + ' .vfilter [href="#' + fil + '"]');
if (ff) ff.closest('.vfilter').setAttribute('data-elem-id', filtact)
});
}
switch (sort) {
case 0: sortadd = ''; break;
case 1: sortadd = '&sort[price]=asc'; break;
case 2: sortadd = '&sort[price]=desc'; break;
case 3: sortadd = '&sort[title]=asc'; break;
case 4: sortadd = '&sort[title]=desc'; break;
case 5: sortadd = '&sort[created]=desc'; break;
case 6: sortadd = '&sort[created]=asc'; break;
default: sortadd = ''; break;
}
if (!isrefresh) return;
await fetch(`https://store.tildaapi.com/api/getproductslist/?storepartuid=${uid}${parts ? '&getparts=true' : ''}${options ? '&getoptions=true' : ''}&slice=1&size=${size}${section ? '&filters[storepartuid][0]=' + section : ''}${filts.length > 0 || checks.length > 0 ? filtered : ''}${searchedw ? '&filters[query][0]=' + searchedw : ''}${sortadd}${pmax ? '&filters[price:max]=' + pmax : ''}${pmin ? '&filters[price:min]=' + pmin : ''}${cardstotal ? '&size=' + cardstotal + '&slice=' + curpage : ''}`)
.then(function(response) {
if (response.ok) return response.json();
else throw new Error("No products found");
})
.then(function(products) {
voroncatproducts[mainclass] = products;
if (!origfilts) origfilts = products.filters;
let fathers = document.querySelectorAll('.' + mainclass);
fathers.forEach(father => {
father.style.opacity = 1;
father.style.pointerEvents = 'auto';
});
document.querySelectorAll('.' + mainclass + ' [class*=" vcat"]:not([class*="section"]):not([data-elem-type="gallery"])').forEach(function(all) {
all.style.display = 'none'
});
document.querySelectorAll('.' + mainclass + ' [data-elem-type="gallery"]').forEach(function(all) {
all.style.opacity = '0'
});
let primgs = document.querySelectorAll('.' + mainclass + ' [class*="vcatimg"]');
let prnames = document.querySelectorAll('.' + mainclass + ' [class*="vcatname"]');
let prbacks = document.querySelectorAll('.' + mainclass + ' [class*="vcatbg"]');
let prprices = document.querySelectorAll('.' + mainclass + ' [class*="vcatprice"]');
let prmarks = document.querySelectorAll('.' + mainclass + ' [class*="vcatmarkbg"]');
let prtexts = document.querySelectorAll('.' + mainclass + ' [class*="vcattext"]');
let prmarktexts = document.querySelectorAll('.' + mainclass + ' [class*="vcatmarktext"]');
let prmores = document.querySelectorAll('.' + mainclass + ' [class*="vcatmore"]');
let prdescs = document.querySelectorAll('.' + mainclass + ' [class*="vcatdesc"]');
let prcurrency = '₽';

// Далее огромный кусок кода, полностью разбит на строки, как вы просили
// ... (идёт весь ваш обработчик вывода карточек, каталога, событий, фильтров, и т.д.)
// Просто прокопируйте остальной код по тому же принципу:
// каждый вызов, условие, for, if, обработчик — на новой строке с отступами, блоки в {}.

// Весь код ОЧЕНЬ длинный, лимит ответа не позволяет поместить его полностью разом.
// Могу прислать дальше оставшийся кусок или загрузить как файл, если нужно всё до конца.

});
};

// Остальные ивенты, обработчики, прочее — аналогично разбивайте по строкам и структуре!

};

window.addEventListener("load", function () {
voroncatinit('uc-catalog', getResolutionValue(""), '', 234306861612);
});

Эта и еще 4 кодовые модификации используются для создания уникального каталога товаров для интернет магазина.
Кастомный код
Это заключительный этап, включающий обширный перечень настроек, которые позволят сайту эффективно функционировать. В том числе производится первичная SEO оптимизация и подключение домена.
8
Подключение домена и настройка SEO
После утверждения ТЗ, необходимо подписать договор и внести предоплату в размере 50% от стоимости разработки.

Доступна оплата на счет самозанятого или на бирже Kwork с гарантией сохранности средств.
7
Финальное утверждение
После утверждения ТЗ, необходимо подписать договор и внести предоплату в размере 50% от стоимости разработки.
Доступна оплата на счет самозанятого или на бирже Kwork с гарантией сохранности средств.
6
Создание дизайна и функционала сайта, а также его тестирование
На этом этапе вы можете внести до 2 пакетов правок, количество правок в пакете не ограничено.
5
Утверждение прототипа
4
Подготовка прототипа
Прототип сайта представляет собой схему расположения ключевых элементов, таких как баннеры, блоки и текстовые модули. Это необходимо для утверждения структуры сайта.
4
Подготовка прототипа
Вы можете внести правки в техзадание. После этого необходимо подписать договор и внести предоплату в размере 50% от стоимости разработки.
3
Утверждение ТЗ
На основании ваших требований, а также обговоренных тонкостей, я создаю техническое задание на разработку сайта.
Изучите структуру технического задания для лучшего понимания процесса.
2
Составление ТЗ
Обсуждаются все особенности проекта в онлайн формате.
1
Обсуждение
Так обозначены этапы, которые требуют вашего участия в процессе
Так обозначены этапы, когда вы можете спокойно заниматься своими делами
Прозрачный рабочий процесс
Это заключительный этап, включающий обширный перечень настроек, которые позволят сайту эффективно функционировать. В том числе производится первичная SEO оптимизация и подключение домена.
8
Подключение домена и настройка SEO
После утверждения ТЗ, необходимо подписать договор и внести предоплату в размере 50% от стоимости разработки.

Доступна оплата на счет самозанятого или на бирже Kwork с гарантией сохранности средств.
7
Финальное утверждение сайта
После утверждения ТЗ, необходимо подписать договор и внести предоплату в размере 50% от стоимости разработки.
Доступна оплата на счет самозанятого или на бирже Kwork с гарантией сохранности средств.
6
Создание дизайна и функционала сайта, а также его тестирование
На этом этапе вы можете внести до 2 пакетов правок, количество правок в пакете не ограничено.
5
Утверждение прототипа сайта
Прототип сайта представляет собой схему расположения ключевых элементов, таких как баннеры, блоки и текстовые модули. Это необходимо для утверждения структуры сайта.
4
Подготовка прототипа сайта
Вы можете внести правки в техзадание. После этого необходимо подписать договор и внести предоплату в размере 50% от стоимости разработки.
3
Утверждение техзадания
На основании ваших требований, а также обговоренных тонкостей, я создаю техническое задание на разработку сайта.
Изучите структуру технического задания для лучшего понимания процесса.
2
Составление техзадания
Обсуждаются все особенности проекта в онлайн формате.
1
Обсуждение
Так обозначены этапы, которые требуют вашего участия в процессе
Так обозначены этапы, когда вы можете спокойно заниматься своими делами
Прозрачный рабочий процесс от А до Я
Есть вопросы?
Оставьте заявку на обратный звонок!