График работы:

Будние: 09:00–20:00

Сб-Вс: 09:00–19:00

Добавьте товары для сравнения
Добавьте товары в желания
0
Мой заказ
Добавьте товары в корзину

Интернет-магазин витаминов, спортивного питания и товаров для красоты Dobavki.ua

Dobavki UA - заботимся о вашем здоровье и красоте!

 

Современный темп жизни утомляет? Тело устает, истощается нервная система, настроение на нуле. С этим сталкивался каждый:

  • постоянно ощущается недостаток сил, энергии;
  • работа становится скучной, любое занятие не приносит удовольствия;
  • после качественного сна трудно встать с постели, хочется еще отдохнуть;
  • на коже слишком рано появились первые признаки старения.

Список можно продолжать, но ключ к решению проблемы кроется в недостатке питания на клеточном уровне. Вдали от природы, сложно организовать полноценный рацион, поддерживать молодость и красоту кожи.

 

Dobavki UA - это мультибрендовый интернет-магазин витаминов в Украине, где получится найти все необходимое для бодрости тела и духа. Качественная, сертифицированная продукция известных брендов поможет:

  • восстановить обменные процессы в клетках;
  • повысить защитный порог иммунной системы;
  • доставить необходимые микроэлементы и активные добавки;
  • запустить процесс регенерации на клеточном уровне;
  • решить проблемы с усталостью, сонливостью, депрессией.

 

Интернет-магазин спортивного питания в Украине

 

Максимальную эффективность от тренировки можно получить, если комбинировать физические нагрузки и здоровое, насыщенное питание. Последнее подразумевает использование специальных добавок. Ассортимент магазина спортивного питания Dobavki UA предлагает купить:

  1. ZMA для стимуляции выработки тестостерона, соли для кето-диеты, углеродные порошки и другие восстанавливающие порошки.
  2. Стимуляторы перед тренировкой в виде формул с оксидом азота, кофеином.
  3. Аппетитные энергетические батончики с большим процентом белка, протеиновые снэки, вегетарианские и соевые перекусы.
  4. Смеси, используемые для строения мышц, натуральные добавки с мультивитаминной формулой.

 

В поисках надежного магазина спортпита, купить качественные биодобавки недорого реально на нашем сайте. Можно оформить доставку спортпита различного назначения как в Киеве, так и Львове, Харькове, Одессе, Днепре и других городах страны.

Товары для красоты и здоровья в интернет-магазине Dobavki UA

 

Каждая женщина хочет сохранить молодость и естественную красоту. Для этого достаточно подобрать качественные косметические средства, организовать небольшую витаминную подпитку. Наш магазин косметических средств предлагает большой ассортимент товаров эффектного макияжа, продукции для бережного ухода за кожей, волосами и ногтями.

  1. Сыворотки и серумы для восстановления гидро-липидного баланса эпителия;
  2. Кремы, лосьоны, гели со смягчающим эффектом.
  3. Маски для скрабирования и пиллинга, снижения выработки сальных желез.
  4. Тонизирующие крема для выработки коллагена в клетках.
  5. Наборы популярной корейской косметики на основе муцина.

 

В интернет-магазине косметики получится найти масла, аминокислоты, экстракты и вытяжки на натуральной основе, аксессуары для нанесения и снятия макияжа.

 

Заботятся о внешнем виде как женщины, так и мужчины. На Dobavki UA есть все необходимое:

  • для ухода за волосами, телом, лицом;
  • найдутся и средства личной гигиены, такие как нить и ополаскиватели для полости рта;
  • различные гели и шампуни с натуральной основой;
  • масла для ароматерапии.

 

Когда хочется удивить родных или порадовать вторую половинку, закажите подарочный набор косметических средств. Согласно отзывам покупателей, это самый актуальный презент вне зависимости от праздника.

 

Интернет-магазин пищевых добавок: выбирайте здоровье!

 

Ухаживать за организмом стоит прежде всего изнутри. Четкое функционирование каждой системы, органа, тканей и клеток - это гарантия хорошего самочувствия и настроения. Чтобы предупредить заболевания и отложить старость, посетите интернет-магазин БАДов. Комплекс ухода за телом включает:

  1. Группу витаминов B, фолиевую кислоту, витамины A, C, D, K.
  2. Добавки для повышения прочности костей и эластичности суставов.
  3. Незаменимые для организма Аминокислоты.
  4. Препараты для повышения женской фертильности.
  5. Микроэлементы, необходимые для конкретной системы.
  6. Добавки для поддержания диеты, настройки ежедневного рациона.
  7. Травы и гомеопатические товары для здоровья в интернет-магазине Dobavki UA.

 

Безопасные товары для детей на натуральной основе

 

