Интернет-магазин витаминов, спортивного питания и товаров для красоты Dobavki.ua
Dobavki UA - заботимся о вашем здоровье и красоте!
Современный темп жизни утомляет? Тело устает, истощается нервная система, настроение на нуле. С этим сталкивался каждый:
постоянно ощущается недостаток сил, энергии;
работа становится скучной, любое занятие не приносит удовольствия;
после качественного сна трудно встать с постели, хочется еще отдохнуть;
на коже слишком рано появились первые признаки старения.
Список можно продолжать, но ключ к решению проблемы кроется в недостатке питания на клеточном уровне. Вдали от природы, сложно организовать полноценный рацион, поддерживать молодость и красоту кожи.
Dobavki UA - это мультибрендовый интернет-магазин витаминов в Украине, где получится найти все необходимое для бодрости тела и духа. Качественная, сертифицированная продукция известных брендов поможет:
восстановить обменные процессы в клетках;
повысить защитный порог иммунной системы;
доставить необходимые микроэлементы и активные добавки;
запустить процесс регенерации на клеточном уровне;
решить проблемы с усталостью, сонливостью, депрессией.
Интернет-магазин спортивного питания в Украине
Максимальную эффективность от тренировки можно получить, если комбинировать физические нагрузки и здоровое, насыщенное питание. Последнее подразумевает использование специальных добавок. Ассортимент магазина спортивного питания Dobavki UA предлагает купить:
ZMA для стимуляции выработки тестостерона, соли для кето-диеты, углеродные порошки и другие восстанавливающие порошки.
Стимуляторы перед тренировкой в виде формул с оксидом азота, кофеином.
Аппетитные энергетические батончики с большим процентом белка, протеиновые снэки, вегетарианские и соевые перекусы.
Смеси, используемые для строения мышц, натуральные добавки с мультивитаминной формулой.
В поисках надежного магазина спортпита, купить качественные биодобавки недорого реально на нашем сайте. Можно оформить доставку спортпита различного назначения как в Киеве, так и Львове, Харькове, Одессе, Днепре и других городах страны.
Товары для красоты и здоровья в интернет-магазине Dobavki UA
Каждая женщина хочет сохранить молодость и естественную красоту. Для этого достаточно подобрать качественные косметические средства, организовать небольшую витаминную подпитку. Наш магазин косметических средств предлагает большой ассортимент товаров эффектного макияжа, продукции для бережного ухода за кожей, волосами и ногтями.
Сыворотки и серумы для восстановления гидро-липидного баланса эпителия;
Кремы, лосьоны, гели со смягчающим эффектом.
Маски для скрабирования и пиллинга, снижения выработки сальных желез.
Тонизирующие крема для выработки коллагена в клетках.
Наборы популярной корейской косметики на основе муцина.
В интернет-магазине косметики получится найти масла, аминокислоты, экстракты и вытяжки на натуральной основе, аксессуары для нанесения и снятия макияжа.
Заботятся о внешнем виде как женщины, так и мужчины. На Dobavki UA есть все необходимое:
для ухода за волосами, телом, лицом;
найдутся и средства личной гигиены, такие как нить и ополаскиватели для полости рта;
различные гели и шампуни с натуральной основой;
масла для ароматерапии.
Когда хочется удивить родных или порадовать вторую половинку, закажите подарочный набор косметических средств. Согласно отзывам покупателей, это самый актуальный презент вне зависимости от праздника.
Ухаживать за организмом стоит прежде всего изнутри. Четкое функционирование каждой системы, органа, тканей и клеток - это гарантия хорошего самочувствия и настроения. Чтобы предупредить заболевания и отложить старость, посетите интернет-магазин БАДов. Комплекс ухода за телом включает:
Группу витаминов B, фолиевую кислоту, витамины A, C, D, K.
Добавки для повышения прочности костей и эластичности суставов.
Незаменимые для организма Аминокислоты.
Препараты для повышения женской фертильности.
Микроэлементы, необходимые для конкретной системы.
Добавки для поддержания диеты, настройки ежедневного рациона.
Травы и гомеопатические товары для здоровья в интернет-магазине Dobavki UA.
Безопасные товары для детей на натуральной основе
Приглашаем купить детские товары в интернет-магазине Dobavki UA. Наш ассортимент удовлетворит запросы самых требовательных покупателей, - новорожденных. Останутся довольны качеством и родители малышей.
Выбирайте аксессуары для ухода за младенцем. Нагрудники и ночники, очистители бутылочек и удобные пустышки, различные фиксаторы и наборы для купания, - все это облегчит работу молодым родителям.
Организуйте интересное пространство для крохи, чтобы стимулировать познавательные функции, развить мелкую моторику ручек. Товары для детей интернет-магазина:
прогрызыватели, ортодонтические соски, средства для ухода за полостью рта;
фиксаторы головы для кресел, колыбели или стульчика;
наборы расчесок и зубных щеток;
молокоотсосы и вкладыши для мамы;
яркие погремушки, игрушки из качественной, яркой пластмассы.
Соприкасайтесь с природой даже в шумном мегаполисе. Подбирайте витаминную подпитку для организма, обеспечьте семью надежными средствами по уходу, сделайте тренировки эффективней, радуйте детей занимательными игрушками, подкармливайте питомцев вместе с Dobavki UA.
Частые вопросы о: Интернет-магазин витаминов Dobavki.ua
💊 В какие города Украины интернет-магазин Dobavki.ua осуществляет доставку?
Так, самовывоз товаров возможно осуществить в городе Львов. Все подробности расскажет менеджер при заказе. Смотреть дальше на сайте
💚 Как можно рассчитаться на сайте DOBAVKI.UA?
Возможен любой удобный способ оплаты: наложенным платежом, банковской или кредитной картой или через кассу / терминал самообслуживания. Смотреть дальше на сайте
Введите адрес электронной почты, который вы указывали при регистрации. Мы отправим письмо с информацией для восстановления пароля.
».
--------------------------------------------------------------------
ЯК ПРАЦЮЄ:
1. Спрацьовує ТІЛЬКИ на сторінці квіза (за URL у QUIZ_PATHS).
2. Інжектить шрифти + стилі квіза в
(в обхід редактора сторінок).
3. Створює контейнер і запускає квіз.
--------------------------------------------------------------------
ПЕРЕД ЗАПУСКОМ:
• У Хорошопі створи сторінку з URL /pidbir-dobavok/ (заголовок будь-який,
поле «Текст» можна лишити порожнім).
• Якщо URL інший — впиши його в QUIZ_PATHS нижче.
===================================================================== */
(function () {
'use strict';
// URL сторінок, де показувати квіз (укр і рос версії).
// Перевірка часткова: спрацює і на /pidbir-dobavok/, і на /ua/pidbir-dobavok/.
var QUIZ_PATHS = ['/pidbir-dobavok/', '/podbor-dobavok/'];
// стартова мова: 'auto' = за мовою сторінки; або жорстко 'uk' / 'ru'
var START_LANG = 'auto';
// ---- перевірка: чи ми на сторінці квіза ----
function onQuizPage() {
var p = location.pathname;
for (var i = 0; i < QUIZ_PATHS.length; i++) {
if (p.indexOf(QUIZ_PATHS[i]) > -1) return true;
}
return false;
}
if (!onQuizPage()) return; // на інших сторінках нічого не робимо
// ---- 1) шрифти ----
function injectFonts() {
if (document.getElementById('dq-fonts')) return;
var l = document.createElement('link');
l.id = 'dq-fonts';
l.rel = 'stylesheet';
l.href = 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Archivo:wght@700;800;900&display=swap';
document.head.appendChild(l);
}
// ---- 2) стилі квіза ----
function injectStyles() {
if (document.getElementById('dq-quiz-styles')) return;
var s = document.createElement('style');
s.id = 'dq-quiz-styles';
// DQ_GUARD — захист від переповнення на мобільному (тема сайту має вузький контейнер).
// Гарантує, що квіз вписується в ширину контейнера й не дає горизонтального скролу.
var DQ_GUARD =
'#supplement-quiz{width:100%;max-width:100%;box-sizing:border-box;}' +
'#supplement-quiz .quiz{max-width:100%;width:100%;}' +
'#supplement-quiz *{max-width:100%;}' +
'@media(max-width:600px){' +
'#supplement-quiz .quiz{border-radius:18px;}' +
'#supplement-quiz .quiz__bar{padding:16px 16px 14px;}' +
'#supplement-quiz .quiz__stage{padding:14px 16px 22px;}' +
'#supplement-quiz .quiz__footer{padding:12px 16px;}' +
'#supplement-quiz .quiz__q{font-size:22px;}' +
'#supplement-quiz .quiz__logo{font-size:17px;}' +
'#supplement-quiz .quiz__opt{padding:14px;}' +
'#supplement-quiz .quiz__opts.is-grid .quiz__opt{padding:16px 10px;}' +
'#supplement-quiz .quiz__resCard{padding:20px 16px;}' +
'}';
s.textContent = DQ_GUARD + DQ_CSS;
document.head.appendChild(s);
}
// ---- 3) контейнер квіза ----
function ensureContainer() {
var existing = document.getElementById('supplement-quiz');
if (existing) return existing;
// основна зона контенту сторінки Хорошопу — вставляємо квіз ПРЯМО під заголовок.
// .article-text / .page-content — порожній текстовий блок створеної сторінки.
var host =
document.querySelector('.page-content .article-text') ||
document.querySelector('.page-content') ||
document.querySelector('section.page .article-text') ||
document.querySelector('.page-text') ||
document.querySelector('.page__content') ||
document.querySelector('.content .text') ||
document.querySelector('main') ||
document.querySelector('.content') ||
document.body;
var wrap = document.createElement('div');
// width:100% + max-width:560 + box-sizing — не вилазить за вузький контейнер на мобільному
wrap.style.cssText = 'width:100%;max-width:560px;margin:14px auto 30px;padding:0;box-sizing:border-box;';
var box = document.createElement('div');
box.id = 'supplement-quiz';
wrap.appendChild(box);
host.appendChild(wrap);
return box;
}
// ---- стилі квіза (рядок) ----
var DQ_CSS = "/* =====================================================================\n \u041a\u0412\u0406\u0417 \u041f\u0406\u0414\u0411\u041e\u0420\u0423 \u0414\u041e\u0411\u0410\u0412\u041e\u041a \u00b7 DOBAVKI.UA\n --------------------------------------------------------------------\n \u0421\u0442\u0438\u043b\u0456\u0437\u043e\u0432\u0430\u043d\u043e \u0437\u0430 \u0431\u0440\u0435\u043d\u0434\u0431\u0443\u043a\u043e\u043c DOBAVKI.UA:\n \u2022 \u0444\u043e\u043d \u2014 \u0444\u0456\u0440\u043c\u043e\u0432\u0438\u0439 \u0442\u0435\u043c\u043d\u043e-\u0441\u0438\u043d\u0456\u0439 #052E6B\n \u2022 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u2014 Archivo \u0432\u0435\u043b\u0438\u043a\u0438\u043c \u043a\u0430\u043f\u0441\u043e\u043c (\u2248 Radical Uppercase)\n \u2022 \u0442\u0435\u043a\u0441\u0442 \u2014 Inter / Inter Bold\n \u2022 \u0430\u043a\u0446\u0435\u043d\u0442\u0438 \u2014 \u0437\u0435\u043b\u0435\u043d\u0438\u0439 #00C62B, \u043c'\u044f\u0442\u043d\u0438\u0439 #9AF3C4, \u043a\u043e\u0440\u0430\u043b\u043e\u0432\u0438\u0439 #FF6166\n \u2022 \u0434\u0435\u043a\u043e\u0440 \u2014 \u0444\u0456\u0440\u043c\u043e\u0432\u0456 \u00ab\u043b\u0430\u043d\u043a\u0438\u00bb (\u043d\u0435\u0437\u0430\u043c\u043a\u043d\u0435\u043d\u0456 \u043a\u0456\u043b\u044c\u0446\u044f) \u0442\u0430 \u0437\u0438\u0433\u0437\u0430\u0433\u0438\n \u041f\u0430\u043b\u0456\u0442\u0440\u0430 \u0432\u0438\u043d\u0435\u0441\u0435\u043d\u0430 \u0432 CSS-\u0437\u043c\u0456\u043d\u043d\u0456 \u2014 \u0437\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0438 \u043c\u0456\u043d\u044f\u0454\u0442\u044c\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c\u0443 \u043c\u0456\u0441\u0446\u0456.\n ===================================================================== */\n:root{\n /* \u2014 \u0444\u0456\u0440\u043c\u043e\u0432\u0456 \u043a\u043e\u043b\u044c\u043e\u0440\u0438 \u0431\u0440\u0435\u043d\u0434\u0431\u0443\u043a\u0443 \u2014 */\n --q-navy: #052E6B; /* \u043e\u0441\u043d\u043e\u0432\u043d\u0438\u0439 \u0442\u0435\u043c\u043d\u043e-\u0441\u0438\u043d\u0456\u0439 */\n --q-navy-2: #0a3d86; /* \u0441\u0432\u0456\u0442\u043b\u0456\u0448\u0438\u0439 \u0441\u0438\u043d\u0456\u0439 (\u043a\u0430\u0440\u0442\u043a\u0430/\u0433\u0440\u0430\u0434\u0456\u0454\u043d\u0442) */\n --q-navy-deep: #03204e; /* \u0433\u043b\u0438\u0431\u0448\u0438\u0439 \u0441\u0438\u043d\u0456\u0439 (\u0442\u0456\u043d\u0456/\u0444\u043e\u043d) */\n --q-green: #00C62B; /* \u0444\u0456\u0440\u043c\u043e\u0432\u0438\u0439 \u0437\u0435\u043b\u0435\u043d\u0438\u0439 (\u043b\u043e\u0433\u043e\u0442\u0438\u043f, \u0430\u043a\u0446\u0435\u043d\u0442) */\n --q-mint: #9AF3C4; /* \u043c'\u044f\u0442\u043d\u0438\u0439 */\n --q-coral: #FF6166; /* \u043a\u043e\u0440\u0430\u043b\u043e\u0432\u0438\u0439 */\n --q-gray: #EAEAEA; /* \u0441\u0432\u0456\u0442\u043b\u043e-\u0441\u0456\u0440\u0438\u0439 */\n\n /* \u2014 \u0440\u043e\u043b\u0456 \u2014 */\n --q-bg: var(--q-navy);\n --q-surface: #ffffff; /* \u0444\u043e\u043d \u043a\u0430\u0440\u0442\u043a\u0438 \u043a\u0432\u0456\u0437\u0430 */\n --q-surface-2: #f1f5fb; /* \u0432\u0442\u043e\u0440\u0438\u043d\u043d\u0456 \u043f\u043b\u0430\u0448\u043a\u0438 */\n --q-ink: #0c1f3f; /* \u043e\u0441\u043d\u043e\u0432\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0441\u0432\u0456\u0442\u043b\u043e\u043c\u0443 */\n --q-muted: #5b6b85; /* \u043f\u0440\u0438\u0433\u043b\u0443\u0448\u0435\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 */\n --q-line: #dde5f0; /* \u043b\u0456\u043d\u0456\u0457, \u0440\u0430\u043c\u043a\u0438 */\n --q-accent: var(--q-green);\n --q-accent-dark: #00a523;\n --q-success: var(--q-green);\n\n /* \u2014 \u0440\u043e\u0437\u043c\u0456\u0440\u0438 / \u0442\u0438\u043f\u043e\u0433\u0440\u0430\u0444\u0456\u043a\u0430 \u2014 */\n --q-radius: 22px;\n --q-radius-sm: 14px;\n --q-font: 'Inter', system-ui, -apple-system, sans-serif;\n --q-font-display:'Archivo', var(--q-font);\n --q-shadow: 0 30px 70px -25px rgba(3,32,78,.7);\n --q-ease: cubic-bezier(.2,.7,.2,1);\n}\n\n.quiz, .quiz *{ box-sizing:border-box; margin:0; padding:0; }\n.quiz{\n font-family:var(--q-font); color:var(--q-ink); line-height:1.55; font-size:16px;\n width:100%; max-width:560px; margin:0 auto;\n background:var(--q-surface); border:1px solid var(--q-line);\n border-radius:28px; box-shadow:var(--q-shadow); overflow:hidden; position:relative;\n -webkit-font-smoothing:antialiased;\n}\n\n/* ---- \u0448\u0430\u043f\u043a\u0430 (\u0444\u0456\u0440\u043c\u043e\u0432\u0438\u0439 \u0441\u0438\u043d\u0456\u0439 \u0437 \u0434\u0435\u043a\u043e\u0440\u043e\u043c-\u00ab\u043b\u0430\u043d\u043a\u0430\u043c\u0438\u00bb) ---- */\n.quiz__bar{\n padding:22px 26px 18px; position:relative; overflow:hidden;\n background:\n radial-gradient(420px 200px at 92% -40%, rgba(154,243,196,.22), transparent 70%),\n radial-gradient(360px 200px at -10% 140%, rgba(255,97,102,.20), transparent 70%),\n linear-gradient(135deg, var(--q-navy-2), var(--q-navy));\n}\n/* \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0435 \u0444\u0456\u0440\u043c\u043e\u0432\u0435 \u043a\u0456\u043b\u044c\u0446\u0435-\u00ab\u043b\u0430\u043d\u043a\u0430\u00bb \u0443 \u043a\u0443\u0442\u043a\u0443 \u0448\u0430\u043f\u043a\u0438 */\n.quiz__bar::after{\n content:\"\"; position:absolute; top:-34px; right:-28px; width:88px; height:88px;\n border:12px solid rgba(154,243,196,.28); border-radius:50%;\n border-right-color:transparent; border-bottom-color:transparent; transform:rotate(28deg);\n pointer-events:none;\n}\n.quiz__brand{ display:flex; align-items:center; justify-content:space-between; gap:10px; margin-bottom:16px; position:relative; z-index:1; }\n\n/* \u043b\u043e\u0433\u043e\u0442\u0438\u043f DOBAVKI.UA: \u0441\u0438\u043d\u0456\u0439 \u0442\u0435\u043a\u0441\u0442, \"O\" \u2014 \u043f\u0435\u0440\u0435\u043f\u043b\u0435\u0442\u0435\u043d\u0435 \u0437\u0435\u043b\u0435\u043d\u0435 \u043a\u0456\u043b\u044c\u0446\u0435, .UA \u043c\u0435\u043d\u0448\u0435 */\n.quiz__logo{ display:flex; align-items:baseline; gap:0; font-family:var(--q-font-display); font-weight:900; color:#fff; font-size:20px; letter-spacing:.01em; text-transform:uppercase; }\n.quiz__logo .ring{\n display:inline-block; width:.72em; height:.72em; margin:0 .03em; border:.17em solid var(--q-green);\n border-radius:50%; box-sizing:border-box;\n position:relative; top:.04em;\n}\n.quiz__logo .ua{ font-size:.72em; font-weight:900; color:var(--q-mint); margin-left:.1em; letter-spacing:.01em; }\n\n.quiz__time{ font-size:12px; font-weight:600; color:#dbe6ff; background:rgba(255,255,255,.12); border:1px solid rgba(255,255,255,.18); padding:4px 10px; border-radius:30px; }\n.quiz__lang{ display:inline-flex; gap:2px; background:rgba(255,255,255,.12); border:1px solid rgba(255,255,255,.2); border-radius:30px; padding:3px; }\n.quiz__lang button{ border:none; background:none; cursor:pointer; font-family:var(--q-font); font-weight:700; font-size:12px; color:#cdd9f0; padding:4px 10px; border-radius:30px; transition:background .15s ease, color .15s ease; -webkit-tap-highlight-color:transparent; }\n.quiz__lang button.is-active{ background:var(--q-green); color:#04230c; }\n.quiz__headRight{ display:flex; align-items:center; gap:8px; position:relative; z-index:1; }\n\n.quiz__progress{ height:7px; border-radius:30px; background:rgba(255,255,255,.16); overflow:hidden; position:relative; z-index:1; }\n.quiz__progress > i{ display:block; height:100%; width:0; background:linear-gradient(90deg, var(--q-mint), var(--q-green)); border-radius:30px; transition:width .45s var(--q-ease); }\n.quiz__stepno{ margin-top:9px; font-size:12px; font-weight:600; color:#bdcdeb; letter-spacing:.02em; position:relative; z-index:1; }\n\n/* ---- \u0441\u0446\u0435\u043d\u0430 \u0442\u0430 \u0441\u043b\u0430\u0439\u0434\u0438 (fade-in/out) ---- */\n.quiz__stage{ padding:22px 26px 28px; position:relative; }\n.quiz__slide{ opacity:0; transform:translateY(14px); transition:opacity .35s var(--q-ease), transform .35s var(--q-ease); }\n.quiz__slide.is-in{ opacity:1; transform:none; }\n.quiz__slide.is-out{ opacity:0; transform:translateY(-10px); pointer-events:none; }\n\n.quiz__kicker{ font-size:12px; font-weight:700; letter-spacing:.14em; text-transform:uppercase; color:var(--q-accent-dark); margin:6px 0 10px; display:flex; align-items:center; gap:8px; }\n.quiz__kicker .d{ width:7px; height:7px; border-radius:50%; background:var(--q-green); }\n.quiz__q{ font-family:var(--q-font-display); font-weight:800; font-size:27px; line-height:1.05; letter-spacing:.005em; text-transform:uppercase; color:var(--q-navy); margin-bottom:9px; }\n.quiz__sub{ color:var(--q-muted); font-size:15px; margin-bottom:22px; }\n\n/* ---- \u0432\u0430\u0440\u0456\u0430\u043d\u0442\u0438 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u0435\u0439 ---- */\n.quiz__opts{ display:grid; gap:12px; }\n.quiz__opts.is-two{ grid-template-columns:1fr 1fr; }\n@media(max-width:430px){ .quiz__opts.is-two{ grid-template-columns:1fr; } }\n.quiz__opt{\n text-align:left; background:#fff; border:1.5px solid var(--q-line); border-radius:var(--q-radius-sm);\n padding:16px; cursor:pointer; display:flex; align-items:center; gap:14px;\n font-family:var(--q-font); font-size:15.5px; font-weight:600; color:var(--q-navy); width:100%;\n transition:transform .12s var(--q-ease), border-color .15s ease, box-shadow .15s ease, background .15s ease;\n -webkit-tap-highlight-color:transparent;\n}\n.quiz__opt .ico{ font-size:24px; line-height:1; flex:none; width:46px; height:46px; border-radius:13px; background:var(--q-surface-2); display:flex; align-items:center; justify-content:center; transition:background .15s ease; }\n.quiz__opt .lab{ display:flex; flex-direction:column; gap:2px; }\n.quiz__opt .lab small{ font-weight:500; font-size:12.5px; color:var(--q-muted); }\n.quiz__opt:hover{ border-color:var(--q-green); transform:translateY(-2px); box-shadow:0 12px 26px -14px rgba(0,198,43,.55); }\n.quiz__opt:active{ transform:translateY(0) scale(.99); }\n.quiz__opt.is-sel{ border-color:var(--q-green); background:#eafff0; }\n.quiz__opt.is-sel .ico{ background:var(--q-green); }\n.quiz__opts.is-grid .quiz__opt{ flex-direction:column; text-align:center; align-items:center; gap:10px; padding:22px 12px; }\n.quiz__opts.is-grid .quiz__opt .ico{ width:56px; height:56px; font-size:30px; }\n\n/* ---- \u043d\u0430\u0432\u0456\u0433\u0430\u0446\u0456\u044f ---- */\n.quiz__nav{ display:flex; justify-content:space-between; align-items:center; margin-top:22px; gap:12px; }\n.quiz__back{ background:none; border:none; color:var(--q-muted); font-family:var(--q-font); font-weight:600; font-size:14px; cursor:pointer; padding:8px 4px; display:inline-flex; align-items:center; gap:6px; visibility:hidden; }\n.quiz__back:hover{ color:var(--q-navy); }\n.quiz__hint{ font-size:12.5px; color:var(--q-muted); }\n\n/* ---- \u0444\u0456\u043d\u0430\u043b\u044c\u043d\u0438\u0439 \u0435\u043a\u0440\u0430\u043d ---- */\n.quiz__resHead{ text-align:center; padding:6px 0 4px; }\n.quiz__badge{ display:inline-flex; align-items:center; gap:8px; background:#eafff0; border:1px solid #b9f3cb; border-radius:30px; padding:6px 14px; font-size:12.5px; font-weight:700; color:var(--q-accent-dark); letter-spacing:.04em; text-transform:uppercase; margin-bottom:14px; }\n.quiz__emoji{ font-size:46px; line-height:1; margin-bottom:6px; }\n/* \u043a\u0430\u0440\u0442\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 \u2014 \u0444\u0456\u0440\u043c\u043e\u0432\u0438\u0439 \u0441\u0438\u043d\u0456\u0439 \u0437 \u0434\u0435\u043a\u043e\u0440\u043e\u043c-\u043a\u0456\u043b\u044c\u0446\u044f\u043c\u0438 */\n.quiz__resCard{\n position:relative; overflow:hidden;\n background:\n radial-gradient(300px 160px at 100% 0%, rgba(154,243,196,.22), transparent 70%),\n radial-gradient(280px 160px at 0% 100%, rgba(255,97,102,.20), transparent 70%),\n linear-gradient(140deg, var(--q-navy-2), var(--q-navy));\n color:#fff; border-radius:20px; padding:26px 22px; margin:4px 0 16px; text-align:center;\n}\n.quiz__resCard::after{\n content:\"\"; position:absolute; bottom:-30px; right:-24px; width:100px; height:100px;\n border:14px solid rgba(154,243,196,.28); border-radius:50%;\n border-right-color:transparent; border-top-color:transparent; transform:rotate(20deg); pointer-events:none;\n}\n.quiz__resCard h2{ font-family:var(--q-font-display); font-weight:800; font-size:23px; line-height:1.1; margin-bottom:8px; letter-spacing:.005em; text-transform:uppercase; position:relative; z-index:1; }\n.quiz__resCard p{ font-size:14.5px; opacity:.9; max-width:420px; margin:0 auto; position:relative; z-index:1; }\n.quiz__tags{ display:flex; flex-wrap:wrap; gap:8px; justify-content:center; margin:16px 0 4px; }\n.quiz__tag{ background:var(--q-surface-2); border:1px solid var(--q-line); border-radius:9px; padding:6px 11px; font-size:13px; font-weight:600; color:var(--q-navy); text-decoration:none; cursor:pointer; transition:background .15s ease, border-color .15s ease, color .15s ease; }\n.quiz__tag:hover{ background:#eafff0; border-color:var(--q-green); color:var(--q-accent-dark); }\n\n/* ---- \u043a\u043d\u043e\u043f\u043a\u0438 CTA ---- */\n.quiz__cta{\n display:flex; align-items:center; justify-content:center; gap:10px; width:100%;\n background:var(--q-green); color:#04230c; border:none; border-radius:15px; padding:17px 18px;\n font-family:var(--q-font-display); font-weight:800; font-size:16px; cursor:pointer; text-transform:uppercase;\n text-decoration:none; margin-top:6px; transition:background .15s ease, transform .12s var(--q-ease); letter-spacing:.02em;\n}\n.quiz__cta:hover{ background:var(--q-accent-dark); transform:translateY(-2px); }\n.quiz__cta:active{ transform:translateY(0) scale(.99); }\n.quiz__restart{ display:block; width:100%; text-align:center; background:none; border:none; color:var(--q-muted); font-family:var(--q-font); font-weight:600; font-size:14px; cursor:pointer; margin-top:14px; padding:6px; }\n.quiz__restart:hover{ color:var(--q-navy); }\n.quiz__disclaim{ font-size:11.5px; color:var(--q-muted); text-align:center; margin-top:14px; line-height:1.45; }\n\n/* ---- \u0444\u043e\u0440\u043c\u0430 \u0437\u0431\u043e\u0440\u0443 \u043b\u0456\u0434\u0430 ---- */\n.quiz__form{ display:grid; gap:10px; margin-top:6px; }\n.quiz__field{ position:relative; }\n.quiz__input{\n width:100%; font-family:var(--q-font); font-size:15px; color:var(--q-ink);\n background:#fff; border:1.5px solid var(--q-line); border-radius:13px; padding:14px 15px; transition:border-color .15s ease;\n}\n.quiz__input:focus{ outline:none; border-color:var(--q-green); }\n.quiz__input::placeholder{ color:#9fb0c9; }\n.quiz__err{ color:var(--q-coral); font-size:12.5px; margin-top:4px; display:none; }\n.quiz__field.is-err .quiz__input{ border-color:var(--q-coral); }\n.quiz__field.is-err .quiz__err{ display:block; }\n.quiz__consent{ display:flex; gap:9px; align-items:flex-start; font-size:12px; color:var(--q-muted); line-height:1.4; margin-top:2px; }\n.quiz__consent input{ margin-top:2px; accent-color:var(--q-green); flex:none; }\n.quiz__thanks{ text-align:center; padding:10px 0; }\n.quiz__thanks .ok{ width:64px; height:64px; border-radius:50%; background:var(--q-green); color:#04230c; font-size:32px; display:flex; align-items:center; justify-content:center; margin:0 auto 14px; }\n\n/* ---- \u0442\u043e\u0432\u0430\u0440\u0438 \u043d\u0430 \u0444\u0456\u043d\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0435\u043a\u0440\u0430\u043d\u0456 ---- */\n.quiz__products{ margin:4px 0 2px; }\n.quiz__products-load{ font-size:13px; color:var(--q-muted); text-align:center; padding:8px 0; }\n.quiz__products-title{ font-size:12.5px; font-weight:700; color:var(--q-muted); letter-spacing:.02em; margin:6px 0 10px; }\n.quiz__product{\n display:flex; align-items:center; gap:10px; padding:9px; margin-bottom:8px;\n border:1.5px solid var(--q-line); border-radius:13px; background:#fff;\n transition:border-color .15s ease, box-shadow .15s ease;\n}\n.quiz__product:hover{ border-color:var(--q-green); box-shadow:0 8px 20px -12px rgba(0,198,43,.5); }\n.quiz__product-link{ display:flex; align-items:center; gap:12px; text-decoration:none; flex:1; min-width:0; }\n.quiz__product-img{ flex:none; width:52px; height:52px; border-radius:10px; background:var(--q-surface-2) center/contain no-repeat; }\n.quiz__product-info{ display:flex; flex-direction:column; gap:3px; min-width:0; }\n.quiz__product-name{ font-size:13px; font-weight:600; color:var(--q-ink); line-height:1.25; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }\n.quiz__product-price{ font-size:14px; font-weight:800; color:var(--q-accent-dark); font-family:var(--q-font-display); }\n.quiz__product-buy{\n flex:none; align-self:stretch; display:flex; align-items:center; justify-content:center;\n background:var(--q-green); color:#04230c; text-decoration:none; font-weight:700; font-size:12.5px;\n font-family:var(--q-font-display); padding:8px 14px; border-radius:10px; white-space:nowrap;\n transition:background .15s ease, transform .12s var(--q-ease);\n}\n.quiz__product-buy:hover{ background:var(--q-accent-dark); transform:translateY(-1px); }\n.quiz__product-buy:active{ transform:translateY(0) scale(.98); }\n@media(max-width:430px){\n .quiz__product-name{ font-size:12.5px; -webkit-line-clamp:2; }\n .quiz__product-buy{ padding:8px 11px; font-size:12px; }\n .quiz__product-img{ width:46px; height:46px; }\n}\n\n.quiz__footer{ padding:14px 26px; border-top:1px solid var(--q-line); font-size:11.5px; color:var(--q-muted); text-align:center; background:#f7faff; }\n";
// ---- логіка квіза (модуль SupplementQuiz) ----
/* =====================================================================
SupplementQuiz — двомовний модульний квіз (UK / RU) на чистому Vanilla JS
--------------------------------------------------------------------
Ініціалізація:
SupplementQuiz.init('#supplement-quiz', { lang:'uk', ...опції });
- Тексти зберігаються у словнику I18N (uk / ru).
- Категорії (slug) спільні для обох мов; різниця лише в baseUrl:
uk → https://dobavki.ua/ua ru → https://dobavki.ua
- Перемикач мови у шапці; вибір мови запам'ятовується для сесії.
===================================================================== */
(function (global) {
'use strict';
/* -------------------------------------------------------------------
1. SLUG'и КАТЕГОРІЙ (спільні для обох мов, усі перевірені HTTP 200)
------------------------------------------------------------------- */
var SLUG = {
iron: '/zhelezo/',
beauty: '/volosy-kozha-i-nogti/',
immune: '/orvi-kashel-i-gripp/',
sleep: '/son/',
mensHealth: '/mens-health/',
sport: '/sportivnoe-pitanie/',
magnesium: '/magniy/',
kidImmune: '/detskoe-lekarstvo-ot-prostudy-orvi-i-kashlya/',
kidCalcium: '/kaltsiy-dlya-detey/',
kidBrain: '/vitaminy-dlya-mozga/',
kidMulti: '/multivitaminy-dlya-detey/'
};
/* -------------------------------------------------------------------
2. БАЗОВІ АДРЕСИ ЗА МОВОЮ
------------------------------------------------------------------- */
var BASE = {
uk: 'https://dobavki.ua/ua',
ru: 'https://dobavki.ua'
};
/* -------------------------------------------------------------------
2b. ФОЛБЕК-ТОВАРИ
Показуються, якщо живе підвантаження каталогу недоступне (інший домен
/ прев'ю). На реальному сайті dobavki.ua товари тягнуться наживо з
актуальними цінами, тож ці дані — лише запасний варіант.
href зберігаємо у форматі /ua// — нормалізація під мову в коді.
------------------------------------------------------------------- */
var FALLBACK_PRODUCTS = {
iron: [
{ href:'/ua/now-foods-iron-18-mg-120-vegetarianskikh-kapsul/', n:'Залізо Now Foods 18 мг, 120 капсул', p:'458 грн', img:'https://dobavki.ua/content/images/39/310x310l85nn0/80597174441538.webp' },
{ href:'/ua/solaray-zhelezo-50-mg-60-vegetarianskikh-kapsul/', n:'Залізо Solaray 50 мг, 60 капсул', p:'385 грн', img:'https://dobavki.ua/content/images/43/310x310l85nn0/15196505909648.webp' }
],
beauty: [
{ href:'/ua/doctors-best-gialuronovaya-kislota-sulfat-khondroitina-60-vegetarianskikh-kapsul/', n:"Гіалуронова кислота + хондроїтин Doctor's Best, 60 капсул", p:'1 190 грн', img:'https://dobavki.ua/content/images/12/310x310l85nn0/66450812021870.webp' }
],
immune: [],
sleep: [],
mensHealth: [],
sport: [
{ href:'/ua/now-foods-l-tirozin-l-tyrosine-500-mg-120-kapsul/', n:'Тирозин Now Foods 500 мг, 120 капсул', p:'551 грн', img:'' }
],
magnesium: [],
kidImmune: [],
kidCalcium: [
{ href:'/ua/carlson-labs-detskiy-zhevatelnyy-kaltsiy-naturalnyy-vanilnyy-vkus-250-mg-60-tabletok/', n:'Жувальний кальцій для дітей Carlson Labs 250 мг, 60 таб.', p:'822 грн', img:'https://dobavki.ua/content/images/19/310x310l85nn0/97344116843414.webp' }
],
kidBrain: [],
kidMulti: []
};
/* -------------------------------------------------------------------
3. СЛОВНИК ПЕРЕКЛАДІВ
I18N[lang] = { ui:{...}, questions:{...}, results:{...} }
Структура питань і ключі результатів ідентичні в обох мовах —
відрізняються лише підписи. result-ключі посилаються на SLUG.
------------------------------------------------------------------- */
var I18N = {
/* ---------------------------- УКРАЇНСЬКА ---------------------------- */
uk: {
ui: {
time: '≈ 40 секунд',
step: 'Крок ',
done: 'Готово ✓',
hint: 'Оберіть варіант, щоб продовжити',
back: '‹ Назад',
badge: '✦ Ваша добірка готова',
cta: 'Перейти до добірки →',
restart: '↺ Пройти ще раз',
disclaim: 'Перед прийомом добавок, особливо для дітей, проконсультуйтеся з лікарем.',
footer: 'Рекомендації мають загальний характер і не замінюють консультацію лікаря.',
leadName: 'Ваше ім\'я',
leadPhone: 'Телефон, напр. +380…',
leadConsent:'Погоджуюся на обробку даних для надсилання персональної добірки.',
leadBtn: 'Отримати добірку →',
errName: 'Вкажіть ім\'я',
errPhone: 'Вкажіть коректний номер',
thanks: 'Дякуємо, ',
thanksSub: 'Ми надішлемо вашу персональну добірку. А поки — перегляньте її прямо зараз:',
productsTitle: 'Популярне в цій категорії:',
loadingProducts: 'Підбираємо товари…',
buyBtn: 'Купити'
},
questions: {
start: {
kicker:'Почнемо', q:'Для кого підбираємо добавки?',
sub:'Покажемо тільки те, що підходить саме вам.', layout:'grid',
options:[
{ ico:'🙋', label:'Для себе', note:'дорослий', next:'sex' },
{ ico:'🧒', label:'Для дитини', note:'до 14 років', next:'kidGoal' }
]
},
sex: {
kicker:'Крок', q:'Вкажіть стать',
sub:'Потреби організму відрізняються — підбір буде точнішим.', layout:'two',
options:[
{ ico:'👩', label:'Жінка', next:'womenGoal' },
{ ico:'👨', label:'Чоловік', next:'menGoal' }
]
},
womenGoal: {
kicker:'Ваша ціль', q:'Що для вас зараз найважливіше?',
sub:'Оберіть основний запит — решту додасте в каталозі.', layout:'list',
options:[
{ ico:'⚡️', label:'Більше енергії', note:'втома, нестача сил', result:'women_energy' },
{ ico:'✨', label:'Краса й молодість', note:'шкіра, волосся, нігті', result:'women_beauty' },
{ ico:'🛡️', label:'Зміцнити імунітет', note:'профілактика застуд', result:'women_immune' },
{ ico:'🌙', label:'Сон і спокій', note:'стрес, тривожність', result:'women_calm' }
]
},
menGoal: {
kicker:'Ваша ціль', q:'Що для вас зараз найважливіше?',
sub:'Оберіть основний запит — решту додасте в каталозі.', layout:'list',
options:[
{ ico:'⚡️', label:'Тонус та енергія', note:'втома, лібідо, сили', result:'men_energy' },
{ ico:'💪', label:'Спорт і набір маси', note:'тренування, відновлення', result:'men_sport' },
{ ico:'🛡️', label:'Зміцнити імунітет', note:'профілактика застуд', result:'men_immune' },
{ ico:'🎯', label:'Сон, стрес і фокус', note:'концентрація', result:'men_focus' }
]
},
kidGoal: {
kicker:'Для дитини', q:'Яка головна потреба?',
sub:'Дозування й форми підберемо саме для дитячого віку.', layout:'list',
options:[
{ ico:'🛡️', label:'Імунітет', note:'часто хворіє', result:'kid_immune' },
{ ico:'🦴', label:'Ріст і міцні кістки', note:'кальцій, зуби', result:'kid_growth' },
{ ico:'🧠', label:'Увага й навчання', note:'концентрація, пам\'ять', result:'kid_brain' },
{ ico:'🍎', label:'Апетит і вітаміни', note:'вибагливий в їжі', result:'kid_appetite' }
]
}
},
results: {
women_energy: { e:'⚡️', t:'Енергія та залізо для жінок', d:'Залізо й вітаміни групи B — підтримка рівня енергії.', tags:['Залізо','B12','Енергія'], slug:'iron' },
women_beauty: { e:'✨', t:'Краса: шкіра, волосся, нігті', d:'Колаген і комплекси для шкіри, волосся та нігтів.', tags:['Колаген','Біотин','Волосся'], slug:'beauty' },
women_immune: { e:'🛡️', t:'Імунітет та вітамін D', d:'Вітамін D, цинк і C — базова підтримка імунітету.', tags:['Вітамін D','Цинк','Вітамін C'], slug:'immune' },
women_calm: { e:'🌙', t:'Сон і спокій', d:'Магній, мелатонін і комплекси для сну та зняття стресу.', tags:['Магній','Мелатонін','Сон'], slug:'sleep' },
men_energy: { e:'⚡️', t:'Тонус та енергія для чоловіків', d:'Вітамінні комплекси для здоров\'я й тонусу чоловіків.', tags:['Чоловікам','Тонус','Вітаміни B'], slug:'mensHealth' },
men_sport: { e:'💪', t:'Спорт і набір маси', d:'Протеїн, креатин і амінокислоти для тренувань і відновлення.', tags:['Протеїн','Креатин','BCAA'], slug:'sport' },
men_immune: { e:'🛡️', t:'Імунітет та вітамін D', d:'Вітамін D, цинк і C — базова підтримка імунітету.', tags:['Вітамін D','Цинк','Вітамін C'], slug:'immune' },
men_focus: { e:'🎯', t:'Сон, стрес і фокус', d:'Магній і комплекси для концентрації й відновлення.', tags:['Магній','Стрес','Фокус'], slug:'magnesium' },
kid_immune: { e:'🛡️', t:'Імунітет для дітей', d:'Вітамін D, C і комплекси для імунітету в дитячих формах.', tags:['Вітамін D','Вітамін C','Дітям'], slug:'kidImmune' },
kid_growth: { e:'🦴', t:'Ріст, кальцій та зуби', d:'Кальцій для здорового росту й міцних кісток дитини.', tags:['Кальцій','Вітамін D3','Ріст'], slug:'kidCalcium' },
kid_brain: { e:'🧠', t:'Увага та навчання', d:'Вітаміни для мозку: концентрація під час навчання.', tags:['Омега-3','Мозок','Пам\'ять'], slug:'kidBrain' },
kid_appetite: { e:'🍎', t:'Апетит та загальні вітаміни', d:'Дитячі мультивітаміни для вибагливих у їжі дітей.', tags:['Мультивітаміни','Дітям','Апетит'], slug:'kidMulti' }
}
},
/* ----------------------------- РОСІЙСЬКА ----------------------------- */
ru: {
ui: {
time: '≈ 40 секунд',
step: 'Шаг ',
done: 'Готово ✓',
hint: 'Выберите вариант, чтобы продолжить',
back: '‹ Назад',
badge: '✦ Ваша подборка готова',
cta: 'Перейти к подборке →',
restart: '↺ Пройти ещё раз',
disclaim: 'Перед приёмом добавок, особенно для детей, проконсультируйтесь с врачом.',
footer: 'Рекомендации носят общий характер и не заменяют консультацию врача.',
leadName: 'Ваше имя',
leadPhone: 'Телефон, напр. +380…',
leadConsent:'Соглашаюсь на обработку данных для отправки персональной подборки.',
leadBtn: 'Получить подборку →',
errName: 'Укажите имя',
errPhone: 'Укажите корректный номер',
thanks: 'Спасибо, ',
thanksSub: 'Мы отправим вашу персональную подборку. А пока — посмотрите её прямо сейчас:',
productsTitle: 'Популярное в этой категории:',
loadingProducts: 'Подбираем товары…',
buyBtn: 'Купить'
},
questions: {
start: {
kicker:'Начнём', q:'Для кого подбираем добавки?',
sub:'Покажем только то, что подходит именно вам.', layout:'grid',
options:[
{ ico:'🙋', label:'Для себя', note:'взрослый', next:'sex' },
{ ico:'🧒', label:'Для ребёнка', note:'до 14 лет', next:'kidGoal' }
]
},
sex: {
kicker:'Шаг', q:'Укажите пол',
sub:'Потребности организма различаются — подбор будет точнее.', layout:'two',
options:[
{ ico:'👩', label:'Женщина', next:'womenGoal' },
{ ico:'👨', label:'Мужчина', next:'menGoal' }
]
},
womenGoal: {
kicker:'Ваша цель', q:'Что для вас сейчас важнее всего?',
sub:'Выберите основной запрос — остальное добавите в каталоге.', layout:'list',
options:[
{ ico:'⚡️', label:'Больше энергии', note:'усталость, нет сил', result:'women_energy' },
{ ico:'✨', label:'Красота и молодость', note:'кожа, волосы, ногти', result:'women_beauty' },
{ ico:'🛡️', label:'Укрепить иммунитет', note:'профилактика простуд', result:'women_immune' },
{ ico:'🌙', label:'Сон и спокойствие', note:'стресс, тревожность', result:'women_calm' }
]
},
menGoal: {
kicker:'Ваша цель', q:'Что для вас сейчас важнее всего?',
sub:'Выберите основной запрос — остальное добавите в каталоге.', layout:'list',
options:[
{ ico:'⚡️', label:'Тонус и энергия', note:'усталость, либидо, силы', result:'men_energy' },
{ ico:'💪', label:'Спорт и набор массы', note:'тренировки, восстановление', result:'men_sport' },
{ ico:'🛡️', label:'Укрепить иммунитет', note:'профилактика простуд', result:'men_immune' },
{ ico:'🎯', label:'Сон, стресс и фокус', note:'концентрация', result:'men_focus' }
]
},
kidGoal: {
kicker:'Для ребёнка', q:'Какая главная потребность?',
sub:'Дозировки и формы подберём именно для детского возраста.', layout:'list',
options:[
{ ico:'🛡️', label:'Иммунитет', note:'часто болеет', result:'kid_immune' },
{ ico:'🦴', label:'Рост и крепкие кости', note:'кальций, зубы', result:'kid_growth' },
{ ico:'🧠', label:'Внимание и учёба', note:'концентрация, память', result:'kid_brain' },
{ ico:'🍎', label:'Аппетит и витамины', note:'привередлив в еде', result:'kid_appetite' }
]
}
},
results: {
women_energy: { e:'⚡️', t:'Энергия и железо для женщин', d:'Железо и витамины группы B — поддержка уровня энергии.', tags:['Железо','B12','Энергия'], slug:'iron' },
women_beauty: { e:'✨', t:'Красота: кожа, волосы, ногти', d:'Коллаген и комплексы для кожи, волос и ногтей.', tags:['Коллаген','Биотин','Волосы'], slug:'beauty' },
women_immune: { e:'🛡️', t:'Иммунитет и витамин D', d:'Витамин D, цинк и C — базовая поддержка иммунитета.', tags:['Витамин D','Цинк','Витамин C'], slug:'immune' },
women_calm: { e:'🌙', t:'Сон и спокойствие', d:'Магний, мелатонин и комплексы для сна и снятия стресса.', tags:['Магний','Мелатонин','Сон'], slug:'sleep' },
men_energy: { e:'⚡️', t:'Тонус и энергия для мужчин', d:'Витаминные комплексы для здоровья и тонуса мужчин.', tags:['Мужчинам','Тонус','Витамины B'], slug:'mensHealth' },
men_sport: { e:'💪', t:'Спорт и набор массы', d:'Протеин, креатин и аминокислоты для тренировок и восстановления.', tags:['Протеин','Креатин','BCAA'], slug:'sport' },
men_immune: { e:'🛡️', t:'Иммунитет и витамин D', d:'Витамин D, цинк и C — базовая поддержка иммунитета.', tags:['Витамин D','Цинк','Витамин C'], slug:'immune' },
men_focus: { e:'🎯', t:'Сон, стресс и фокус', d:'Магний и комплексы для концентрации и восстановления.', tags:['Магний','Стресс','Фокус'], slug:'magnesium' },
kid_immune: { e:'🛡️', t:'Иммунитет для детей', d:'Витамин D, C и комплексы для иммунитета в детских формах.', tags:['Витамин D','Витамин C','Детям'], slug:'kidImmune' },
kid_growth: { e:'🦴', t:'Рост, кальций и зубы', d:'Кальций для здорового роста и крепких костей ребёнка.', tags:['Кальций','Витамин D3','Рост'], slug:'kidCalcium' },
kid_brain: { e:'🧠', t:'Внимание и учёба', d:'Витамины для мозга: концентрация во время учёбы.', tags:['Омега-3','Мозг','Память'], slug:'kidBrain' },
kid_appetite: { e:'🍎', t:'Аппетит и общие витамины', d:'Детские мультивитамины для привередливых в еде детей.', tags:['Мультивитамины','Детям','Аппетит'], slug:'kidMulti' }
}
}
};
/* -------------------------------------------------------------------
4. НАЛАШТУВАННЯ ЗА ЗАМОВЧУВАННЯМ (перевизначаються через init)
------------------------------------------------------------------- */
var DEFAULTS = {
lang: 'uk', // 'uk' або 'ru'
utm: 'utm_source=site&utm_medium=quiz&utm_campaign=supplement_picker',
brand: 'dobavki.ua',
maxSteps: 3, // глибина для прогрес-бару
endMode: 'product', // 'product' = рекомендація | 'lead' = форма
onComplete:null, // callback(resultKey, lang)
onLead: null // callback({name,phone,result,lang})
};
/* -------------------------------------------------------------------
5. КОНСТРУКТОР
------------------------------------------------------------------- */
function Quiz(root, opts) {
this.root = root;
this.cfg = Object.assign({}, DEFAULTS, opts || {});
this.lang = (this.cfg.lang === 'ru') ? 'ru' : 'uk';
this.history = []; // ключі пройдених питань (для «Назад»)
this.answers = {}; // зібрані відповіді {questionKey: label} — для аналітики
this.lastResult = null;
this.startedAt = Date.now(); // час старту (для тривалості проходження)
this._build();
this._track('quiz_start', { lang:this.lang });
this.renderQuestion('start');
}
/* Зручний доступ до поточного словника */
Quiz.prototype._t = function () { return I18N[this.lang]; };
Quiz.prototype._ui = function () { return I18N[this.lang].ui; };
/* Будує статичний каркас (шапка, прогрес, сцена, футер) */
Quiz.prototype._build = function () {
var self = this;
this.root.classList.add('quiz');
this.root.innerHTML =
'
' +
'
' +
'
DBAVKI.UA
' +
'
' +
'' +
'
' +
'' +
'' +
'
' +
'
' +
'
' +
'
' +
'' +
'
' +
'' +
'';
this.elStage = this.root.querySelector('.quiz__stage');
this.elProg = this.root.querySelector('.quiz__progress > i');
this.elStep = this.root.querySelector('.quiz__stepno');
this.elTime = this.root.querySelector('.quiz__time');
this.elFoot = this.root.querySelector('.quiz__footer');
// обробники перемикача мови
this.root.querySelectorAll('.quiz__lang button').forEach(function (b) {
b.addEventListener('click', function () { self.setLang(b.getAttribute('data-lang')); });
});
this._applyStatic();
};
/* Оновлює статичні підписи (час, футер, активна мова) під поточну мову */
Quiz.prototype._applyStatic = function () {
var ui = this._ui();
this.elTime.textContent = ui.time;
this.elFoot.textContent = ui.footer;
this.root.querySelectorAll('.quiz__lang button').forEach(function (b) {
b.classList.toggle('is-active', b.getAttribute('data-lang') === this.lang);
}.bind(this));
};
/* Перемикання мови: оновлює підписи й перемальовує поточний екран з нуля */
Quiz.prototype.setLang = function (lang) {
if (lang !== 'uk' && lang !== 'ru') return;
if (lang === this.lang) return;
this.lang = lang;
this._track('quiz_lang_switch', { lang:lang });
this._applyStatic();
// повертаємось на початок, щоб гілки й тексти були консистентні
this.history = [];
this.renderQuestion('start');
};
/* Обчислює % прогресу для індикатора */
Quiz.prototype._pct = function () {
return Math.min(100, Math.round((this.history.length + 1) / (this.cfg.maxSteps + 1) * 100));
};
/* Надсилає подію в dataLayer (GTM/GA4); тихо ігнорує, якщо його немає */
Quiz.prototype._track = function (event, extra) {
try {
global.dataLayer = global.dataLayer || [];
global.dataLayer.push(Object.assign({ event:event }, extra || {}));
} catch (e) {}
};
/* Плавна заміна вмісту сцени.
Контент вставляється ОДРАЗУ (кліки доступні без залежності від таймерів),
fade-in вмикається на наступному кадрі через rAF — надійно скрізь. */
Quiz.prototype._swap = function (html, afterIn) {
var stage = this.elStage;
stage.innerHTML = html;
var slide = stage.querySelector('.quiz__slide');
if (afterIn) afterIn(slide);
var raf = global.requestAnimationFrame || function (f) { return setTimeout(f, 16); };
raf(function () { raf(function () { slide.classList.add('is-in'); }); });
};
/* -------------------------------------------------------------------
6. РЕНДЕР ПИТАННЯ
------------------------------------------------------------------- */
Quiz.prototype.renderQuestion = function (key) {
var self = this;
var ui = this._ui();
var Q = this._t().questions[key];
this.current = key;
this.elProg.style.width = this._pct() + '%';
this.elStep.textContent = ui.step + (this.history.length + 1);
// аналітика: показ кроку (для воронки/drop-off)
this._track('quiz_step_view', { step:this.history.length + 1, question:key, lang:this.lang });
var optsClass = 'quiz__opts' +
(Q.layout === 'two' ? ' is-two' : '') +
(Q.layout === 'grid' ? ' is-two is-grid' : '');
var optsHtml = Q.options.map(function (o, i) {
return '';
}).join('');
var html =
'
' +
'
' + Q.kicker + '
' +
'
' + Q.q + '
' +
(Q.sub ? '
' + Q.sub + '
' : '') +
'
' + optsHtml + '
' +
'
' +
'' +
'' + ui.hint + '' +
'
' +
'
';
this._swap(html, function (slide) {
slide.querySelectorAll('.quiz__opt').forEach(function (btn) {
btn.addEventListener('click', function () {
var opt = Q.options[+btn.getAttribute('data-i')];
self._choose(key, opt, btn);
});
});
var back = slide.querySelector('.quiz__back');
if (self.history.length) {
back.style.visibility = 'visible';
back.addEventListener('click', function () { self.goBack(); });
}
});
};
/* Обробка вибору: підсвітити, зберегти відповідь, далі або до результату */
Quiz.prototype._choose = function (key, opt, btn) {
btn.classList.add('is-sel');
this.history.push(key);
// зберігаємо відповідь (чистий лейбл без приміток) для аналітики й параметрів URL
this.answers[key] = opt.label;
this._track('quiz_answer', { step:this.history.length, question:key, answer:opt.label, lang:this.lang });
if (opt.result) this.renderResult(opt.result);
else if (opt.next) this.renderQuestion(opt.next);
};
/* Повернення на попереднє питання */
Quiz.prototype.goBack = function () {
var prev = this.history.pop();
if (prev) this.renderQuestion(prev);
};
/* -------------------------------------------------------------------
7. ФІНАЛЬНИЙ ЕКРАН
------------------------------------------------------------------- */
Quiz.prototype.renderResult = function (rkey) {
var self = this;
var ui = this._ui();
var R = this._t().results[rkey];
var base = BASE[this.lang];
this.lastResult = rkey;
this.current = '__result';
this.elProg.style.width = '100%';
this.elStep.textContent = ui.done;
// аналітика: завершення з контекстом (тривалість + усі відповіді)
var durationSec = Math.round((Date.now() - this.startedAt) / 1000);
this._track('quiz_complete', {
result:rkey, lang:this.lang, duration_sec:durationSec,
answers:Object.assign({}, this.answers)
});
if (typeof this.cfg.onComplete === 'function') this.cfg.onComplete(rkey, this.lang, this.answers);
// посилання на категорію + UTM + параметри відповідей (атрибуція у GA4)
var path = SLUG[R.slug];
var params = this.cfg.utm;
var ansParams = this._answerParams(); // напр. quiz_for=…&quiz_goal=…
if (ansParams) params += '&' + ansParams;
var link = base + path + (path.indexOf('?') > -1 ? '&' : '?') + params;
// теги — клікабельні: ведуть на пошук по сайту за словом тегу (нова вкладка)
var tags = R.tags.map(function (t) {
var q = base + '/?q=' + encodeURIComponent(t);
return '' + escapeHtml(t) + '';
}).join('');
var formHtml = (this.cfg.endMode === 'lead') ?
'