Приглашаем купить детские товары в интернет-магазине 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 = '
' + '
' + '' + '
' + '' + '
' + '' + '' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + ''; 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') ? '
' + '
' + '' + '
' + ui.errName + '
' + '
' + '
' + '' + '
' + ui.errPhone + '
' + '
' + '' + '' + '
' : '' + ui.cta + ''; var html = '
' + '
' + '
' + ui.badge + '
' + '
' + R.e + '
' + '
' + '

' + R.t + '

' + R.d + '

' + '
' + tags + '
' + '
' + // сюди підвантажаться товари formHtml + '' + '
' + ui.disclaim + '
' + '
'; this._swap(html, function (slide) { var go = slide.querySelector('[data-act="go"]'); if (go) go.addEventListener('click', function () { self._track('quiz_add_to_cart', { result:rkey, lang:self.lang }); try { global.localStorage.setItem('src_quiz', '1'); } catch (e) {} }); var lead = slide.querySelector('[data-act="lead"]'); if (lead) lead.addEventListener('click', function () { self._submitLead(slide, link); }); slide.querySelector('.quiz__restart').addEventListener('click', function () { self.history = []; self.answers = {}; self.startedAt = Date.now(); self.renderQuestion('start'); }); // підвантаження товарів (динамічно з фолбеком) self._loadProducts(R.slug, slide.querySelector('[data-slot="products"]'), base); // аналітика: клік по тегу slide.querySelectorAll('[data-tag]').forEach(function (a) { a.addEventListener('click', function () { self._track('quiz_tag_click', { tag:a.getAttribute('data-tag'), result:rkey, lang:self.lang }); }); }); }); }; /* Формує query-параметри з відповідей: quiz_for=Для+себе&quiz_goal=... */ Quiz.prototype._answerParams = function () { var map = { start:'quiz_for', sex:'quiz_sex', womenGoal:'quiz_goal', menGoal:'quiz_goal', kidGoal:'quiz_goal' }; var parts = []; for (var k in this.answers) { if (map[k]) parts.push(map[k] + '=' + encodeURIComponent(this.answers[k])); } return parts.join('&'); }; /* ------------------------------------------------------------------- 7b. ТОВАРИ НА ФІНАЛІ Намагається підвантажити актуальні топ-товари категорії наживо (fetch + парсинг каталогу — працює, коли квіз на тому ж домені). Якщо недоступно (інший домен / прев'ю) — показує фолбек із FALLBACK_PRODUCTS. ------------------------------------------------------------------- */ Quiz.prototype._loadProducts = function (slugKey, slot, base) { if (!slot) return; var self = this; var catPath = SLUG[slugKey]; slot.innerHTML = '
' + this._ui().loadingProducts + '
'; var done = function (items, live) { if (!items || !items.length) { slot.innerHTML = ''; return; } // дедуплікація по бренду + обмеження до 3 — щоб товари були різні self._renderProducts(slot, self._diversify(items, 3), base, live); }; // спроба живого підвантаження (same-origin) var tryLive = function () { try { return fetch(base + catPath, { credentials:'same-origin' }) .then(function (r) { return r.text(); }) .then(function (html) { var doc = new DOMParser().parseFromString(html, 'text/html'); // беремо БІЛЬШЕ карток (до 15), щоб було з чого вибирати різні бренди var cards = [].slice.call(doc.querySelectorAll('.catalogCard')).slice(0, 15).map(function (c) { var a = c.querySelector('a[href*="/"]'), img = c.querySelector('img'), name = c.querySelector('[class*="name"],[class*="title"]'), price = c.querySelector('.catalogCard-price'); return { href: a ? a.getAttribute('href') : null, n: name ? name.textContent.trim().replace(/\s+/g, ' ') : '', p: price ? price.textContent.trim().replace(/\s+/g, ' ') : '', img: img ? (img.getAttribute('data-src') || img.src) : '' }; }).filter(function (x) { return x.href; }); if (cards.length) { done(cards, true); } else { done(FALLBACK_PRODUCTS[slugKey], false); } }) .catch(function () { done(FALLBACK_PRODUCTS[slugKey], false); }); } catch (e) { done(FALLBACK_PRODUCTS[slugKey], false); return null; } }; tryLive(); }; /* Відомі бренди — для визначення бренду товару за назвою */ var KNOWN_BRANDS = ['Now Foods','Solaray','Bluebonnet','Doctor\u2019s Best','Doctors Best', 'Life Extension','Carlson','Source Naturals','California Gold','Jarrow','Thorne', 'Garden of Life','Nature\u2019s Way','Natrol','Solgar','Nutiva','Swanson','21st Century', '21st Сentury','Country Life','Bluebonnet Nutrition','Sports Research','MegaFood']; /* Повертає бренд товару (відомий або перше слово назви) */ function productBrand(name) { var low = (name || '').toLowerCase(); for (var i = 0; i < KNOWN_BRANDS.length; i++) { var b = KNOWN_BRANDS[i].toLowerCase().replace(/\u2019/g, ''); if (low.replace(/\u2019/g, '').indexOf(b) > -1) return KNOWN_BRANDS[i]; } return (name || '').split(/[\s,]/)[0] || name; } /* Дедуплікація: не більше одного товару від бренду, поки набирається limit. Якщо різних брендів менше за limit — добираємо рештою (щоб завжди було 3). */ Quiz.prototype._diversify = function (items, limit) { var seen = {}, picked = [], rest = []; for (var i = 0; i < items.length; i++) { var b = productBrand(items[i].n); if (!seen[b]) { seen[b] = 1; picked.push(items[i]); } else { rest.push(items[i]); } if (picked.length >= limit) break; } // якщо унікальних брендів не вистачило — добираємо з решти for (var j = 0; picked.length < limit && j < rest.length; j++) picked.push(rest[j]); return picked.slice(0, limit); }; /* Малює картки товарів */ Quiz.prototype._renderProducts = function (slot, items, base, live) { var self = this; var ui = this._ui(); var cards = items.map(function (it) { // нормалізація: на укр-версії лишаємо /ua/, на рос — без префікса var full; if (self.lang === 'uk') { full = 'https://dobavki.ua' + (it.href.indexOf('/ua/') === 0 ? it.href : '/ua' + it.href); } else { full = 'https://dobavki.ua' + it.href.replace('/ua/', '/'); } full += (full.indexOf('?') > -1 ? '&' : '?') + self.cfg.utm; // і фото/назва, і кнопка «Купити» — відкривають сторінку товару в НОВІЙ вкладці return '
' + '' + '' + '' + '' + escapeHtml(it.n) + '' + (it.p ? '' + escapeHtml(it.p) + '' : '') + '' + '' + '' + ui.buyBtn + '' + '
'; }).join(''); slot.innerHTML = '
' + ui.productsTitle + '
' + cards; // аналітика: клік по товару (нова вкладка) і клік «Купити» slot.querySelectorAll('[data-open]').forEach(function (a) { a.addEventListener('click', function () { self._track('quiz_product_open', { result:self.lastResult, lang:self.lang, live:!!live }); }); }); slot.querySelectorAll('[data-buy]').forEach(function (a) { a.addEventListener('click', function () { self._track('quiz_product_buy', { result:self.lastResult, lang:self.lang, live:!!live }); }); }); }; /* Валідація та обробка форми збору ліда */ Quiz.prototype._submitLead = function (slide, link) { var ui = this._ui(); var nameF = slide.querySelector('input[name="name"]').closest('.quiz__field'); var phoneF = slide.querySelector('input[name="phone"]').closest('.quiz__field'); var name = nameF.querySelector('input').value.trim(); var phone = phoneF.querySelector('input').value.trim(); var ok = true; nameF.classList.remove('is-err'); phoneF.classList.remove('is-err'); if (name.length < 2) { nameF.classList.add('is-err'); ok = false; } if (phone.replace(/\D/g, '').length < 9) { phoneF.classList.add('is-err'); ok = false; } if (!ok) return; this._track('quiz_lead', { result:this.lastResult, lang:this.lang }); if (typeof this.cfg.onLead === 'function') { this.cfg.onLead({ name:name, phone:phone, result:this.lastResult, lang:this.lang }); } this._swap( '
' + '
' + '

' + ui.thanks + escapeHtml(name) + '!

' + '

' + ui.thanksSub + '

' + '' + ui.cta + '' + '
' ); }; /* Утиліта екранування для безпечного виводу імені */ function escapeHtml(s) { return String(s).replace(/[&<>"']/g, function (c) { return { '&':'&','<':'<','>':'>','"':'"',"'":''' }[c]; }); } /* ------------------------------------------------------------------- 8. ПУБЛІЧНИЙ API ------------------------------------------------------------------- */ var SupplementQuiz = { init: function (target, opts) { var el = (typeof target === 'string') ? document.querySelector(target) : target; if (!el) { console.warn('SupplementQuiz: контейнер не знайдено →', target); return null; } return new Quiz(el, opts); }, i18n: I18N, slugs: SLUG, base: BASE }; global.SupplementQuiz = SupplementQuiz; })(window); // ---- запуск ---- function boot() { injectFonts(); injectStyles(); var box = ensureContainer(); var lang = START_LANG; if (lang === 'auto') { var h = (document.documentElement.getAttribute('lang') || '').toLowerCase(); lang = (/uk|ua/.test(h) || location.pathname.indexOf('/ua/') === 0) ? 'uk' : 'ru'; } if (window.SupplementQuiz) { window.SupplementQuiz.init(box, { lang: lang, endMode: 'product' }); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', boot); } else { boot(); } })();