Анализ сайта ultimatereset.com
Основное Готовность: 40%
Домен
ultimatereset.com
Состояние доменного имени
?
Проверяем корректность доменного имени и наличие технических проблем на уровне домена.
Длина домена велика. Но если вы продвигаете запрос, входящий в название домена, то это хорошо.
Домен второго уровня идеален для продвижения.
Ответ сервера
200 Успешный ответ
HTTP-код ответа и цепочка редиректов
?
Код 200 — страница доступна. Коды 3xx — редиректы (цепочки замедляют загрузку и размывают ссылочный вес). Коды 4xx/5xx — ошибки, поисковик не сможет проиндексировать страницу.
Кол-во редиректов 3 слишком большое! Проверьте настройки сайта и веб-сервера!
Цепочка редиректов:
http://ultimatereset.com
301 MovedPermanently
https://ultimatereset.com/
301 MovedPermanently
https://shop.bodi.com/products/ultimate-reset-cleanse
200 OK
Безопасность
Сайт безопасен
Использование HTTPS и SSL-сертификат
?
HTTPS — обязательный стандарт. Google и Яндекс отдают предпочтение защищённым сайтам. Отсутствие SSL или просроченный сертификат ведут к предупреждениям в браузере и снижению позиций.
На сайте работает защищенный протокол ssl и сайт открывается по https.
Ssl-сертификат действителен до 10.11.2026 5:19:28.
Сервер поддерживает HTTP/3 (QUIC) — новейший протокол.
Включён HSTS (Strict-Transport-Security) — защита от подмены на http.
HTTP автоматически перенаправляется на HTTPS.
Поздравляем! Сайт не содержится в реестре РКН.
Кодировка
utf-8
Кодировка символов страницы
?
Стандарт — UTF-8. Неправильная кодировка вызывает нечитаемые символы и мешает поисковику корректно распознать текст страницы.
Указана кодировка на странице utf-8.
Язык
en-US
Атрибут lang в HTML-теге
?
Атрибут lang (<html lang="ru">) сообщает поисковикам и браузерам, на каком языке написана страница. Помогает при ранжировании в региональном поиске.
Язык документа указан явно: en-US.
Скорость загрузки
~1,91сек
Время отклика сервера (TTFB)
?
Time To First Byte — время до получения первого байта от сервера. Норма до 200 мс. Медленный отклик ухудшает пользовательский опыт и ранжирование: Яндекс и Google учитывают скорость страниц.
Скорость загрузки сайта 1,91сек превышает 1 секунду. Желательно улучшить работу сайта!
Объем документа
1008Кб
Размер HTML-кода страницы
?
Слишком большой HTML замедляет парсинг браузером и сканирование поисковым роботом. Рекомендуется не более 200 Кб.
Объем html-документа 1008Кб оптимален.
Структура html-документа корректна.
Ресурсы
Ресурсы: 75
Внешние ресурсы страницы (CSS, JS, изображения)
?
Количество и тип подключённых ресурсов влияют на скорость загрузки. Большое число запросов увеличивает время рендеринга страницы.
Кол-во файлов ресурсов 75 много для одной страницы. Приемлемо до 10. Проведите оптимизацию файлов ресурсов!
Показать полный список ресурсов
| Тип | Название | Значение |
|---|---|---|
| stylesheet | text/css | //shop.bodi.com/cdn/shop/t/2/assets/base.css?v=8347266990213209041787249014 |
| stylesheet | text/css | //shop.bodi.com/cdn/shop/t/2/assets/rebuy-theme.css?v=73608269168498189851785366599 |
| stylesheet | text/css | //shop.bodi.com/cdn/shop/t/2/assets/bodi-variables.css?v=25425319673482810351785183123 |
| stylesheet | text/css | //shop.bodi.com/cdn/shop/t/2/assets/bodi-button.css?v=76464293361381150481772584678 |
| stylesheet | text/css | //shop.bodi.com/cdn/shop/t/2/assets/recharge-widget-custom.css?v=37551898691326839791775061561 |
| stylesheet | text/css | //shop.bodi.com/cdn/shop/t/2/assets/fonts.css?v=65180414247502642671771353745 |
| stylesheet | https://shop.bodi.com/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css | |
| stylesheet | //shop.bodi.com/cdn/shop/t/2/compiled_assets/styles.css?v=93442057495055766271786651045 | |
| stylesheet | text/css | https://cdn.shopify.com/extensions/01a02574-6390-715b-9622-33ef4acfdaa1/judgeme-719/assets/shopify_v2.css |
| stylesheet | text/css | //shop.bodi.com/cdn/shop/t/2/assets/bodi-navigation-v2.css?v=159511681351450557791787249607 |
| stylesheet | text/css | //shop.bodi.com/cdn/shop/t/2/assets/template-supplement.css?v=92572355177561154461774384456 |
| stylesheet | text/css | //cdn.shopify.com/extensions/01a02a5e-4408-7c7a-9527-a6da7e3811a9/stamp-variants-collection-1136/assets/sezerium-section.min.css |
| stylesheet | text/css | //cdn.shopify.com/extensions/01a02a5e-4408-7c7a-9527-a6da7e3811a9/stamp-variants-collection-1136/assets/sezerium-pagination.css |
| js | https://cmp.osano.com/AzZcuESCJWcN06dnY/78e4eb78-19d0-49d6-8a60-7844570c4b3c/osano.js?v=v1.6.0 | |
| js | module | https://cdn.intelligems.io/esm/bb0373470a9f/bundle.js |
| js | /cdn/shopifycloud/importmap-polyfill/es-modules-shim.2.4.0.js | |
| js | //shop.bodi.com/cdn/shop/t/2/assets/collection-redirect.js?v=62810136546219965471771353645 | |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/quick-add.js?v=74531385036627369001771353646 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/dialog.js?v=138083190563882019441771353646 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/variant-picker.js?v=3281787361353841661785264054 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/product-card.js?v=23015674819649003541771353644 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/product-form.js?v=88643593872554363261780502833 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/accordion-custom.js?v=78770727478219950621772670204 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/media.js?v=37825095869491791421771353646 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/product-price.js?v=30079423257668675401771353645 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/cadence-text.js?v=41169851286431607791771353646 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/variant-checklist.js?v=37514240127249512841771353646 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/updateButtonVariant.js?v=180672249296976698911771353645 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/variant-metafield-text.js?v=73665773763318208401773185238 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/product-title-truncation.js?v=81744426891537421781771353645 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/product-inventory.js?v=16343734458933704981771353644 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/show-more.js?v=94563802205717136101771353646 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/slideshow.js?v=56396194353539668521774505754 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/anchored-popover.js?v=143092715850611436701771353644 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/floating-panel.js?v=128677600744947036551771353645 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/video-background.js?v=157395678258090420911774359966 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/component-quantity-selector.js?v=56330027151833116691771353646 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/component-quantity-selector-dropdown.js?v=81553553732033357941775061559 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/media-gallery.js?v=86507175541302397441775061561 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/rte-formatter.js?v=101420294193111439321771353644 |
| js | //shop.bodi.com/cdn/shop/t/2/assets/auto-close-details.js?v=58350291535404441581771353645 | |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/socialladder.js?v=27479865096865235401771353644 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/cart-listener.js?v=55740414390312000901786551773 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/tracking-codes.js?v=36063638829081886981776873393 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/add-to-cart-link.util.js?v=118114068868411519331780502831 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/locale-switcher.js?v=45869995406809579801776873392 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/sierra.js?v=111282827850437561821787001127 |
| js | //shop.bodi.com/cdn/shop/t/2/assets/bodi-auth-redirect.js?v=13934401950456957671772843289 | |
| js | text/javascript | https://www.zeropartyforms.com/w37htfhcq2/vendor/0d1ee324-9c1b-4837-88cd-a5a4a387633a/lightbox_speed.js |
| js | text/javascript | https://cdn.rebuyengine.com/onsite/js/storefront-helper.js |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/accertify-data-collector.js?v=167219477265726170741772584677 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/amplitude-device-id-cart.js?v=28193483641527377311777477953 |
| js | /checkouts/internal/preloads.js?locale=en-US&default_configuration_id=2781839577 | |
| js | https://shop.app/checkouts/internal/preloads.js?locale=en-US&default_configuration_id=2781839577&shop_id=75560616153 | |
| js | module | //shop.bodi.com/cdn/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js |
| js | //shop.bodi.com/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js | |
| js | //shop.bodi.com/cdn/shopifycloud/storefront/assets/shopify_pay/storefront-bf1cdb70.js?v=20250812 | |
| js | //cdn.shopify.com/shopifycloud/storefront/assets/storefront/origin_trials-5059b83f.js | |
| js | //shop.bodi.com/cdn/shop/t/2/compiled_assets/scripts.js?v=49248537996957404821776268639 | |
| js | //shop.bodi.com/cdn/shop/t/2/compiled_assets/snippet-scripts.js?v=73062019679739540421781245921 | |
| js | text/javascript | https://cdn.shopify.com/extensions/01a0248f-54b2-7a40-a9aa-95df5b5813a4/rebuy-personalization-engine-399/assets/rebuy-extensions.js |
| js | text/javascript | https://cdn.shopify.com/extensions/01a02574-6390-715b-9622-33ef4acfdaa1/judgeme-719/assets/loader.js |
| js | https://shop.bodi.com/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.8.4.min.js | |
| js | //shop.bodi.com/cdn/shop/t/2/assets/bodi-navigation-v2.js?v=50864461246443612911776268627 | |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/critical.js?v=174785851206309248281781245567 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/zoom-dialog.js?v=67809429400448230651771353646 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/drag-zoom-wrapper.js?v=139025577638372858751771353646 |
| js | https://cdn.jsdelivr.net/npm/@panzoom/panzoom@4.6.1/dist/panzoom.min.js | |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/accordion-custom.js?v=78770727478219950621772670204 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/dialog.js?v=138083190563882019441771353646 |
| js | module | //shop.bodi.com/cdn/shop/t/2/assets/predictive-search.js?v=137734153844302985541771353646 |
| js | https://cdn.rebuyengine.com/onsite/js/rebuy.js?shop=xragki-mv.myshopify.com | |
| js | https://cdn.shopify.com/extensions/01a02a5e-4408-7c7a-9527-a6da7e3811a9/stamp-variants-collection-1136/assets/sezerium-section-helpers.min.js | |
| js | https://cdn.shopify.com/extensions/01a02a5e-4408-7c7a-9527-a6da7e3811a9/stamp-variants-collection-1136/assets/sezerium-variant.min.js | |
| js | module | https://cdn.shopify.com/storefront/standard-actions.js |
Серверные заголовки
Кол-во: 26
HTTP-заголовки ответа сервера
?
Заголовки сервера передают браузеру и поисковику служебную информацию: кеширование, безопасность (CSP, HSTS), сжатие (gzip). Правильная настройка ускоряет загрузку и повышает защищённость.
Найдены серверные заголовки 26шт. Подробнее про серверные заголовки.
Показать полный список серверных заголовков
| Ключ | Значение |
|---|---|
| Date | Sat, 22 Aug 2026 22:03:41 GMT |
| x-download-options | noopen |
| Set-Cookie | localization=US; path=/; expires=Sun, 22 Aug 2027 22:03:41 GMT; SameSite=Lax |
| Link | <https://cdn.shopify.com>; rel="preconnect", <https://cdn.shopify.com>; rel="preconnect"; crossorigin, <https://cmp.osano.com>; rel="preconnect", <https://cmp.osano.com/AzZcuESCJWcN06dnY/78e4eb78-19d0-49d6-8a60-7844570c4b3c/osano.js?v=v1.6.0>; as="script"; rel="preload", <//shop.bodi.com/cdn/shop/t/2/assets/base.css?v=8347266990213209041787249014>; as="style"; rel="preload", <//shop.bodi.com/cdn/shop/t/2/assets/rebuy-theme.css?v=73608269168498189851785366599>; as="style"; rel="preload", <//shop.bodi.com/cdn/shop/t/2/assets/bodi-variables.css?v=25425319673482810351785183123>; as="style"; rel="preload", <//shop.bodi.com/cdn/shop/t/2/assets/bodi-button.css?v=76464293361381150481772584678>; as="style"; rel="preload", <//shop.bodi.com/cdn/shop/t/2/assets/recharge-widget-custom.css?v=37551898691326839791775061561>; as="style"; rel="preload", <//shop.bodi.com/cdn/shop/t/2/assets/fonts.css?v=65180414247502642671771353745>; as="style"; rel="preload", <//shop.bodi.com/cdn/shop/t/2/assets/collection-redirect.js?v=62810136546219965471771353645>; as="script"; rel="preload", <//shop.bodi.com/cdn/shop/t/2/assets/overflow-list.css?v=34391953743431886101781245840>; as="style"; rel="preload", <https://shop.bodi.com/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css>; as="style"; rel="preload"; crossorigin |
| speculation-rules | "/cdn/shopifycloud/storefront/assets/storefront/horizon.specrules-5654ba2e.json" |
| X-Request-ID | 67c44204-14f9-426d-818d-27c58142749b-1787436220 |
| x-permitted-cross-domain-policies | none |
| nel | {"report_to":"cf-nel","success_fraction":0.01,"max_age":604800} |
| shopify-complexity-score | 0 |
| shopify-complexity-score-v2 | 429 |
| X-Frame-Options | DENY |
| Content-Security-Policy | block-all-mixed-content; frame-ancestors 'none'; upgrade-insecure-requests; |
| Access-Control-Allow-Origin | * |
| Strict-Transport-Security | max-age=7889238 |
| Vary | accept-encoding |
| Alt-Svc | h3=":443" |
| powered-by | Shopify |
| Server-Timing | processing;dur=438;desc="gc:7", db;dur=121, db_async;dur=5.569, render;dur=212, asn;desc="200044", edge;desc="HEL", country;desc="RU", theme;desc="157605626073", pageType;desc="product", servedBy;desc="9xxv", requestID;desc="67c44204-14f9-426d-818d-27c58142749b-1787436220", _y;desc="09695234-edfe-4cc1-bb5d-8528f6ee2a71", _s;desc="d73dee9c-ae99-46f8-9920-7b8aaf6c896c", _cmp;desc="3.AMPS_RU_f_f_wHRX4rzBRK-v0tdyPmf6tg", compressionLevel;desc="5", compressionTime;dur=22.393 |
| x-dc | gcp-europe-west4,gcp-europe-west1,gcp-europe-west1 |
| X-XSS-Protection | 1; mode=block |
| cf-cache-status | DYNAMIC |
| Server | cloudflare |
| report-to | {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=4iZdLAyc01hO4tFpXKC7Fn16aCBLEX4OUrW8VCjLT6kXotF24FRHoYIzok0Q50cSIUf%2FcWBLDMM7W6aB9NGx4kRFaGkoLJD8%2BLly%2Fb4MHlm%2B9yvFgu%2FsQGkxkpPVIis%3D"}]} |
| X-Content-Type-Options | nosniff |
| ETag | W/"page_cache:75560616153:ProductDetailsController:2aad5566c4592822fcede0211071af50:45ef212b16fb6726d2c547489e34eb59" |
| cf-ray | a2f52b3b4e8cf476-HEL |
CMS
Система управления сайтом (движок)
?
CMS — это движок, на котором работает сайт (WordPress, 1C-Bitrix, Tilda и др.). Знание CMS помогает понять возможности SEO-оптимизации и подобрать подходящие инструменты. «Не определена» — вероятно, самописный сайт или нестандартная сборка.
Сайт работает на CMS PrestaShop.
Веб-сервер
Программное обеспечение сервера
?
Веб-сервер — это ПО, которое отдаёт страницы посетителям (nginx, Apache, IIS, LiteSpeed и др.). Определяется по серверным заголовкам ответа (Server, X-Powered-By и т.п.). «Не определён» — сервер намеренно скрывает эти заголовки, это нормальная практика безопасности.
Сайт работает на веб-сервере Cloudflare.
Мета-теги Готовность: 23%
Title
Ultimate Reset | 3-week healthy cleanse program | BODi
Заголовок страницы в браузере и поисковой выдаче
?
Title — главный SEO-заголовок страницы. Влияет на CTR в поиске и ранжирование. Оптимальная длина: 50–70 символов. Ключевые слова — ближе к началу.
Необходимо уменьшить число символов в title (текущее значение: 54, оптимально: от 40 до 45)
Дублей словоформ в title не найдено.
Description
A comprehensive set of six supplements and a no-starvation meal plan will help you feel invigorated and lose weight in 21 days.*
Описание страницы в поисковой выдаче (сниппет)
?
Meta Description — текст под заголовком в выдаче. Напрямую на позиции не влияет, но влияет на CTR. Оптимальная длина: 120–160 символов.
Число символов в description 128 оптимально (норма: от 120 до 130).
Keywords
Список ключевых слов страницы (устаревший тег)
?
Meta Keywords не учитывается Яндексом и Google для ранжирования с 2009–2012 годов. Заполнение не обязательно, но не вредит. Конкурент может использовать содержимое для анализа.
Установите мета-тег keywords!
Канонический Url
https://shop.bodi.com/products/ultimate-reset-cleanse
Указывает поисковику основную версию страницы
?
Canonical (rel=canonical) предотвращает проблему дублей страниц. Должен точно совпадать с URL проверяемой страницы. Неправильный canonical может передать ссылочный вес на другую страницу.
Канонический Url прописан корректно.
Robots
index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1
Директивы для поисковых роботов на уровне страницы
?
Meta Robots управляет индексацией конкретной страницы: index/noindex — индексировать ли, follow/nofollow — следовать ли по ссылкам. Noindex полностью исключает страницу из поиска.
Meta-тег robots со значениями index, follow не накладывает ограничений на индексирование и показ контента.
Адаптивность
width=device-width,initial-scale=1,viewport-fit=cover
Настройка масштабирования на мобильных устройствах
?
Тег viewport (<meta name="viewport">) сообщает браузеру, как масштабировать страницу на мобильных. Стандарт: width=device-width, initial-scale=1. Отсутствие — признак отсутствия мобильной версии.
Meta-тег viewport со значением-константой width=device-width задаёт ширину страницы в соответствии с размером экрана.
Meta-тег viewport со значением initial-scale=1.0 определяет масштаб 1:1, т.е. «не масштабировать».
Разметка OpenGraph
Кол-во: 11
Мета-теги для красивых превью в соцсетях
?
OpenGraph (og:title, og:description, og:image) управляет тем, как страница выглядит при репосте в социальных сетях и мессенджерах. Отсутствие OG-тегов — невзрачный превью при шеринге.
Разметка OpenGraph задана. Страница оптимизирована под социальные сети.
Показать полный список og мета-тегов
| Тип | Значение |
|---|---|
| og:site_name | BODi |
| og:url | https://shop.bodi.com/products/ultimate-reset-cleanse |
| og:locale | en_US |
| og:type | product |
| og:title | Ultimate Reset | 3-week healthy cleanse program | BODi |
| og:description | A comprehensive set of six supplements and a no-starvation meal plan will help you feel invigorated and lose weight in 21 days.* |
| og:image | https://shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737 |
| og:image:height | 2648 |
| og:image:width | 2648 |
| og:availability | backorder |
| og:price:standard_amount | 199.95 |
Все мета-теги
Кол-во: 27
Полный список мета-тегов страницы
?
Таблица всех meta-тегов, включая нестандартные. Позволяет найти опечатки, дубли и лишние теги.
Найдены мета-теги 27шт. Мета-теги не видимы для человека и предназначены для обмена информацией между веб-страницей и поисковыми системами, браузерами и другими веб-службами. С ними роботы 🤖 и устройства ведут себя более ожидаемо.
Показать полный список мета-тегов
| Тип | Название | Значение |
|---|---|---|
| name | viewport | width=device-width,initial-scale=1,viewport-fit=cover |
| name | view-transition | same-origin |
| name | theme-color | #161819 |
| name | shopify-digital-wallet | /75560616153/digital_wallets/dialog |
| name | shopify-checkout-api-token | 8a16876903fe96fbabfc6c4c4c6257e6 |
| name | description | A comprehensive set of six supplements and a no-starvation meal plan will help you feel invigorated and lose weight in 21 days.* |
| name | robots | index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1 |
| name | twitter:card | summary_large_image |
| name | shopify-y | 09695234-edfe-4cc1-bb5d-8528f6ee2a71 |
| name | shopify-s | d73dee9c-ae99-46f8-9920-7b8aaf6c896c |
| name | new-cookie-storage-activated | f |
| property | og:site_name | BODi |
| property | og:url | https://shop.bodi.com/products/ultimate-reset-cleanse |
| property | og:locale | en_US |
| property | og:type | product |
| property | og:title | Ultimate Reset | 3-week healthy cleanse program | BODi |
| property | og:description | A comprehensive set of six supplements and a no-starvation meal plan will help you feel invigorated and lose weight in 21 days.* |
| property | og:image | https://shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737 |
| property | og:image:height | 2648 |
| property | og:image:width | 2648 |
| property | og:availability | backorder |
| property | product:availability | available for order |
| property | product:condition | new |
| property | product:price:amount | 149.96 |
| property | product:price:currency | USD |
| property | product:retailer_item_id | MDSUCLN2101 |
| property | og:price:standard_amount | 199.95 |
Оптимизация Готовность: 82%
Структура
Ошибок нет
Семантические HTML-элементы страницы
?
Проверяет наличие основных структурных элементов: nav, header, footer, main. Корректная семантическая структура помогает поисковику понять архитектуру страницы.
Структура документа корректна (теги <html> и <body> присутствуют в одном экземпляре).
Контент
Ошибок нет
Объём и качество текстового содержимого
?
Анализирует объём полезного текста на странице. Слишком мало — страница может считаться малополезной. Слишком много — ухудшается читаемость и восприятие.
Слова из title 6 встречаются в тексте достаточно.
Абзацев с текстом 53 достаточно.
Среднее число слов в абзаце 33 достаточно.
Кол-во знаков контента 17443 на странице оптимально.
Кол-во слов 2842 на странице оптимально.
Заголовки
Ошибок нет
Иерархия заголовков H1–H6
?
H1 должен быть один и содержать ключевой запрос. H2–H6 описывают подразделы. Пропуск уровней (H1 → H3) и несколько H1 — типичные ошибки, снижающие понятность страницы для поисковика.
На странице присутствуют заголовки <h1> 1. Это прекрасно.
На странице присутствуют заголовки <h2> 6. Это хорошо.
На странице присутствуют заголовки <h3> 7.
Тошнота
5,57
Насколько одно слово доминирует в тексте
?
Классическая тошнота = √(частота самого повторяющегося слова). Норма до 7–8: текст воспринимается естественно. Выше — поисковик может счесть страницу переспамленной.
Тошнота превышает норму 5. Измените текст страницы!
Академич. тошнота
18,47%
Насколько текст перенасыщен ключевыми словами
?
Академическая тошнота = (частота слова / общее количество слов) × 100%. Показывает долю конкретного слова в тексте. Норма 5–15%.
Академическая тошнота превышает норму 5-15%. Измените текст страницы!
Семантическое ядро
20
Наиболее часто встречающиеся слова на странице
?
Топ слов по частоте использования. Показывает, какие слова доминируют в тексте с точки зрения поисковика.
Контент страницы содержит осмысленный текст и слова.
Показать список слов
| Слово | Кол-во | Частота |
|---|---|---|
| ultimate | 31 | 1,09% |
| support | 19 | 0,67% |
| health | 12 | 0,42% |
| nutrition | 11 | 0,39% |
| program | 11 | 0,39% |
| supplements | 10 | 0,35% |
| results | 9 | 0,32% |
| supplement | 8 | 0,28% |
| english | 8 | 0,28% |
| subscriptions | 8 | 0,28% |
| subscription | 8 | 0,28% |
| formulated | 8 | 0,28% |
| products | 7 | 0,25% |
| ingredients | 7 | 0,25% |
| account | 6 | 0,21% |
| healthy | 6 | 0,21% |
| weight | 6 | 0,21% |
| better | 6 | 0,21% |
| "@type": | 6 | 0,21% |
| turmeric | 6 | 0,21% |
Индексация Готовность: 0%
Индексирование
Ошибок нет
Разрешено ли индексирование страницы
?
Проверяет, не закрыта ли страница от индексации через robots.txt, meta robots или X-Robots-Tag. Страница, закрытая от индексации, не появится в поисковой выдаче.
Анкоров на странице 117 оптимально. Поисковые роботы обязательно проиндексируют сайт.
Robots.txt
Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Кол-во редиректов для файла robots.txt 3 слишком большое! Это может вызывать затруднение при индексации поисковыми роботами!
Проверяемая страница не запрещена в robots.txt.
Robots.txt доступен по постоянному адресу
Цепочка редиректов для файла robots.txt:
http://ultimatereset.com/robots.txt
301 MovedPermanently
https://ultimatereset.com/robots.txt
301 MovedPermanently
https://shop.bodi.com/products/ultimate-reset-cleanse
200 OK
Показать содержимое robots.txt
<!doctype html>
<html
class="no-js"
lang="en-US"
>
<head>
<script id="osano-script" src="https://cmp.osano.com/AzZcuESCJWcN06dnY/78e4eb78-19d0-49d6-8a60-7844570c4b3c/osano.js?v=v1.6.0"></script>
<style data-shopify>
.osano-cm-widget {
display: none;
}
</style>
<script>
window.Shopify = window.Shopify || {theme: {id: 157605626073, role: 'main' } };
window._template = {
directory: "",
name: "product",
suffix: "supplement"
};
window.__productIdFromTemplate = 9413928616153;
window.__plpCollectionIdFromTemplate = null;
window.igProductData = (function() {
const data = {};data["9413928616153"] = {
productId: 9413928616153,
handle: "ultimate-reset-cleanse",
tags: ["cleanses","Supplement","targetedsupplements","UltimateReset"],
collectionIds: [454624739545,447976702169],
inventory: -1477,
lowestVariantPrice: 14996
};return data;
})();
</script>
<script type="module" blocking="render" fetchpriority="high" src="https://cdn.intelligems.io/esm/bb0373470a9f/bundle.js" data-em-disable async></script>
<link href="//shop.bodi.com/cdn/shop/t/2/assets/overflow-list.css?v=34391953743431886101781245840" as="style" rel="preload">
<link href="//shop.bodi.com/cdn/shop/t/2/assets/base.css?v=8347266990213209041787249014" rel="stylesheet" type="text/css" media="all" />
<link href="//shop.bodi.com/cdn/shop/t/2/assets/rebuy-theme.css?v=73608269168498189851785366599" rel="stylesheet" type="text/css" media="all" />
<link href="//shop.bodi.com/cdn/shop/t/2/assets/bodi-variables.css?v=25425319673482810351785183123" rel="stylesheet" type="text/css" media="all" />
<link href="//shop.bodi.com/cdn/shop/t/2/assets/bodi-button.css?v=76464293361381150481772584678" rel="stylesheet" type="text/css" media="all" />
<link href="//shop.bodi.com/cdn/shop/t/2/assets/recharge-widget-custom.css?v=37551898691326839791775061561" rel="stylesheet" type="text/css" media="all" />
<link rel="icon" href="//shop.bodi.com/cdn/shop/t/2/assets/favicon.ico?v=97919708145122075061771353644" sizes="96x96" type="image/x-icon">
<link
rel="apple-touch-icon"
href="//shop.bodi.com/cdn/shop/t/2/assets/apple-touch-icon.png?v=176559802362480681421771353645"
sizes="180x180"
type="image/png"
>
<link
rel="expect"
href="#MainContent"
blocking="render"
id="view-transition-render-blocker"
><meta charset="utf-8">
<meta
http-equiv="X-UA-Compatible"
content="IE=edge"
>
<meta
name="viewport"
content="width=device-width,initial-scale=1,viewport-fit=cover"
>
<meta
name="view-transition"
content="same-origin"
>
<meta
name="theme-color"
content="#161819"
>
<link href="//shop.bodi.com/cdn/shop/t/2/assets/fonts.css?v=65180414247502642671771353745" rel="stylesheet" type="text/css" media="all" />
<link href="//shop.bodi.com/cdn/shop/t/2/assets/Heebo-VariableFont_wght.woff2?v=103950160879197047661771353644" as="font" type="font/woff2" crossorigin="anonymous" rel="preload">
<link href="//shop.bodi.com/cdn/shop/t/2/assets/Lateral-ExtendedBold.woff2?v=166831245238582599851771353645" as="font" type="font/woff2" crossorigin="anonymous" rel="preload">
<script type="text/javascript">
(() => {
const configs = {
socialladder: {
enabled: Boolean(true),
apiUrl: 'https://socialladder.rkiapps.com/SocialLadderAPI/api/v1',
},
sierra: {
enabled: Boolean(true),
apiUrl: 'https://sierra.chat/agent/Ut1QkpUBlHLzwwIBlHL4Ah5wk-5cYf0rK_kNTk3SH5E/embed',
tokenUrl: 'https://www.bodi.com/api/sierra/identity-token',
},
recharge: {
apiToken: 'strfnt_f88572c7ed84759fab284b62d2b7fbfc9861fae5d367e2717fe9aaa1b32e6d18',
remorsePeriodMinutes: 65.0,
},
analytics: {
autoTrackPageViewsEnabled: true,
},
amplitude: {
apiKey: '1d0ded647159f1fa94847060270f1c3b',
},
accertify: {
dataCollectorUrl: 'https://prod.accdab.net/cdn/cs/WUWQmMNVRV4I3Iq65vKa6JqfTTA.js',
},
subscriptionsRedirectUrl: 'https://account.shop.bodi.com/pages/8cfdfe48-f906-45d6-8515-29818e34a6d4',
subscriptionsMaintenanceEnabled: false,
subscriptionsMaintenanceContent: "",
cookiePrefix: '',
datadog: {
settings: {"applicationId":"fcac99de-b8a0-4b11-85f4-75c824760c42","clientToken":"pub3c11e4f0ff5fa4617371e90b5a251610","service":"commerce-shop","env":"prod","site":"datadoghq.com","logSampleRate":100,"sessionSampleRate":100,"sessionReplaySampleRate":100,"forwardConsoleLogs":"all","allowedTracingUrls":[]},
},
rebuy: {
smartCartDisabled: Boolean(false),
},
bod: {
enabled: Boolean(true),
},
};
window.BODi = window.BODi || {};
window.BODi.configs = configs;
})();
</script>
<script type="text/javascript">
(() => {
window.BODi = window.BODi || {};
// Customer data
window.BODi.customer = {
guid: null,
email: null,
first_name: null,
last_name: null,
logged_in: false,
has_bodi_access: false,
entitlements: [],
sierraIdentity: null,
};
// Localization data
window.BODi.localization = {
country: 'US',
language: 'en',
};
})();
</script>
<script type="text/javascript">
(() => {
window.BODi = window.BODi || {};
const productRoyaltyCode = "ULT";
const collectionRoyaltyCode = null;
const pageRoyaltyCode = null;
if (productRoyaltyCode) {
console.log('[Royalty Code] Product Royalty Code', productRoyaltyCode);
}
if (collectionRoyaltyCode) {
console.log('[Royalty Code] Collection Royalty Code', collectionRoyaltyCode);
}
if (pageRoyaltyCode) {
console.log('[Royalty Code] Page Royalty Code', pageRoyaltyCode);
}
const royaltyCode = productRoyaltyCode || collectionRoyaltyCode || pageRoyaltyCode || null;
window.BODi.royaltyCode = royaltyCode;
console.log(`[Royalty Code] Final Royalty Code for ${window.location.href}`, royaltyCode);
})();
</script>
<script type="text/javascript">
// Amplitude Experiment anti-flicker snippet
(function (d, h) {
var apiKey = window.BODi.configs.amplitude.apiKey;
var timeout = 2000;
// Hides the page and loads the script. Shows page if script fails to load,
// otherwise the script shows the page.
var id = 'amp-exp-css';
try {
if (!d.getElementById(id)) {
var st = d.createElement('style');
st.id = id;
st.innerText = 'html { opacity: 0 !important; }';
// INFO: Uncomment this if Amplitude Experiment is causing unwanted flickering
// h.appendChild(st);
window.setTimeout(function () {
st.remove();
}, timeout);
var sc = d.createElement('script');
sc.src = 'https://cdn.amplitude.com/script/' + apiKey + '.experiment.js';
sc.async = true;
sc.onerror = function () {
st.remove();
};
h.appendChild(sc);
}
} catch (e) {
// If Amplitude Experiment fails, show the page immediately
if (d.getElementById(id)) d.getElementById(id).remove();
console.error(e);
}
})(document, document.head);
</script>
<script type="text/javascript">
// Main Amplitude SDK initialization
(function () {
'use strict';
// Helper function to load scripts
function loadScript(scriptElement) {
return new Promise((resolve, reject) => {
scriptElement.onload = resolve;
scriptElement.onerror = reject;
document.head.appendChild(scriptElement);
});
}
// Create script elements
const amplitudeScript = document.createElement('script');
amplitudeScript.src = 'https://cdn.amplitude.com/libs/analytics-browser-2.11.12-min.js.gz';
const sessionReplayScript = document.createElement('script');
sessionReplayScript.src =
'https://cdn.amplitude.com/libs/plugin-session-replay-browser-1.13.10-min.js.gz';
const uaParserScript = document.createElement('script');
uaParserScript.src = 'https://cdn.jsdelivr.net/npm/ua-parser-js@1.0.38/src/ua-parser.min.js';
// Initialize after all scripts loaded
Promise.all([
loadScript(amplitudeScript),
loadScript(sessionReplayScript),
loadScript(uaParserScript),
])
.then(async () => {
const sessionReplayTracking = window.sessionReplay.plugin({
sampleRate: 1,
forceSessionTracking: true,
});
window.amplitude.add(sessionReplayTracking);
// Initialize Amplitude
window.amplitude.init(window.BODi.configs.amplitude.apiKey, undefined, {
defaultTracking: {
sessions: true,
pageViews: true,
formInteractions: true,
fileDownloads: true,
},
});
// Set User ID if logged in
if (window.BODi?.customer?.guid) {
window.amplitude.setUserId(window.BODi.customer.guid);
}
// Parse user agent
const parser = new UAParser();
const uaResult = parser.getResult();
// Determine membership state from entitlements
const entitlements = window.BODi?.customer?.entitlements || [];
const hasBodint = entitlements.some((e) => e && e.includes('BODINT'));
const membershipState = hasBodint ? 'SUBSCRIBER' : 'NONSUBSCRIBER';
// Fetch cart token from /cart.js
let cartToken = '';
try {
const cartResponse = await fetch('/cart.js');
const cartData = await cartResponse.json();
cartToken = cartData.token || '';
} catch (error) {
console.error('[amplitude] - Failed to fetch cart token', error);
}
// Prepare user properties
const userGuid = window.BODi?.customer?.guid || undefined;
const authStatus = window.BODi?.customer?.logged_in ? 'logged_in' : 'logged_out';
const siteCountry = window.BODi?.localization?.country || '';
const siteLanguage = window.BODi?.localization?.language || '';
const userAgent = navigator.userAgent;
const userAgentData = {
browser: uaResult.browser,
device: uaResult.device,
os: uaResult.os,
};
// Send identify event with all user properties
const identifyEvent = new window.amplitude.Identify();
identifyEvent.set('user id', userGuid);
identifyEvent.set('auth status', authStatus);
identifyEvent.set('site country', siteCountry);
identifyEvent.set('site language', siteLanguage);
identifyEvent.set('user agent', userAgent);
identifyEvent.set('user agent data', userAgentData);
identifyEvent.set('cart id', cartToken);
identifyEvent.set('entitlements', entitlements);
identifyEvent.set('membership state', membershipState);
window.amplitude.identify(identifyEvent);
})
.catch((error) => {
console.error('[amplitude] - Failed to load scripts', error);
});
})();
</script>
<script>
(function(h,o,u,n,d) {
h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
d=o.createElement(u);d.async=1;d.src=n;d.crossOrigin=''
n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
})(window,document,'script','https://www.datadoghq-browser-agent.com/us1/v6/datadog-rum.js','DD_RUM')
</script>
<script>
(function(h,o,u,n,d) {
h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
d=o.createElement(u);d.async=1;d.src=n;d.crossOrigin=''
n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
})(window,document,'script','https://www.datadoghq-browser-agent.com/us1/v6/datadog-logs.js','DD_LOGS')
</script>
<script>
(function () {
var config = window.BODi?.configs?.datadog?.settings || {};
var guid = window.BODi?.customer?.guid;
window.DD_RUM.onReady(function () {
window.DD_RUM.init({
applicationId: config.applicationId,
clientToken: config.clientToken,
site: config.site || 'datadoghq.com',
service: config.service || 'commerce-shop',
env: config.env || 'qa',
sessionSampleRate: config.sessionSampleRate != null ? config.sessionSampleRate : 100,
sessionReplaySampleRate: config.sessionReplaySampleRate != null ? config.sessionReplaySampleRate : 20,
allowedTracingUrls: config.allowedTracingUrls || [],
trackUserInteractions: true,
trackResources: true,
trackLongTasks: true,
defaultPrivacyLevel: 'mask-user-input',
silentMultipleInit: true,
});
if (guid) {
window.DD_RUM.setUser({ id: guid });
}
});
window.DD_LOGS.onReady(function () {
window.DD_LOGS.init({
clientToken: config.clientToken,
site: config.site || 'datadoghq.com',
service: config.service || 'commerce-shop',
env: config.env || 'qa',
sessionSampleRate: config.logSampleRate != null ? config.logSampleRate : 100,
forwardConsoleLogs: config.forwardConsoleLogs || [],
forwardReports: 'all',
forwardErrorsToLogs: true,
silentMultipleInit: true,
});
if (guid) {
window.DD_LOGS.setUser({ id: guid });
}
});
})();
</script>
<script>
(function () {
if (typeof window === 'undefined' || typeof fetch !== 'function') return;
if (window.__bodiCartBootstrapPromise) return;
if (document.cookie.split(';').some((cookie) => cookie.trim().startsWith('cart='))) {
window.__bodiCartBootstrapPromise = Promise.resolve();
return;
}
const formData = new URLSearchParams();
formData.append('attributes[_bodi_init]', `${Date.now()}`);
window.__bodiCartBootstrapPromise = fetch('/cart/update.js', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
body: formData,
})
.then((response) => {
if (!response.ok) {
throw new Error(`Cart bootstrap failed (${response.status})`);
}
})
.catch((error) => {
console.warn('[CartBootstrap] Unable to pre-initialize cart', error);
});
})();
</script>
<script async crossorigin fetchpriority="high" src="/cdn/shopifycloud/importmap-polyfill/es-modules-shim.2.4.0.js"></script>
<script type="importmap">
{
"imports": {
"@theme/critical": "//shop.bodi.com/cdn/shop/t/2/assets/critical.js?v=174785851206309248281781245567",
"@theme/product-title": "//shop.bodi.com/cdn/shop/t/2/assets/product-title-truncation.js?v=81744426891537421781771353645",
"@theme/component": "//shop.bodi.com/cdn/shop/t/2/assets/component.js?v=110735723013117678201771353646",
"@theme/dialog": "//shop.bodi.com/cdn/shop/t/2/assets/dialog.js?v=138083190563882019441771353646",
"@theme/events": "//shop.bodi.com/cdn/shop/t/2/assets/events.js?v=144203031841125949931771353646",
"@theme/focus": "//shop.bodi.com/cdn/shop/t/2/assets/focus.js?v=60436577539430446401771353645",
"@theme/morph": "//shop.bodi.com/cdn/shop/t/2/assets/morph.js?v=130689995393408371391771353645",
"@theme/paginated-list": "//shop.bodi.com/cdn/shop/t/2/assets/paginated-list.js?v=182220942238342935181778687718",
"@theme/performance": "//shop.bodi.com/cdn/shop/t/2/assets/performance.js?v=25067702614201670671771353646",
"@theme/product-form": "//shop.bodi.com/cdn/shop/t/2/assets/product-form.js?v=88643593872554363261780502833",
"@theme/recently-viewed-products": "//shop.bodi.com/cdn/shop/t/2/assets/recently-viewed-products.js?v=94729125001750262651771353644",
"@theme/scrolling": "//shop.bodi.com/cdn/shop/t/2/assets/scrolling.js?v=10957690925586738441771353645",
"@theme/section-renderer": "//shop.bodi.com/cdn/shop/t/2/assets/section-renderer.js?v=117657582323260828391771353645",
"@theme/utilities": "//shop.bodi.com/cdn/shop/t/2/assets/utilities.js?v=38914156865829850761780502834",
"@theme/analytics.util": "//shop.bodi.com/cdn/shop/t/2/assets/analytics.util.js?v=160412045767586707941786551772",
"@theme/variant-picker": "//shop.bodi.com/cdn/shop/t/2/assets/variant-picker.js?v=3281787361353841661785264054",
"@theme/media-gallery": "//shop.bodi.com/cdn/shop/t/2/assets/media-gallery.js?v=86507175541302397441775061561",
"@theme/quick-add": "//shop.bodi.com/cdn/shop/t/2/assets/quick-add.js?v=74531385036627369001771353646",
"@theme/paginated-list-aspect-ratio": "//shop.bodi.com/cdn/shop/t/2/assets/paginated-list-aspect-ratio.js?v=25254270272143792451771353646",
"@theme/web-source-code.util": "//shop.bodi.com/cdn/shop/t/2/assets/web-source-code.util.js?v=100022647184388321141771353645",
"@theme/tracking-codes": "//shop.bodi.com/cdn/shop/t/2/assets/tracking-codes.js?v=36063638829081886981776873393",
"@theme/add-to-cart-link.util": "//shop.bodi.com/cdn/shop/t/2/assets/add-to-cart-link.util.js?v=118114068868411519331780502831",
"@theme/cart-analytics.util": "//shop.bodi.com/cdn/shop/t/2/assets/cart-analytics.util.js?v=158935179339774311981786551772",
"@theme/accertify-data-collector": "//shop.bodi.com/cdn/shop/t/2/assets/accertify-data-collector.js?v=167219477265726170741772584677"
}
}
</script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/collection-redirect.js?v=62810136546219965471771353645"
blocking="render"
></script>
<link
rel="modulepreload"
href="//shop.bodi.com/cdn/shop/t/2/assets/critical.js?v=174785851206309248281781245567"
>
<link
rel="modulepreload"
href="//shop.bodi.com/cdn/shop/t/2/assets/utilities.js?v=38914156865829850761780502834"
fetchpriority="low"
>
<link
rel="modulepreload"
href="//shop.bodi.com/cdn/shop/t/2/assets/component.js?v=110735723013117678201771353646"
fetchpriority="low"
>
<link
rel="modulepreload"
href="//shop.bodi.com/cdn/shop/t/2/assets/section-renderer.js?v=117657582323260828391771353645"
fetchpriority="low"
>
<link
rel="modulepreload"
href="//shop.bodi.com/cdn/shop/t/2/assets/morph.js?v=130689995393408371391771353645"
fetchpriority="low"
>
<link
rel="modulepreload"
href="//shop.bodi.com/cdn/shop/t/2/assets/focus.js?v=60436577539430446401771353645"
fetchpriority="low"
>
<link
rel="modulepreload"
href="//shop.bodi.com/cdn/shop/t/2/assets/recently-viewed-products.js?v=94729125001750262651771353644"
fetchpriority="low"
>
<link
rel="modulepreload"
href="//shop.bodi.com/cdn/shop/t/2/assets/scrolling.js?v=10957690925586738441771353645"
fetchpriority="low"
>
<link
rel="modulepreload"
href="//shop.bodi.com/cdn/shop/t/2/assets/events.js?v=144203031841125949931771353646"
fetchpriority="low"
>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/quick-add.js?v=74531385036627369001771353646"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/dialog.js?v=138083190563882019441771353646"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/variant-picker.js?v=3281787361353841661785264054"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/product-card.js?v=23015674819649003541771353644"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/product-form.js?v=88643593872554363261780502833"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/accordion-custom.js?v=78770727478219950621772670204"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/media.js?v=37825095869491791421771353646"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/product-price.js?v=30079423257668675401771353645"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/cadence-text.js?v=41169851286431607791771353646"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/variant-checklist.js?v=37514240127249512841771353646"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/updateButtonVariant.js?v=180672249296976698911771353645"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/variant-metafield-text.js?v=73665773763318208401773185238"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/product-title-truncation.js?v=81744426891537421781771353645"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/product-inventory.js?v=16343734458933704981771353644"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/show-more.js?v=94563802205717136101771353646"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/slideshow.js?v=56396194353539668521774505754"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/anchored-popover.js?v=143092715850611436701771353644"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/floating-panel.js?v=128677600744947036551771353645"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/video-background.js?v=157395678258090420911774359966"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/component-quantity-selector.js?v=56330027151833116691771353646"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/component-quantity-selector-dropdown.js?v=81553553732033357941775061559"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/media-gallery.js?v=86507175541302397441775061561"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/rte-formatter.js?v=101420294193111439321771353644"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/auto-close-details.js?v=58350291535404441581771353645"
defer="defer"
></script>
<script>
const basePath = 'https://cdn.shopify.com/static/themes/horizon/placeholders';
const Theme = {
placeholders: {
general: [
`${basePath}/general-1.png`,
`${basePath}/general-2.png`,
`${basePath}/general-3.png`,
`${basePath}/general-4.png`,
`${basePath}/general-5.png`,
`${basePath}/general-6.png`,
`${basePath}/general-7.png`,
],
product: [`${basePath}/product-ball.png`, `${basePath}/product-cone.png`, `${basePath}/product-cube.png`],
},
translations: {
placeholder_image: `Placeholder image`,
added: `Added`,
},
routes: {
cart_add_url: '/cart/add.js',
cart_change_url: '/cart/change',
cart_update_url: '/cart/update',
cart_url: '/cart',
},
template: {
name: 'product.supplement',
},
};
</script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/socialladder.js?v=27479865096865235401771353644"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/cart-listener.js?v=55740414390312000901786551773"
type="module"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/tracking-codes.js?v=36063638829081886981776873393"
type="module"
fetchpriority="low"
></script><script
src="//shop.bodi.com/cdn/shop/t/2/assets/add-to-cart-link.util.js?v=118114068868411519331780502831"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/locale-switcher.js?v=45869995406809579801776873392"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/sierra.js?v=111282827850437561821787001127"
type="module"
fetchpriority="low"
></script>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/bodi-auth-redirect.js?v=13934401950456957671772843289"
defer
></script>
<!-- Digioh -->
<script
async
type="text/javascript"
src="https://www.zeropartyforms.com/w37htfhcq2/vendor/0d1ee324-9c1b-4837-88cd-a5a4a387633a/lightbox_speed.js"
fetchpriority="low"
></script>
<!-- Rebuy ShopifyStorefrontHelper -->
<script
async
type="text/javascript"
src="https://cdn.rebuyengine.com/onsite/js/storefront-helper.js"
fetchpriority="low"
></script>
<!-- Accertify Data Collector -->
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/accertify-data-collector.js?v=167219477265726170741772584677"
type="module"
fetchpriority="low"
data-accertify-tid="null"
></script>
<!-- Set Amplitude device ID to cart -->
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/amplitude-device-id-cart.js?v=28193483641527377311777477953"
type="module"
fetchpriority="low"
data-amplitude-device-id="null"
></script>
<style data-shopify>
:root {
/* Page Layout */
--sidebar-width: 25rem;
--narrow-content-width: 36rem;
--normal-content-width: 42rem;
--wide-content-width: 46rem;
--narrow-page-width: 88rem;
--normal-page-width: 120rem;
--wide-page-width: 150rem;
/* Section Heights */
--section-height-small: 15rem;
--section-height-medium: 25rem;
--section-height-large: 35rem;
@media screen and (min-width: 40em) {
--section-height-small: 40svh;
--section-height-medium: 55svh;
--section-height-large: 70svh;
}
@media screen and (min-width: 60em) {
--section-height-small: 50svh;
--section-height-medium: 65svh;
--section-height-large: 80svh;
}
/* Letter spacing */
--letter-spacing-sm: 0.06em;
--letter-spacing-md: 0.13em;
/* Font families */
--font-body--family: 'Heebo', var(--font-heebo), sans-serif;
--font-body--style: normal;
--font-body--weight: 400;
--font-subheading--family: 'Heebo', var(--font-heebo), sans-serif;
--font-subheading--style: normal;
--font-subheading--weight: 500;
--font-heading--family: 'Lateral', var(--font-lateral), sans-serif;
--font-heading--style: normal;
--font-heading--weight: 700;
--font-accent--family: 'Lateral', var(--font-lateral), sans-serif;
--font-accent--style: normal;
--font-accent--weight: 700;
/* Margin sizes */
--font-h1--spacing: 0.25em;
--font-h2--spacing: 0.25em;
--font-h3--spacing: 0.25em;
--font-h4--spacing: 0.25em;
--font-h5--spacing: 0.25em;
--font-h6--spacing: 0.25em;
--font-paragraph--spacing: 0.5em;
/* Heading colors */
--font-h1--color: var(--color-foreground-heading);
--font-h2--color: var(--color-foreground-heading);
--font-h3--color: var(--color-foreground-heading);
--font-h4--color: var(--color-foreground-heading);
--font-h5--color: var(--color-foreground-heading);
--font-h6--color: var(--color-foreground-heading);
/** Z-Index / Layering */
--layer-section-background: -2;
--layer-lowest: -1;
--layer-base: 0;
--layer-flat: 1;
--layer-raised: 2;
--layer-heightened: 4;
--layer-sticky: 8;
--layer-window-overlay: 10;
--layer-header-menu: 12;
--layer-overlay: 16;
--layer-menu-drawer: 18;
--layer-temporary: 20;
/* Max-width / Measure */
--max-width--body-normal: 50ch;
--max-width--body-narrow: 35ch;
--max-width--heading-normal: 50ch;
--max-width--heading-narrow: 30ch;
--max-width--display-normal: 20ch;
--max-width--display-narrow: 15ch;
--max-width--display-tight: 5ch;
/* Letter-spacing / Tracking */
--letter-spacing--display-tight: -0.03em;
--letter-spacing--display-normal: 0em;
--letter-spacing--display-loose: 0.03em;
--letter-spacing--heading-tight: -0.03em;
--letter-spacing--heading-normal: 0em;
--letter-spacing--heading-loose: 0.03em;
--letter-spacing--body-tight: -0.03em;
--letter-spacing--body-normal: 0em;
--letter-spacing--body-loose: 0.03em;
/* Line height / Leading */
--line-height: 1;
--line-height--display-tight: 1;
--line-height--display-normal: 1.1;
--line-height--display-loose: 1.2;
--line-height--heading-tight: 1.15;
--line-height--heading-normal: 1.25;
--line-height--heading-loose: 1.35;
--line-height--body-tight: 1em;
--line-height--body-normal: 1.2em;
--line-height--body-loose: 1.4em;
/* Typography presets */
--font-size--paragraph: 1.0rem;--font-size--h1: clamp(3.0rem, 7.2vw, 4.5rem);--font-size--h2: clamp(2.25rem, 4.8vw, 3.0rem);--font-size--h3: 2.0rem;--font-size--h4: 1.5rem;--font-size--h5: 1.25rem;--font-size--h6: 1.0rem;--font-paragraph--weight: 400;--font-paragraph--letter-spacing: var(--letter-spacing--body-normal);--font-paragraph--size: var(--font-size--paragraph);--font-paragraph--family: var(--font-body--family);--font-paragraph--style: var(--font-body--style);--font-paragraph--case: ;--font-paragraph--line-height: var(--line-height--body-normal);--font-h1--weight: var(--font-heading--weight);--font-h1--letter-spacing: var(--letter-spacing--heading-tight);--font-h1--size: var(--font-size--h1);--font-h1--family: var(--font-heading--family);--font-h1--style: var(--font-heading--style);--font-h1--case: none;--font-h1--line-height: var(--line-height--display-tight);--font-h2--weight: var(--font-heading--weight);--font-h2--letter-spacing: var(--letter-spacing--heading-normal);--font-h2--size: var(--font-size--h2);--font-h2--family: var(--font-heading--family);--font-h2--style: var(--font-heading--style);--font-h2--case: none;--font-h2--line-height: var(--line-height--display-normal);--font-h3--weight: var(--font-heading--weight);--font-h3--letter-spacing: var(--letter-spacing--heading-tight);--font-h3--size: var(--font-size--h3);--font-h3--family: var(--font-heading--family);--font-h3--style: var(--font-heading--style);--font-h3--case: none;--font-h3--line-height: var(--line-height--heading-tight);--font-h4--weight: var(--font-subheading--weight);--font-h4--letter-spacing: var(--letter-spacing--heading-normal);--font-h4--size: var(--font-size--h4);--font-h4--family: var(--font-subheading--family);--font-h4--style: var(--font-subheading--style);--font-h4--case: none;--font-h4--line-height: var(--line-height--display-normal);--font-h5--weight: var(--font-subheading--weight);--font-h5--letter-spacing: var(--letter-spacing--heading-normal);--font-h5--size: var(--font-size--h5);--font-h5--family: var(--font-subheading--family);--font-h5--style: var(--font-subheading--style);--font-h5--case: none;--font-h5--line-height: var(--line-height--display-normal);--font-h6--weight: var(--font-subheading--weight);--font-h6--letter-spacing: var(--letter-spacing--heading-normal);--font-h6--size: var(--font-size--h6);--font-h6--family: var(--font-subheading--family);--font-h6--style: var(--font-subheading--style);--font-h6--case: none;--font-h6--line-height: var(--line-height--display-normal);
/* Hardcoded font sizes */
--font-size--2xs: 0.625rem;
--font-size--xs: 0.8125rem;
--font-size--sm: 0.875rem;
--font-size--md: 1rem;
--font-size--lg: 1.125rem;
--font-size--xl: 1.25rem;
--font-size--2xl: 1.5rem;
--font-size--3xl: 2rem;
--font-size--4xl: 2.5rem;
--font-size--5xl: 3rem;
--font-size--6xl: 3.5rem;
/* Menu font sizes */
--menu-font-sm--size: 0.875rem;
--menu-font-sm--line-height: calc(1.1 + 0.5 * min(16 / 14));
--menu-font-md--size: 1rem;
--menu-font-md--line-height: calc(1.1 + 0.5 * min(16 / 16));
--menu-font-lg--size: 1.125rem;
--menu-font-lg--line-height: calc(1.1 + 0.5 * min(16 / 18));
--menu-font-xl--size: 1.25rem;
--menu-font-xl--line-height: calc(1.1 + 0.5 * min(16 / 20));
--menu-font-2xl--size: 1.75rem;
--menu-font-2xl--line-height: calc(1.1 + 0.5 * min(16 / 28));
/* Colors */
--color-error: #8B0000;
--color-success: #006400;
--color-white: #FFFFFF;
--color-white-rgb: 255 255 255;
--color-black: #000000;
--color-instock: #3ED660;
--color-lowstock: #EE9441;
--color-outofstock: #C8C8C8;
/* Opacity */
--opacity-5: 0.05;
--opacity-8: 0.08;
--opacity-10: 0.1;
--opacity-15: 0.15;
--opacity-20: 0.2;
--opacity-25: 0.25;
--opacity-30: 0.3;
--opacity-40: 0.4;
--opacity-50: 0.5;
--opacity-60: 0.6;
--opacity-70: 0.7;
--opacity-80: 0.8;
--opacity-85: 0.85;
--opacity-90: 0.9;
--opacity-subdued-text: var(--opacity-70);
--shadow-button: 0 2px 3px rgb(0 0 0 / 20%);
--gradient-image-overlay: linear-gradient(to top, rgb(0 0 0 / 0.5), transparent);
/* Spacing */
--margin-3xs: 0.125rem;
--margin-2xs: 0.3rem;
--margin-xs: 0.5rem;
--margin-sm: 0.7rem;
--margin-md: 0.8rem;
--margin-lg: 1rem;
--margin-xl: 1.25rem;
--margin-2xl: 1.5rem;
--margin-3xl: 1.75rem;
--margin-4xl: 2rem;
--margin-5xl: 3rem;
--margin-6xl: 5rem;
--scroll-margin: 50px;
--padding-3xs: 0.125rem;
--padding-2xs: 0.25rem;
--padding-xs: 0.5rem;
--padding-sm: 0.7rem;
--padding-md: 0.8rem;
--padding-lg: 1rem;
--padding-xl: 1.25rem;
--padding-2xl: 1.5rem;
--padding-3xl: 1.75rem;
--padding-4xl: 2rem;
--padding-5xl: 3rem;
--padding-6xl: 4rem;
--gap-3xs: 0.125rem;
--gap-2xs: 0.3rem;
--gap-xs: 0.5rem;
--gap-sm: 0.7rem;
--gap-md: 0.9rem;
--gap-lg: 1rem;
--gap-xl: 1.25rem;
--gap-2xl: 2rem;
--gap-3xl: 3rem;
--spacing-scale-sm: 0.6;
--spacing-scale-md: 0.7;
--spacing-scale-default: 1.0;
/* Checkout buttons gap */
--checkout-button-gap: 8px;
/* Borders */
--style-border-width: 1px;
--style-border-radius-xs: 0.2rem;
--style-border-radius-sm: 0.6rem;
--style-border-radius-md: 0.8rem;
--style-border-radius-50: 50%;
--style-border-radius-lg: 1rem;
--style-border-radius-pills: 40px;
--style-border-radius-inputs: 8px;
--style-border-radius-buttons-primary: 37px;
--style-border-radius-buttons-secondary: 37px;
--style-border-width-primary: 0px;
--style-border-width-secondary: 1px;
--style-border-width-inputs: 1px;
--style-border-radius-popover: 12px;
--style-border-popover: 1px none rgb(var(--color-border-rgb) / 50%);
--style-border-drawer: 1px none rgb(var(--color-border-rgb) / 50%);
--style-border-swatch-opacity: 10%;
--style-border-swatch-width: 1px;
--style-border-swatch-style: solid;
/* Animation */
--ease-out-cubic: cubic-bezier(0.33, 1, 0.68, 1);
--ease-out-quad: cubic-bezier(0.32, 0.72, 0, 1);
--animation-speed-fast: 0.0625s;
--animation-speed: 0.125s;
--animation-speed-slow: 0.2s;
--animation-speed-medium: 0.15s;
--animation-easing: ease-in-out;
--animation-slideshow-easing: cubic-bezier(0.4, 0, 0.2, 1);
--drawer-animation-speed: 0.2s;
--animation-values-slow: var(--animation-speed-slow) var(--animation-easing);
--animation-values: var(--animation-speed) var(--animation-easing);
--animation-values-fast: var(--animation-speed-fast) var(--animation-easing);
--animation-values-allow-discrete: var(--animation-speed) var(--animation-easing) allow-discrete;
--animation-timing-hover: cubic-bezier(0.25, 0.46, 0.45, 0.94);
--animation-timing-active: cubic-bezier(0.5, 0, 0.75, 0);
--animation-timing-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
--animation-timing-default: cubic-bezier(0, 0, 0.2, 1);
--animation-timing-fade-in: cubic-bezier(0.16, 1, 0.3, 1);
--animation-timing-fade-out: cubic-bezier(0.4, 0, 0.2, 1);
/* View transitions */
/* View transition old */
--view-transition-old-main-content: var(--animation-speed) var(--animation-easing) both fadeOut;
/* View transition new */
--view-transition-new-main-content: var(--animation-speed) var(--animation-easing) both fadeIn, var(--animation-speed) var(--animation-easing) both slideInTopViewTransition;
/* Focus */
--focus-outline-width: 0.09375rem;
--focus-outline-offset: 0.2em;
/* Badges */
--badge-blob-padding-block: 1px;
--badge-blob-padding-inline: 12px 8px;
--badge-rectangle-padding-block: 1px;
--badge-rectangle-padding-inline: 6px;
@media screen and (min-width: 750px) {
--badge-blob-padding-block: 4px;
--badge-blob-padding-inline: 16px 12px;
--badge-rectangle-padding-block: 4px;
--badge-rectangle-padding-inline: 10px;
}
/* Icons */
--icon-size-2xs: 0.6rem;
--icon-size-xs: 0.85rem;
--icon-size-sm: 1.25rem;
--icon-size-md: 1.375rem;
--icon-size-lg: 1.5rem;
--icon-stroke-width: 1px;
/* Input */
--input-email-min-width: 200px;
--input-search-max-width: 650px;
--input-padding-y: 0.8rem;
--input-padding-x: 0.8rem;
--input-padding: var(--input-padding-y) var(--input-padding-x);
--input-box-shadow-width: var(--style-border-width-inputs);
--input-box-shadow: 0 0 0 var(--input-box-shadow-width) var(--color-input-border);
--input-box-shadow-focus: 0 0 0 calc(var(--input-box-shadow-width) + 0.5px) var(--color-input-border);
--input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10));
--input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5));
--input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50));
--input-textarea-min-height: 55px;
/* Button size */
--button-size-sm: 30px;
--button-size-md: 36px;
--button-size: var(--minimum-touch-target);
--button-padding-inline: 24px;
--button-padding-block: 16px;
/* Button font-family */
--button-font-family-primary: var(--font-body--family);
--button-font-family-secondary: var(--font-body--family);
/* Button font-weight */
--button-font-weight-primary: 600;
--button-font-weight-secondary: default;
/* Button text case */
--button-text-case: ;
--button-text-case-primary: default;
--button-text-case-secondary: default;
/* Borders */
--border-color: rgb(var(--color-border-rgb) / var(--opacity-50));
--border-width-sm: 1px;
--border-width-md: 2px;
--border-width-lg: 5px;
/* Drawers */
--drawer-inline-padding: 25px;
--drawer-menu-inline-padding: 2.5rem;
--drawer-header-block-padding: 20px;
--drawer-content-block-padding: 10px;
--drawer-header-desktop-top: 0rem;
--drawer-padding: calc(var(--padding-sm) + 7px);
--drawer-height: 100dvh;
--drawer-width: 95vw;
--drawer-max-width: 500px;
/* Variant Picker Swatches */
--variant-picker-swatch-width-unitless: 24;
--variant-picker-swatch-height-unitless: 24;
--variant-picker-swatch-width: 24px;
--variant-picker-swatch-height: 24px;
--variant-picker-swatch-radius: 24px;
--variant-picker-border-width: 1px;
--variant-picker-border-style: solid;
--variant-picker-border-opacity: 10%;
/* Variant Picker Buttons */
--variant-picker-button-radius: 8px;
--variant-picker-button-border-width: 1px;
/* Slideshow */
--slideshow-controls-size: 3.5rem;
--slideshow-controls-icon: 2rem;
--peek-next-slide-size: 3rem;
/* Utilities */
--backdrop-opacity: 0.15;
--backdrop-color-rgb: var(--color-shadow-rgb);
--minimum-touch-target: 44px;
--disabled-opacity: 0.5;
--skeleton-opacity: 0.025;
/* Shapes */
--shape--circle: circle(50% at center);
--shape--sunburst: polygon(100% 50%,94.62% 55.87%,98.3% 62.94%,91.57% 67.22%,93.3% 75%,85.7% 77.39%,85.36% 85.36%,77.39% 85.7%,75% 93.3%,67.22% 91.57%,62.94% 98.3%,55.87% 94.62%,50% 100%,44.13% 94.62%,37.06% 98.3%,32.78% 91.57%,25% 93.3%,22.61% 85.7%,14.64% 85.36%,14.3% 77.39%,6.7% 75%,8.43% 67.22%,1.7% 62.94%,5.38% 55.87%,0% 50%,5.38% 44.13%,1.7% 37.06%,8.43% 32.78%,6.7% 25%,14.3% 22.61%,14.64% 14.64%,22.61% 14.3%,25% 6.7%,32.78% 8.43%,37.06% 1.7%,44.13% 5.38%,50% 0%,55.87% 5.38%,62.94% 1.7%,67.22% 8.43%,75% 6.7%,77.39% 14.3%,85.36% 14.64%,85.7% 22.61%,93.3% 25%,91.57% 32.78%,98.3% 37.06%,94.62% 44.13%);
--shape--diamond: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
--shape--blob: polygon(85.349% 11.712%, 87.382% 13.587%, 89.228% 15.647%, 90.886% 17.862%, 92.359% 20.204%, 93.657% 22.647%, 94.795% 25.169%, 95.786% 27.752%, 96.645% 30.382%, 97.387% 33.048%, 98.025% 35.740%, 98.564% 38.454%, 99.007% 41.186%, 99.358% 43.931%, 99.622% 46.685%, 99.808% 49.446%, 99.926% 52.210%, 99.986% 54.977%, 99.999% 57.744%, 99.975% 60.511%, 99.923% 63.278%, 99.821% 66.043%, 99.671% 68.806%, 99.453% 71.565%, 99.145% 74.314%, 98.724% 77.049%, 98.164% 79.759%, 97.433% 82.427%, 96.495% 85.030%, 95.311% 87.529%, 93.841% 89.872%, 92.062% 91.988%, 89.972% 93.796%, 87.635% 95.273%, 85.135% 96.456%, 82.532% 97.393%, 79.864% 98.127%, 77.156% 98.695%, 74.424% 99.129%, 71.676% 99.452%, 68.918% 99.685%, 66.156% 99.844%, 63.390% 99.942%, 60.624% 99.990%, 57.856% 99.999%, 55.089% 99.978%, 52.323% 99.929%, 49.557% 99.847%, 46.792% 99.723%, 44.031% 99.549%, 41.273% 99.317%, 38.522% 99.017%, 35.781% 98.639%, 33.054% 98.170%, 30.347% 97.599%, 27.667% 96.911%, 25.024% 96.091%, 22.432% 95.123%, 19.907% 93.994%, 17.466% 92.690%, 15.126% 91.216%, 12.902% 89.569%, 10.808% 87.761%, 8.854% 85.803%, 7.053% 83.703%, 5.418% 81.471%, 3.962% 79.119%, 2.702% 76.656%, 1.656% 74.095%, 0.846% 71.450%, 0.294% 68.740%, 0.024% 65.987%, 0.050% 63.221%, 0.343% 60.471%, 0.858% 57.752%, 1.548% 55.073%, 2.370% 52.431%, 3.283% 49.819%, 4.253% 47.227%, 5.249% 44.646%, 6.244% 42.063%, 7.211% 39.471%, 8.124% 36.858%, 8.958% 34.220%, 9.711% 31.558%, 10.409% 28.880%, 11.083% 26.196%, 11.760% 23.513%, 12.474% 20.839%, 13.259% 18.186%, 14.156% 15.569%, 15.214% 13.012%, 16.485% 10.556%, 18.028% 8.261%, 19.883% 6.211%, 22.041% 4.484%, 24.440% 3.110%, 26.998% 2.057%, 29.651% 1.275%, 32.360% 0.714%, 35.101% 0.337%, 37.859% 0.110%, 40.624% 0.009%, 43.391% 0.016%, 46.156% 0.113%, 48.918% 0.289%, 51.674% 0.533%, 54.425% 0.837%, 57.166% 1.215%, 59.898% 1.654%, 62.618% 2.163%, 65.322% 2.750%, 68.006% 3.424%, 70.662% 4.197%, 73.284% 5.081%, 75.860% 6.091%, 78.376% 7.242%, 80.813% 8.551%, 83.148% 10.036%, 85.349% 11.712%);
/* Buy buttons */
--height-buy-buttons: calc(var(--padding-lg) * 2 + var(--icon-size-sm));
/* Card image height variables */
--height-small: 10rem;
--height-medium: 11.5rem;
--height-large: 13rem;
--height-full: 100vh;
@media screen and (min-width: 750px) {
--height-small: 17.5rem;
--height-medium: 21.25rem;
--height-large: 25rem;
}
/* Modal */
--modal-max-height: 65dvh;
/* Card styles for search */
--card-bg-hover: rgb(var(--color-foreground-rgb) / var(--opacity-5));
--card-border-hover: rgb(var(--color-foreground-rgb) / var(--opacity-30));
--card-border-focus: rgb(var(--color-foreground-rgb) / var(--opacity-10));
/* Cart */
--cart-primary-font-family: var(--font-heebo);
--cart-primary-font-style: var(--font-body--style);
--cart-primary-font-weight: var(--font-body--weight);
--cart-secondary-font-family: var(--font-heebo);
--cart-secondary-font-style: var(--font-secondary--style);
--cart-secondary-font-weight: var(--font-secondary--weight);
}
</style>
<style data-shopify>
:root,
.color-scheme-1 {
--color-background: rgb(255 255 255 / 1.0);
/* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */
--color-background-rgb: 255 255 255;
--opacity-5-15: 0.05;
--opacity-10-25: 0.1;
--opacity-35-55: 0.35;
--opacity-40-60: 0.4;
--opacity-30-60: 0.3;
--color-foreground: rgb(0 0 0 / 1.0);
--color-foreground-rgb: 0 0 0;
--color-foreground-heading: rgb(32 132 104 / 1.0);
--color-foreground-heading-rgb: 32 132 104;
--color-primary: rgb(0 15 159 / 1.0);
--color-primary-rgb: 0 15 159;
--color-primary-hover: rgb(0 0 0 / 1.0);
--color-primary-hover-rgb: 0 0 0;
--color-accent: rgb(32 132 104 / 1.0);
--color-accent-rgb: 32 132 104;
--color-grayscale: rgb(112 111 115 / 1.0);
--color-grayscale-rgb: 112 111 115;
--color-border: rgb(0 0 0 / 0.19);
--color-border-rgb: 0 0 0;
--color-shadow: rgb(0 0 0 / 1.0);
--color-shadow-rgb: 0 0 0;
--color-primary-button-text: rgb(22 24 25 / 1.0);
--color-primary-button-background: rgb(188 249 134 / 1.0);
--color-primary-button-border: rgb(22 24 25 / 1.0);
--color-primary-button-hover-text: rgb(22 24 25 / 1.0);
--color-primary-button-hover-background: rgb(153 246 70 / 1.0);
--color-primary-button-hover-border: rgb(22 24 25 / 1.0);
--color-secondary-button-text: rgb(0 0 0 / 1.0);
--color-secondary-button-background: rgb(255 255 255 / 1.0);
--color-secondary-button-border: rgb(0 0 0 / 1.0);
--color-secondary-button-hover-text: rgb(0 0 0 / 1.0);
--color-secondary-button-hover-background: rgb(222 222 222 / 1.0);
--color-secondary-button-hover-border: rgb(0 0 0 / 1.0);
--color-input-background: rgb(0 0 0 / 0.05);
--color-input-text: rgb(0 0 0 / 1.0);
--color-input-text-rgb: 0 0 0;
--color-input-border: rgb(0 0 0 / 0.0);
--color-input-hover-background: rgb(245 245 245 / 1.0);
--color-variant-background: rgb(255 255 255 / 1.0);
--color-variant-border: rgb(189 189 189 / 1.0);
--color-variant-text: rgb(0 0 0 / 1.0);
--color-variant-text-rgb: 0 0 0;
--color-variant-hover-background: rgb(255 255 255 / 1.0);
--color-variant-hover-text: rgb(0 0 0 / 1.0);
--color-variant-hover-border: rgb(68 70 70 / 1.0);
--color-selected-variant-background: rgb(255 255 255 / 1.0);
--color-selected-variant-border: rgb(0 0 0 / 1.0);
--color-selected-variant-text: rgb(0 0 0 / 1.0);
--color-selected-variant-hover-background: rgb(255 255 255 / 1.0);
--color-selected-variant-hover-text: rgb(0 0 0 / 1.0);
--color-selected-variant-hover-border: rgb(16 16 16 / 1.0);
--input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10));
--input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15));
--input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50));
--color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60));
--font-h1--color: var(--color-foreground-heading);
--font-h2--color: var(--color-foreground-heading);
--font-h3--color: var(--color-foreground-heading);
--font-h4--color: var(--color-foreground-heading);
--font-h5--color: var(--color-foreground-heading);
--font-h6--color: var(--color-foreground-heading);
/* Shadows */
--shadow-blur: 20px;
--shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15));
}
.color-scheme-20731c7a-b0ca-4483-80fd-2d393a3f8252 {
--color-background: rgb(22 24 25 / 1.0);
/* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */
--color-background-rgb: 22 24 25;
--opacity-5-15: 0.15;
--opacity-10-25: 0.25;
--opacity-35-55: 0.55;
--opacity-40-60: 0.6;
--opacity-30-60: 0.6;
--color-foreground: rgb(255 255 255 / 1.0);
--color-foreground-rgb: 255 255 255;
--color-foreground-heading: rgb(255 255 255 / 1.0);
--color-foreground-heading-rgb: 255 255 255;
--color-primary: rgb(0 15 159 / 1.0);
--color-primary-rgb: 0 15 159;
--color-primary-hover: rgb(0 0 0 / 1.0);
--color-primary-hover-rgb: 0 0 0;
--color-accent: rgb(153 246 70 / 1.0);
--color-accent-rgb: 153 246 70;
--color-grayscale: rgb(112 111 115 / 1.0);
--color-grayscale-rgb: 112 111 115;
--color-border: rgb(0 0 0 / 0.19);
--color-border-rgb: 0 0 0;
--color-shadow: rgb(0 0 0 / 1.0);
--color-shadow-rgb: 0 0 0;
--color-primary-button-text: rgb(22 24 25 / 1.0);
--color-primary-button-background: rgb(188 249 134 / 1.0);
--color-primary-button-border: rgb(22 24 25 / 1.0);
--color-primary-button-hover-text: rgb(22 24 25 / 1.0);
--color-primary-button-hover-background: rgb(153 246 70 / 1.0);
--color-primary-button-hover-border: rgb(22 24 25 / 1.0);
--color-secondary-button-text: rgb(0 0 0 / 1.0);
--color-secondary-button-background: rgb(255 255 255 / 1.0);
--color-secondary-button-border: rgb(0 0 0 / 1.0);
--color-secondary-button-hover-text: rgb(0 0 0 / 1.0);
--color-secondary-button-hover-background: rgb(222 222 222 / 1.0);
--color-secondary-button-hover-border: rgb(0 0 0 / 1.0);
--color-input-background: rgb(255 255 255 / 1.0);
--color-input-text: rgb(0 0 0 / 1.0);
--color-input-text-rgb: 0 0 0;
--color-input-border: rgb(0 0 0 / 0.0);
--color-input-hover-background: rgb(245 245 245 / 1.0);
--color-variant-background: rgb(255 255 255 / 1.0);
--color-variant-border: rgb(189 189 189 / 1.0);
--color-variant-text: rgb(0 0 0 / 1.0);
--color-variant-text-rgb: 0 0 0;
--color-variant-hover-background: rgb(255 255 255 / 1.0);
--color-variant-hover-text: rgb(0 0 0 / 1.0);
--color-variant-hover-border: rgb(68 70 70 / 1.0);
--color-selected-variant-background: rgb(255 255 255 / 1.0);
--color-selected-variant-border: rgb(0 0 0 / 1.0);
--color-selected-variant-text: rgb(0 0 0 / 1.0);
--color-selected-variant-hover-background: rgb(255 255 255 / 1.0);
--color-selected-variant-hover-text: rgb(0 0 0 / 1.0);
--color-selected-variant-hover-border: rgb(16 16 16 / 1.0);
--input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10));
--input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15));
--input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50));
--color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60));
--font-h1--color: var(--color-foreground-heading);
--font-h2--color: var(--color-foreground-heading);
--font-h3--color: var(--color-foreground-heading);
--font-h4--color: var(--color-foreground-heading);
--font-h5--color: var(--color-foreground-heading);
--font-h6--color: var(--color-foreground-heading);
/* Shadows */
--shadow-blur: 20px;
--shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15));
}
body, .color-scheme-1, .color-scheme-20731c7a-b0ca-4483-80fd-2d393a3f8252 {
color: var(--color-foreground);
background-color: var(--color-background);
}
</style>
<!-- /snippets/gwa-hreflang.liquid v.1.0.3 from https://apps.shopify.com/hreflang-manager -->
<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script><meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/75560616153/digital_wallets/dialog">
<meta name="shopify-checkout-api-token" content="8a16876903fe96fbabfc6c4c4c6257e6">
<meta id="in-context-paypal-metadata" data-shop-id="75560616153" data-venmo-supported="true" data-environment="production" data-locale="en_US" data-paypal-v4="true" data-currency="USD">
<link rel="alternate" type="application/json+oembed" href="https://shop.bodi.com/products/ultimate-reset-cleanse.oembed">
<script async="async" src="/checkouts/internal/preloads.js?locale=en-US&default_configuration_id=2781839577"></script>
<link rel="preconnect" href="https://shop.app" crossorigin="anonymous">
<script async="async" src="https://shop.app/checkouts/internal/preloads.js?locale=en-US&default_configuration_id=2781839577&shop_id=75560616153" crossorigin="anonymous"></script>
<script id="shopify-features" type="application/json">{"accessToken":"8a16876903fe96fbabfc6c4c4c6257e6","betas":["rich-media-storefront-analytics"],"domain":"shop.bodi.com","predictiveSearch":true,"shopId":75560616153,"locale":"en"}</script>
<script>var Shopify = Shopify || {};
Shopify.shop = "xragki-mv.myshopify.com";
Shopify.locale = "en";
Shopify.currency = {"active":"USD","rate":"1.0"};
Shopify.country = "US";
Shopify.theme = {"name":"commerce-shopify-theme\/main","id":157605626073,"schema_name":"Horizon","schema_version":"1.11.0","theme_store_id":null,"role":"main"};
Shopify.theme.handle = "null";
Shopify.theme.style = {"id":null,"handle":null};
Shopify.cdnHost = "shop.bodi.com/cdn";
Shopify.routes = Shopify.routes || {};
Shopify.routes.root = "/";
Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js";
Shopify.SignInWithShop = Shopify.SignInWithShop || {};
Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {};
Shopify.SignInWithShop.User.recognized = false;</script>
<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
<script>!function(o){function n(){var o=[];function n(){o.push(Array.prototype.slice.apply(arguments))}return n.q=o,n}var t=o.Shopify=o.Shopify||{};t.loadFeatures=n(),t.autoloadFeatures=n()}(window);</script>
<script>
window.ShopifyPay = window.ShopifyPay || {};
window.ShopifyPay.apiHost = "shop.app\/pay";
window.ShopifyPay.redirectState = null;
</script>
<script>
window.Shopify = window.Shopify || {};
window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {};
window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 };
window.Shopify.SignInWithShop.eligible = false;
</script>
<script id="shop-js-analytics" type="application/json">{"pageType":"product"}</script>
<script defer="defer" async type="module" src="//shop.bodi.com/cdn/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"></script>
<script type="module">
await import("//shop.bodi.com/cdn/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js");
window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true});
</script>
<script>
window.Shopify = window.Shopify || {};
if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {};
window.Shopify.featureAssets['shop-js'] = {"listener":["modules/v2/loader.listener.en.esm.js"],"init-windoid":["modules/v2/loader.init-windoid.en.esm.js"],"shop-toast-manager":["modules/v2/loader.shop-toast-manager.en.esm.js"],"init-shop-user-recognition":["modules/v2/loader.init-shop-user-recognition.en.esm.js"],"checkout-modal":["modules/v2/loader.checkout-modal.en.esm.js"],"shop-button":["modules/v2/loader.shop-button.en.esm.js"],"init-shop-cart-sync":["modules/v2/loader.init-shop-cart-sync.en.esm.js"],"init-fed-cm":["modules/v2/loader.init-fed-cm.en.esm.js"],"init-shop-email-lookup-coordinator":["modules/v2/loader.init-shop-email-lookup-coordinator.en.esm.js"],"avatar":["modules/v2/loader.avatar.en.esm.js"],"shop-cash-offers":["modules/v2/loader.shop-cash-offers.en.esm.js"],"init-customer-accounts-sign-up":["modules/v2/loader.init-customer-accounts-sign-up.en.esm.js"],"shop-login-button":["modules/v2/loader.shop-login-button.en.esm.js"],"init-shop-for-new-customer-accounts":["modules/v2/loader.init-shop-for-new-customer-accounts.en.esm.js"],"pay-button":["modules/v2/loader.pay-button.en.esm.js"],"init-customer-accounts":["modules/v2/loader.init-customer-accounts.en.esm.js"],"shop-user-recognition":["modules/v2/loader.shop-user-recognition.en.esm.js"],"shop-follow-button":["modules/v2/loader.shop-follow-button.en.esm.js"],"shop-cart-sync":["modules/v2/loader.shop-cart-sync.en.esm.js"],"shop-login":["modules/v2/loader.shop-login.en.esm.js"],"lead-capture":["modules/v2/loader.lead-capture.en.esm.js"],"payment-terms":["modules/v2/loader.payment-terms.en.esm.js"]};
</script>
<script>(function() {
var isLoaded = false;
function asyncLoad() {
if (isLoaded) return;
isLoaded = true;
var urls = ["https:\/\/cdn.attn.tv\/bodi\/dtag.js?shop=xragki-mv.myshopify.com","https:\/\/xragki-mv.myshopify.com\/cdn\/shop\/t\/2\/assets\/yoast-active-script.js?shop=xragki-mv.myshopify.com"];
for (var i = 0; i < urls.length; i++) {
var s = document.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = urls[i];
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
}
};
if(window.attachEvent) {
window.attachEvent('onload', asyncLoad);
} else {
window.addEventListener('load', asyncLoad, false);
}
})();</script>
<script id="__st">var __st={"a":75560616153,"offset":-25200,"reqid":"6e085e28-4b65-4495-98ab-0c6166bbbadf-1787436220","pageurl":"shop.bodi.com\/products\/ultimate-reset-cleanse","u":"4d5b6757f39e","p":"product","rtyp":"product","rid":9413928616153};</script>
<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
<script id="captcha-bootstrap">!function(){'use strict';const t='contact',e='account',n='new_comment',o=[[t,t],['blogs',n],['comments',n],[t,'customer']],c=[[e,'customer_login'],[e,'guest_login'],[e,'recover_customer_password'],[e,'create_customer']],r=t=>t.map((([t,e])=>`form[action*='/${t}']:not([data-nocaptcha='true']) input[name='form_type'][value='${e}']`)).join(','),a=t=>()=>t?[...document.querySelectorAll(t)].map((t=>t.form)):[];function s(){const t=[...o],e=r(t);return a(e)}const i='password',u='form_key',d=['recaptcha-v3-token','g-recaptcha-response','h-captcha-response',i],f=()=>{try{return window.sessionStorage}catch{return}},m='__shopify_v',_=t=>t.elements[u];function p(t,e,n=!1){try{const o=window.sessionStorage,c=JSON.parse(o.getItem(e)),{data:r}=function(t){const{data:e,action:n}=t;return t[m]||n?{data:e,action:n}:{data:t,action:n}}(c);for(const[e,n]of Object.entries(r))t.elements[e]&&(t.elements[e].value=n);n&&o.removeItem(e)}catch(o){console.error('form repopulation failed',{error:o})}}const l='form_type',E='cptcha';function T(t){t.dataset[E]=!0}const w=window,h=w.document,L='Shopify',v='ce_forms',y='captcha';let A=!1;((t,e)=>{const n=(g='f06e6c50-85a8-45c8-87d0-21a2b65856fe',I='https://cdn.shopify.com/shopifycloud/storefront-forms-hcaptcha/ce_storefront_forms_captcha_hcaptcha.v1.5.2.iife.js',D={infoText:'Protected by hCaptcha',privacyText:'Privacy',termsText:'Terms'},(t,e,n)=>{const o=w[L][v],c=o.bindForm;if(c)return c(t,g,e,D).then(n);var r;o.q.push([[t,g,e,D],n]),r=I,A||(h.body.append(Object.assign(h.createElement('script'),{id:'captcha-provider',async:!0,src:r})),A=!0)});var g,I,D;w[L]=w[L]||{},w[L][v]=w[L][v]||{},w[L][v].q=[],w[L][y]=w[L][y]||{},w[L][y].protect=function(t,e){n(t,void 0,e),T(t)},Object.freeze(w[L][y]),function(t,e,n,w,h,L){const[v,y,A,g]=function(t,e,n){const i=e?o:[],u=t?c:[],d=[...i,...u],f=r(d),m=r(i),_=r(d.filter((([t,e])=>n.includes(e))));return[a(f),a(m),a(_),s()]}(w,h,L),I=t=>{const e=t.target;return e instanceof HTMLFormElement?e:e&&e.form},D=t=>v().includes(t);t.addEventListener('submit',(t=>{const e=I(t);if(!e)return;const n=D(e)&&!e.dataset.hcaptchaBound&&!e.dataset.recaptchaBound,o=_(e),c=g().includes(e)&&(!o||!o.value);(n||c)&&t.preventDefault(),c&&!n&&(function(t){try{if(!f())return;!function(t){const e=f();if(!e)return;const n=_(t);if(!n)return;const o=n.value;o&&e.removeItem(o)}(t);const e=Array.from(Array(32),(()=>Math.random().toString(36)[2])).join('');!function(t,e){_(t)||t.append(Object.assign(document.createElement('input'),{type:'hidden',name:u})),t.elements[u].value=e}(t,e),function(t,e){const n=f();if(!n)return;const o=[...t.querySelectorAll(`input[type='${i}']`)].map((({name:t})=>t)),c=[...d,...o],r={};for(const[a,s]of new FormData(t).entries())c.includes(a)||(r[a]=s);n.setItem(e,JSON.stringify({[m]:1,action:t.action,data:r}))}(t,e)}catch(e){console.error('failed to persist form',e)}}(e),e.submit())}));const S=(t,e)=>{t&&!t.dataset[E]&&(n(t,e.some((e=>e===t))),T(t))};for(const o of['focusin','change'])t.addEventListener(o,(t=>{const e=I(t);D(e)&&S(e,y())}));const B=e.get('form_key'),M=e.get(l),P=B&&M;t.addEventListener('DOMContentLoaded',(()=>{const t=y();if(P)for(const e of t)e.elements[l].value===M&&p(e,B);[...new Set([...A(),...v().filter((t=>'true'===t.dataset.shopifyCaptcha))])].forEach((e=>S(e,t)))}))}(h,new URLSearchParams(w.location.search),n,t,e,['guest_login'])})(!0,!0)}();</script>
<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//shop.bodi.com/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
<script>(function () {var userAgent = navigator.userAgent;var platform = navigator.platform;var maxTouchPoints = navigator.maxTouchPoints || 0;var isIOS = /iPad|iPhone|iPod/.test(platform) || (platform === 'MacIntel' && maxTouchPoints > 1);var isMacSafari = platform.indexOf('Mac') === 0 && /Safari/.test(userAgent) && !/Chrome|Chromium|CriOS|FxiOS|Edg|OPR|Android/.test(userAgent);var isAppleSafari = isIOS || isMacSafari;if (isAppleSafari) {fetch('/sf_private_access_tokens' + location.search).catch(function () {});}function browserMajorVersion(pattern) {var match = userAgent.match(pattern);return match ? parseInt(match[1], 10) : null;}function shouldLoadAutosizesPolyfill() {if (!window.PerformanceObserver?.supportedEntryTypes?.includes('paint')) {return false;}var chromeVersion = browserMajorVersion(/Chrome\/(\d+)/);if (chromeVersion !== null) {return chromeVersion < 126;}var firefoxVersion = browserMajorVersion(/Firefox\/(\d+)/);if (firefoxVersion !== null) {return firefoxVersion < 150;}var safariVersion = isAppleSafari ? browserMajorVersion(/Version\/(\d+).*Safari\//) : null;if (safariVersion !== null) {return safariVersion < 27;}return true;}if (shouldLoadAutosizesPolyfill()) {var autosizesScript = document.createElement('script');autosizesScript.async = true;autosizesScript.crossOrigin = 'anonymous';autosizesScript.src = "//shop.bodi.com/cdn/shopifycloud/storefront/assets/storefront/autosizes-84416378.js";(document.head || document.documentElement).appendChild(autosizesScript);}window.ShopifyAnalytics = window.ShopifyAnalytics || {};window.ShopifyAnalytics.performance = window.ShopifyAnalytics.performance || {};(function () {var LONG_FRAME_THRESHOLD = 50;var longAnimationFrames = [];var activeRafId = null;function collectLongFrames() {var previousTime = null;function rafMonitor(now) {if (activeRafId === null) {return;}var delta = now - previousTime;if (delta > LONG_FRAME_THRESHOLD) {longAnimationFrames.push({startTime: previousTime,endTime: now,});}previousTime = now;activeRafId = requestAnimationFrame(rafMonitor);}previousTime = performance.now();activeRafId = requestAnimationFrame(rafMonitor);}if (!window.PerformanceObserver?.supportedEntryTypes?.includes('long-animation-frame')) {collectLongFrames();var timeoutId = setTimeout(function () {cancelAnimationFrame(activeRafId);}, 10000);window.ShopifyAnalytics.performance.getLongAnimationFrames = function (stopCollection) {if (stopCollection === undefined) {stopCollection = false;}if (stopCollection) {clearTimeout(timeoutId);cancelAnimationFrame(activeRafId);}return longAnimationFrames;};}})();})();</script><script crossorigin="anonymous" defer="defer" src="//shop.bodi.com/cdn/shopifycloud/storefront/assets/shopify_pay/storefront-bf1cdb70.js?v=20250812"></script>
<script id="shopify-origin-trials" async="async" integrity="sha256-mqQjA+yhr1DtPsW5MhDIq3zDu+LghfjNT49r/ttG3eY=" src="//cdn.shopify.com/shopifycloud/storefront/assets/storefront/origin_trials-5059b83f.js" crossorigin="anonymous" onload="window.__shopifyOriginTrialsDone = true" onerror="window.__shopifyOriginTrialsDone = true"></script>
<script>
window.Shopify = window.Shopify || {};
window.Shopify.MCP = window.Shopify.MCP || {};
window.Shopify.MCP.enabled = true;
window.Shopify.MCP.shop = "xragki-mv.myshopify.com";
window.Shopify.MCP.mcpEndpoint = "https:\/\/shop.bodi.com\/api\/mcp";
window.Shopify.MCP.tools = [{"name":"search_shop_policies_and_faqs","description":"Used to get facts about the stores policies, products, or services.\nSome examples of questions you can ask are:\n - What is your return policy?\n - What is your shipping policy?\n - What is your phone number?\n - What are your hours of operation?\"\n","inputSchema":{"$schema":"https:\/\/json-schema.org\/draft\/2020-12\/schema","type":"object","properties":{"query":{"type":"string","description":"A natural language query."},"context":{"type":"string","description":"Additional information about the request such as user demographics, mood, location, or other relevant details that could help in tailoring the response appropriately."}},"required":["query"]}}];
</script>
<script>(()=>{var d="shopify:webmcp_adapter_loaded",n=Symbol.for("shopify.webmcp_adapter_loading");function s(c,a,{win:r=window,doc:o=document}={}){function p(){try{return r.localStorage.getItem(d)==="true"}catch{return!1}}function l(){try{r.localStorage.setItem(d,"true")}catch{}}function u(){return typeof(o.modelContext||r.navigator?.modelContext)?.registerTool=="function"}function f(){if(r[n]||!u())return;let t=o.head||o.getElementsByTagName("head")[0];if(!t)return;let e=o.createElement("script");e.type="module",e.crossOrigin="anonymous",a&&(e.integrity=a),e.src=c,e.addEventListener("load",l,{once:!0}),e.addEventListener("error",()=>{r[n]=!1},{once:!0}),t.appendChild(e),r[n]=!0}function _(t){let e=o.getElementById("shopify-origin-trials");if(!e||r.__shopifyOriginTrialsDone){t();return}e.addEventListener("load",t,{once:!0}),e.addEventListener("error",t,{once:!0})}function i(){_(()=>r.setTimeout(f,0))}function m(){o.addEventListener("DOMContentLoaded",i,{once:!0})}p()?i():m()}s("https:\/\/cdn.shopify.com\/storefront\/webmcp\/webmcp-0.1.1.js","");})();
</script>
<script data-source-attribution="shopify.dynamic_checkout.dynamic.init">var Shopify=Shopify||{};Shopify.PaymentButton=Shopify.PaymentButton||{isStorefrontPortableWallets:!0,init:function(){window.Shopify.PaymentButton.init=function(){};var t=document.createElement("script");t.src="https://shop.bodi.com/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}};
</script>
<script data-source-attribution="shopify.dynamic_checkout.buyer_consent">
function portableWalletsHideBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.add("hidden"),t.setAttribute("aria-hidden","true"),n.removeEventListener("click",e))}function portableWalletsShowBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.remove("hidden"),t.removeAttribute("aria-hidden"),n.addEventListener("click",e))}window.Shopify?.PaymentButton&&(window.Shopify.PaymentButton.hideBuyerConsent=portableWalletsHideBuyerConsent,window.Shopify.PaymentButton.showBuyerConsent=portableWalletsShowBuyerConsent);
</script>
<script data-source-attribution="shopify.dynamic_checkout.cart.bootstrap">document.addEventListener("DOMContentLoaded",(function(){function t(){return document.querySelector("shopify-accelerated-checkout-cart, shopify-accelerated-checkout")}if(t())Shopify.PaymentButton.init();else{new MutationObserver((function(e,n){t()&&(Shopify.PaymentButton.init(),n.disconnect())})).observe(document.body,{childList:!0,subtree:!0})}}));
</script>
<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://shop.bodi.com/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous">
<style id="shopify-accelerated-checkout-cart">
#shopify-buyer-consent {
margin-top: 1em;
display: inline-block;
width: 100%;
}
#shopify-buyer-consent.hidden {
display: none;
}
#shopify-subscription-policy-button {
background: none;
border: none;
padding: 0;
text-decoration: underline;
font-size: inherit;
cursor: pointer;
}
#shopify-subscription-policy-button::before {
box-shadow: none;
}
</style>
<link rel="stylesheet" media="screen" href="//shop.bodi.com/cdn/shop/t/2/compiled_assets/styles.css?v=93442057495055766271786651045">
<script id="sections-script" data-sections="bodi-login-drawer,bodi-account-drawer" defer="defer" src="//shop.bodi.com/cdn/shop/t/2/compiled_assets/scripts.js?v=49248537996957404821776268639"></script>
<script id="snippets-script" data-snippets="guarantees" defer="defer" src="//shop.bodi.com/cdn/shop/t/2/compiled_assets/snippet-scripts.js?v=73062019679739540421781245921"></script>
<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
<script>
(() => {
// Prevent double-injection (theme editor, app embeds, etc.)
if (window.__BODI_REBUY_EXTENSIONS__) return;
window.__BODI_REBUY_EXTENSIONS__ = true;
// debug flag for teacing ouput
const BODI_REBUY_DEBUG = false;
if (BODI_REBUY_DEBUG) {
console.warn('[Rebuy Debug] Debug mode enabled via theme settings.');
}
const logDebug = (...args) => {
if (!BODI_REBUY_DEBUG) return;
console.log('[Rebuy Debug]', ...args);
};
const hasTag = (tags, needle) => {
if (!tags || !needle) return false;
const tagList = Array.isArray(tags) ? tags : String(tags).split(',').map(t => t.trim());
const n = String(needle).toLowerCase();
return tagList.some((tag) => String(tag).toLowerCase().includes(n));
};
const bodiWidgets = [];
const linkedWidgetIdSet = new Set();
const bodiWidgetById = new Map();
const shopLocaleCode = "us_en";
const isNativeCartPage = location.pathname === '/cart' || location.pathname.startsWith('/cart/');
let progressBarEl = null;bodiWidgets.push({
id: "274649",
linked_widget_id: null,
is_global: true,
is_spotlight: false,
hide_cart_on_open: false,
show_cart_on_close: false,
use_bodi_template: false,
// sources and dependents for orphaned promo items
source_product_ids: [],
source_variant_ids: [],
dependent_product_ids: [],
dependent_variant_ids: []
});
bodiWidgets.push({
id: "274810",
linked_widget_id: null,
is_global: true,
is_spotlight: false,
hide_cart_on_open: true,
show_cart_on_close: true,
use_bodi_template: true,
// sources and dependents for orphaned promo items
source_product_ids: [9413928288473
,9413924192473
,9413924421849
,9665481605337
,9413924880601
,9413924094169
,9413924946137
,9413924487385
,9665481539801
,9665481572569
,9413928386777
,9413924749529
,9413923963097
,9413924159705
,9665481638105
,9413924520153
,9665481507033
,9413928616153
,9413924585689
,9413924061401
],
source_variant_ids: [],
dependent_product_ids: [],
dependent_variant_ids: [48040135983321
]
});
bodiWidgets.push({
id: "274645",
linked_widget_id: null,
is_global: false,
is_spotlight: false,
hide_cart_on_open: false,
show_cart_on_close: false,
use_bodi_template: true,
// sources and dependents for orphaned promo items
source_product_ids: [],
source_variant_ids: [],
dependent_product_ids: [],
dependent_variant_ids: []
});
bodiWidgets.push({
id: "298800",
linked_widget_id: null,
is_global: false,
is_spotlight: true,
hide_cart_on_open: false,
show_cart_on_close: false,
use_bodi_template: true,
// sources and dependents for orphaned promo items
source_product_ids: [],
source_variant_ids: [],
dependent_product_ids: [],
dependent_variant_ids: []
});
bodiWidgets.push({
id: "274634",
linked_widget_id: null,
is_global: false,
is_spotlight: true,
hide_cart_on_open: false,
show_cart_on_close: false,
use_bodi_template: true,
// sources and dependents for orphaned promo items
source_product_ids: [],
source_variant_ids: [],
dependent_product_ids: [],
dependent_variant_ids: []
});
bodiWidgets.push({
id: "274648",
linked_widget_id: null,
is_global: false,
is_spotlight: false,
hide_cart_on_open: false,
show_cart_on_close: false,
use_bodi_template: true,
// sources and dependents for orphaned promo items
source_product_ids: [],
source_variant_ids: [],
dependent_product_ids: [],
dependent_variant_ids: []
});
bodiWidgets.push({
id: "295987",
linked_widget_id: null,
is_global: true,
is_spotlight: false,
hide_cart_on_open: false,
show_cart_on_close: false,
use_bodi_template: false,
// sources and dependents for orphaned promo items
source_product_ids: [],
source_variant_ids: [],
dependent_product_ids: [],
dependent_variant_ids: []
});
bodiWidgets.push({
id: "274653",
linked_widget_id: null,
is_global: true,
is_spotlight: false,
hide_cart_on_open: false,
show_cart_on_close: false,
use_bodi_template: false,
// sources and dependents for orphaned promo items
source_product_ids: [],
source_variant_ids: [],
dependent_product_ids: [],
dependent_variant_ids: []
});
bodiWidgets.push({
id: "274807",
linked_widget_id: null,
is_global: false,
is_spotlight: false,
hide_cart_on_open: true,
show_cart_on_close: true,
use_bodi_template: true,
// sources and dependents for orphaned promo items
source_product_ids: [],
source_variant_ids: [47683217817817
],
dependent_product_ids: [],
dependent_variant_ids: [47683215982809
]
});
bodiWidgets.push({
id: "274646",
linked_widget_id: null,
is_global: false,
is_spotlight: false,
hide_cart_on_open: false,
show_cart_on_close: false,
use_bodi_template: true,
// sources and dependents for orphaned promo items
source_product_ids: [],
source_variant_ids: [],
dependent_product_ids: [],
dependent_variant_ids: []
});
bodiWidgets.push({
id: "294582",
linked_widget_id: null,
is_global: false,
is_spotlight: false,
hide_cart_on_open: true,
show_cart_on_close: true,
use_bodi_template: true,
// sources and dependents for orphaned promo items
source_product_ids: [],
source_variant_ids: [47683217817817
],
dependent_product_ids: [],
dependent_variant_ids: [47683215982809
]
});
logDebug('Initialized bodiWidgets:', bodiWidgets);
logDebug('Linked widget IDs:', Array.from(linkedWidgetIdSet));
bodiWidgetById.clear();
bodiWidgets.forEach((w) => bodiWidgetById.set(w.id, w));
// Helper: return Rebuy widget instance by ID
function getRebuyWidget(id) {
if (!id) return null;
if (!window.Rebuy || !Array.isArray(window.Rebuy.widgets)) return null;
const w = window.Rebuy.widgets.find(w => w.id === id) || null;
logDebug('getRebuyWidget(', id, ') ->', w);
return w;
}
// Helper: get metaobject widget config (O(1))
function getBodiWidget(id) {
if (!id) return null;
const w = bodiWidgetById.get(id) || null;
logDebug('getBodiWidget(', id, ') ->', w);
return w;
}
// Helper: return both Rebuy + Bodi configs
function getWidgetPair(id) {
const pair = { rebuy: getRebuyWidget(id), bodi: getBodiWidget(id) };
logDebug('getWidgetPair(', id, ') ->', pair);
return pair;
}
// Helper: spotlight detection
const isSpotlight = (id) => {
const b = getBodiWidget(id);
return b ? !!b.is_spotlight : false;
}
// Helper: check if more than 1 BODi subscription is in cart
const hasMultipleUniques = () => {
setTimeout(() => {
if (!window.Rebuy || !Rebuy.SmartCart || !Rebuy.Cart) return false;
const rebuyCart = Rebuy.Cart;
rebuyCart.enrichCart();
const cartItems = Array.isArray(rebuyCart.items()) ? rebuyCart.items() : [];
if (!cartItems.length) return false;
const uniqueBodiSubTag = 'Merch_Cart_Unique';
let uniqueCount = 0;
cartItems.forEach((item) => {
const tags = item.product?.tags || '';
if (tags.toLowerCase().includes(uniqueBodiSubTag.toLowerCase())) {
uniqueCount++
};
});
handleCartError((uniqueCount > 1));
return (uniqueCount > 1);
}, 300);
}
// Expose helper globally for rebuy-widget-templates usage (Vue attrs)
window.__BODI_REBUY__ = window.__BODI_REBUY__ || {};
window.__BODI_REBUY__.isSpotlight = isSpotlight;
window.__BODI_REBUY__.hasTag = hasTag;
// Helper: detect native Rebuy GWP widgets so we don't interfere
function isNativeGwpWidget(widget) {
if (!widget) return false;
const type =
(widget.data && widget.data.config && widget.data.config.type) ||
widget.type ||
'';
return String(type).toLowerCase() === 'gift_with_purchase';
}
// Helper: stash widget discount message for translation
const stashOriginalDiscountMessages = (widget) => {
const sDisc = widget?.data?.settings?.discount;
const cDisc = widget?.data?.config?.discount;
if (sDisc && sDisc.__bodi_original_message == null) {
sDisc.__bodi_original_message = sDisc.message;
}
if (cDisc && cDisc.__bodi_original_message == null) {
cDisc.__bodi_original_message = cDisc.message;
}
};
// Helper: apply base English discount message override from datasource custom data
// Reads discount_message_en from the datasource rule's custom output fields
// Call before applyWidgetFrDiscountMessageOverride so FR can layer on top
const applyWidgetDiscountMessageOverride = (widget) => {
if (!widget?.id) return;
if (isNativeGwpWidget(widget)) return;
const msg = widget?.data?.metadata?.custom?.en_discount_message;
if (typeof msg !== 'string' || msg.trim() === '') return;
const hasSettingsDiscount = !!widget?.data?.settings?.discount;
const hasConfigDiscount = !!widget?.data?.config?.discount;
if (!hasSettingsDiscount && !hasConfigDiscount) return;
stashOriginalDiscountMessages(widget);
if (hasSettingsDiscount) widget.data.settings.discount.message = msg.trim();
if (hasConfigDiscount) widget.data.config.discount.message = msg.trim();
logDebug('[Widget Discount] EN message override applied', { id: widget.id, message: msg.trim() });
};
// Helper: translate discount message if custom one is defined (CA-FR only)
// Always call after applyWidgetDiscountMessageOverride so FR layers on top of EN
const applyWidgetFrDiscountMessageOverride = (widget) => {
if (!widget?.id) return;
if (shopLocaleCode !== 'ca_fr') return;
const frMsg = widget?.data?.metadata?.custom?.fr_discount_message;
const msg = (typeof frMsg === 'string' && frMsg.trim() !== '') ? frMsg.trim() : '';
if (!msg) return;
const hasSettingsDiscount = !!widget?.data?.settings?.discount;
const hasConfigDiscount = !!widget?.data?.config?.discount;
if (!hasSettingsDiscount && !hasConfigDiscount) return;
if (isNativeGwpWidget(widget)) return;
stashOriginalDiscountMessages(widget);
if (hasSettingsDiscount) widget.data.settings.discount.message = msg;
if (hasConfigDiscount) widget.data.config.discount.message = msg;
logDebug('[Widget Discount] CA-FR override applied', { id: widget.id, message: msg });
};
// Helper: override SmartCart line-item discount titles using widget metadata.custom.fr_discount_message
const patchSmartCartDiscountTitles = () => {
if (!Array.isArray(window.Rebuy?.widgets)) return;
const items = window.Rebuy?.SmartCart?.cart?.items;
if (!Array.isArray(items) || !items.length) return;
const getWidgetById = (id) => {
const n = Number(id);
return window.Rebuy.widgets.find(w => Number(w?.id) === n) || null;
};
for (const item of items) {
const wid = item?.properties?._widget_id;
if (!wid) continue;
const widget = getWidgetById(wid);
// Resolve message: FR takes priority over EN, EN over nothing
const enRaw = widget?.data?.metadata?.custom?.en_discount_message;
const frRaw = widget?.data?.metadata?.custom?.fr_discount_message;
const msgRaw = (shopLocaleCode === 'ca_fr' ? frRaw : null) || enRaw;
const msg = (typeof msgRaw === 'string' && msgRaw.trim() !== '') ? msgRaw.trim() : '';
if (!msg) continue;
// Only patch if the item actually has line-item discounts
const hasLineDiscount =
(Array.isArray(item?.discounts) && item.discounts.length > 0) ||
(Array.isArray(item?.line_level_discount_allocations) && item.line_level_discount_allocations.length > 0) ||
Number(item?.line_level_total_discount || 0) > 0 ||
Number(item?.total_discount || 0) > 0;
if (!hasLineDiscount) continue;
if (Array.isArray(item.discounts)) {
item.discounts.forEach(d => {
if (d && typeof d === 'object') d.title = msg;
});
}
if (Array.isArray(item.line_level_discount_allocations)) {
item.line_level_discount_allocations.forEach(a => {
const app = a?.discount_application;
if (app && typeof app === 'object') app.title = msg;
});
}
logDebug('[SmartCart] Patched discount title', { widget_id: wid, variant_id: item?.variant_id, msg });
}
};
// Build pruning indexes from current cart items
// Primary lookup is cfgsByWidgetId — keyed by widget ID string — so pruning
// decisions are always scoped to the widget that actually placed the item
const buildPruneIndexes = (items) => {
const sourceProductIdsInCart = new Set();
const sourceVariantIdsInCart = new Set();
for (const it of items) {
if (typeof it?.product_id === 'number') sourceProductIdsInCart.add(it.product_id);
if (typeof it?.variant_id === 'number') sourceVariantIdsInCart.add(it.variant_id);
}
const cfgByDependentProduct = new Map();
const cfgByDependentVariant = new Map();
// Index configs by widget ID (string) — primary lookup path.
// One widget ID may map to multiple configs (e.g. two promos sharing
// one cross-sell widget, each with its own metaobject entry).
const cfgsByWidgetId = new Map();
for (const cfg of bodiWidgets) {
const dp = Array.isArray(cfg.dependent_product_ids) ? cfg.dependent_product_ids : [];
const dv = Array.isArray(cfg.dependent_variant_ids) ? cfg.dependent_variant_ids : [];
for (const id of dp) {
if (!cfgByDependentProduct.has(id)) cfgByDependentProduct.set(id, []);
cfgByDependentProduct.get(id).push(cfg);
}
for (const id of dv) {
if (!cfgByDependentVariant.has(id)) cfgByDependentVariant.set(id, []);
cfgByDependentVariant.get(id).push(cfg);
}
// Only index configs that actually declare dependent items
if (dp.length > 0 || dv.length > 0) {
// Normalise to string — Liquid may render the ID as a number
// but Rebuy writes _widget_id on line items as a string
const wid = String(cfg.id);
if (!cfgsByWidgetId.has(wid)) cfgsByWidgetId.set(wid, []);
cfgsByWidgetId.get(wid).push(cfg);
}
}
const skipCfgIdSet = new Set();
if (window.Rebuy && Array.isArray(window.Rebuy.widgets)) {
for (const w of window.Rebuy.widgets) {
if (isNativeGwpWidget(w)) skipCfgIdSet.add(w.id);
}
}
return {
sourceProductIdsInCart,
sourceVariantIdsInCart,
cfgByDependentProduct,
cfgByDependentVariant,
cfgsByWidgetId,
skipCfgIdSet
};
};
// Removes Rebuy promo products when NO qualifying source remains.
//
// An item is a promo candidate only if:
// (a) it's Rebuy-tagged and not _flow_id protected
// (b) its _widget_id belongs to a managed widget (one with dependent config)
// (c) it's discounted or free
//
// Config matching: looks up all configs for the item's widget ID, finds those
// whose dependent lists cover this item's variant/product, then keeps the item
// if ANY of those configs has a qualifying source in cart. This correctly handles
// multiple promos sharing one widget ID without cross-contamination.
const pruneOrphanedRebuyItems = async ({ getItems, removeLine, label = 'Cart' }) => {
try {
const items = await getItems();
if (!Array.isArray(items) || !items.length) return;
const hasAnyRebuyTagged = items.some((it) => {
const p = it?.properties || {};
if (!!p._flow_id) return false;
return p._source === 'Rebuy' || p._attribution === 'Rebuy Cart' || !!p._widget_id;
});
if (!hasAnyRebuyTagged) return;
const isRebuyTagged = (it) => {
const p = it?.properties || {};
if (!!p._flow_id) return false;
return p._source === 'Rebuy' || p._attribution === 'Rebuy Cart' || !!p._widget_id;
};
const hasDiscount = (it) => {
if (Number(it?.total_discount || 0) > 0) return true;
if (Array.isArray(it?.discounts) && it.discounts.length > 0) return true;
if (Array.isArray(it?.line_level_discount_allocations) && it.line_level_discount_allocations.length > 0) return true;
if (Number(it?.line_level_total_discount || 0) > 0) return true;
if (typeof it?.final_price === 'number' && typeof it?.original_price === 'number') {
return it.final_price < it.original_price;
}
if (typeof it?.discounted_price === 'number' && typeof it?.original_price === 'number') {
return it.discounted_price < it.original_price;
}
return false;
};
const {
sourceProductIdsInCart,
sourceVariantIdsInCart,
cfgsByWidgetId,
skipCfgIdSet
} = buildPruneIndexes(items);
// Set of widget IDs (strings) that have at least one managed config.
// Used to gate isPromo — items from unrelated widgets are never flagged.
const managedWidgetIds = new Set(cfgsByWidgetId.keys());
const isPromo = (it) => {
if (!isRebuyTagged(it)) return false;
const rawWid = it?.properties?._widget_id;
const wid = rawWid != null ? String(rawWid) : null;
if (!wid || !managedWidgetIds.has(wid)) return false;
const isFree = typeof it?.final_price === 'number' && it.final_price === 0;
return isFree || hasDiscount(it);
};
const cartHasSourceForConfig = (cfg) => {
const srcP = Array.isArray(cfg.source_product_ids) ? cfg.source_product_ids : [];
const srcV = Array.isArray(cfg.source_variant_ids) ? cfg.source_variant_ids : [];
for (const id of srcP) if (sourceProductIdsInCart.has(id)) return true;
for (const id of srcV) if (sourceVariantIdsInCart.has(id)) return true;
return false;
};
const promos = items.filter(isPromo);
if (!promos.length) return;
const toRemove = [];
for (const promo of promos) {
const rawWid = promo?.properties?._widget_id;
const wid = rawWid != null ? String(rawWid) : null;
if (!wid) continue;
// All configs for the widget that placed this item, minus native GWP widgets
const widgetCfgs = (cfgsByWidgetId.get(wid) || [])
.filter(cfg => !skipCfgIdSet.has(cfg.id));
if (!widgetCfgs.length) continue;
// Find ALL configs whose dependent lists cover this promo item —
// there may be multiple configs sharing a widget ID (one per promo).
// The item is valid if ANY of them has a qualifying source in cart.
const matchingCfgs = widgetCfgs.filter(cfg =>
(Array.isArray(cfg.dependent_variant_ids) &&
cfg.dependent_variant_ids.includes(promo.variant_id)) ||
(Array.isArray(cfg.dependent_product_ids) &&
cfg.dependent_product_ids.includes(promo.product_id))
);
if (!matchingCfgs.length) continue;
const stillValid = matchingCfgs.some(cfg => cartHasSourceForConfig(cfg));
if (!stillValid) toRemove.push(promo);
}
if (!toRemove.length) return;
logDebug(`[${label}] Pruning orphan promos:`, toRemove);
for (const promo of toRemove) {
await removeLine(promo);
}
} catch (err) {
console.error('[Rebuy Extensions] Error pruning orphan promos:', err);
}
};
// SmartCart adapter
const pruneSmartCartOrphans = () => {
if (!window.Rebuy || !Rebuy.SmartCart || !Rebuy.Cart) return;
return pruneOrphanedRebuyItems({
label: 'SmartCart',
getItems: () => (Array.isArray(Rebuy.SmartCart.items()) ? Rebuy.SmartCart.items() : []),
removeLine: (item) => Rebuy.Cart.removeItem(item)
});
};
let __nativePruneRunning = false;
let __nativePrunePending = false;
let __nativeCartCache = null;
const dispatchNativeCartUpdate = (cartData) => {
const detail = { data: { didError: false, cart: cartData } };
try { document.dispatchEvent(new CustomEvent('cart:update', { detail })); } catch (e) {}
try { window.dispatchEvent(new CustomEvent('cart:update', { detail })); } catch (e) {}
// Optional extra “poke” some themes listen for
// try { document.dispatchEvent(new CustomEvent('cart:refresh', { detail })); } catch (e) {}
// try { window.dispatchEvent(new CustomEvent('cart:refresh', { detail })); } catch (e) {}
};
// Native /cart empty-cart edge case testing for when the DOM is not updated for whatever reason
const safeReloadOnce = (() => {
const KEY = '__BODI_NATIVE_CART_RELOAD_TS__';
const COOLDOWN_MS = 15 * 1000;
return () => {
try {
const now = Date.now();
const last = Number(sessionStorage.getItem(KEY) || 0);
if (now - last < COOLDOWN_MS) return;
sessionStorage.setItem(KEY, String(now));
} catch (e) {}
try {
const url = new URL(window.location.href);
url.searchParams.set('__bodi_cart_refresh', String(Date.now()));
window.location.replace(url.toString());
} catch (e) {
window.location.reload();
}
};
})();
// Native /cart DOM row detection. Only use when /cart.js says the cart is empty
const countNativeCartDomRows = () => {
const selectors = [
'[data-line-item-key]',
'[data-cart-item-key]',
'[data-key]',
'.cart-item',
'.cart__row'
];
try {
return document.querySelectorAll(selectors.join(',')).length;
} catch (e) {
return 0;
}
};
const fetchCartJson = async () => {
const res = await fetch('/cart.js', { credentials: 'same-origin' });
const data = await res.json().catch(() => null);
if (!res.ok || !data) throw new Error(`Failed to fetch /cart.js (${res.status})`);
__nativeCartCache = data;
return data;
};
const isValidChangeId = (v) => {
if (v == null) return false;
const s = String(v);
return /^\d+$/.test(s) || /^\d+:[a-f0-9]{32}$/.test(s);
};
const removeNativeLine = async (item) => {
const tryChange = async (payload) => {
const res = await fetch('/cart/change.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
credentials: 'same-origin',
body: JSON.stringify(payload)
});
const data = await res.json().catch(() => null);
if (res.status === 422) return { ok: false, status: 422, data };
if (!res.ok || !data) return { ok: false, status: res.status, data };
if (typeof data.status === 'number' && data.status >= 400) {
return { ok: false, status: data.status, data };
}
return { ok: true, status: res.status, data };
};
const findLineByKey = (cartItems, key) => {
if (!Array.isArray(cartItems) || !key) return -1;
return cartItems.findIndex((it) => it && it.key === key);
};
const key = item?.key;
let cartItems = Array.isArray(__nativeCartCache?.items) ? __nativeCartCache.items : [];
if (!cartItems.length) {
const cart = await fetchCartJson();
cartItems = Array.isArray(cart?.items) ? cart.items : [];
}
let idx = findLineByKey(cartItems, key);
if (idx === -1) {
const cart = await fetchCartJson();
cartItems = Array.isArray(cart?.items) ? cart.items : [];
idx = findLineByKey(cartItems, key);
}
if (idx === -1) {
logDebug('[Native Cart] removeNativeLine: item already removed, skipping', key);
return __nativeCartCache;
}
let result = await tryChange({ line: idx + 1, quantity: 0 });
if (!result.ok && result.status === 422) {
const cart = await fetchCartJson();
const freshItems = Array.isArray(cart?.items) ? cart.items : [];
const freshIdx = findLineByKey(freshItems, key);
if (freshIdx === -1) {
logDebug('[Native Cart] removeNativeLine: item already removed after refetch, skipping', key);
return cart;
}
result = await tryChange({ line: freshIdx + 1, quantity: 0 });
}
// Last resort: id:key (NOT variant_id)
if (!result.ok) {
if (isValidChangeId(key)) {
result = await tryChange({ id: String(key), quantity: 0 });
}
}
if (!result.ok) {
const msg = result?.data?.message || result?.data?.description || '';
throw new Error(`Cart change failed (${result.status})${msg ? `: ${msg}` : ''}`);
}
__nativeCartCache = result.data;
dispatchNativeCartUpdate(result.data);
return result.data;
};
const pruneNativeCartOrphans = async () => {
if (!isNativeCartPage) return;
if (__nativePruneRunning) {
__nativePrunePending = true;
return;
}
__nativePruneRunning = true;
try {
do {
__nativePrunePending = false;
await pruneOrphanedRebuyItems({
label: 'Native Cart',
getItems: async () => {
const cart = await fetchCartJson();
return Array.isArray(cart?.items) ? cart.items : [];
},
removeLine: async (item) => {
await removeNativeLine(item);
}
});
} while (__nativePrunePending);
} finally {
__nativePruneRunning = false;
}
};
let __lastThemeCartUpdateTs = 0;
// Stamps when the theme already handled a cart update
document.addEventListener('cart:update', () => {
__lastThemeCartUpdateTs = Date.now();
}, true);
// Refresh native /cart table when the Shopify cart is mutated on /cart page
const installNativeCartMutationRefresh = () => {
if (!isNativeCartPage) return;
if (window.__BODI_NATIVE_CART_MUTATION_REFRESH__) return;
window.__BODI_NATIVE_CART_MUTATION_REFRESH__ = true;
const originalFetch = window.fetch.bind(window);
// Debounce: add + GWP add + GWP remove, etc. into one refresh
let refreshTimer = null;
const THEME_UPDATE_GRACE_MS = 450;
const DEBOUNCE_MS = 350;
const scheduleRefresh = (reason) => {
// Return if the theme just updated the cart UI
if (Date.now() - (__lastThemeCartUpdateTs || 0) < THEME_UPDATE_GRACE_MS) {
logDebug('[Native Cart] Skip refresh (theme already updated recently)', { reason });
return;
}
if (refreshTimer) clearTimeout(refreshTimer);
refreshTimer = setTimeout(async () => {
refreshTimer = null;
// Theme may have updated while we were waiting
if (Date.now() - (__lastThemeCartUpdateTs || 0) < THEME_UPDATE_GRACE_MS) {
logDebug('[Native Cart] Skip refresh (theme updated during debounce)', { reason });
return;
}
try {
const cart = await fetchCartJson();
dispatchNativeCartUpdate(cart);
const isEmpty =
Number(cart?.item_count || 0) === 0 ||
(Array.isArray(cart?.items) && cart.items.length === 0);
if (isEmpty) {
const domRows = countNativeCartDomRows();
// Edge case where the DOM doesn't reflect a cart update. May not need this
/* if (domRows > 0) {
logDebug('[Native Cart] /cart.js empty but DOM still shows rows → hard refresh (guarded)');
safeReloadOnce();
} */
}
} catch (e) {
logDebug('[Native Cart] Failed to refresh cart after cart mutation', e);
}
}, DEBOUNCE_MS);
};
const urlMatchesCartMutation = (url) => {
if (!url) return false;
const u = String(url);
return (
u.includes('/cart/add') ||
u.includes('/cart/change') ||
u.includes('/cart/update')
);
};
// Detect theme-driven section rendering calls so we don’t cause flicker
const looksLikeThemeSectionChange = (url, init) => {
try {
const u = String(url || '');
if (!u.includes('/cart/change')) return false;
const body = init?.body;
if (!body) return false;
const s = (typeof body === 'string') ? body : '';
// Specific to theme request
if (s.includes('"sections"') && s.includes('"sections_url"')) return true;
if (s.includes('sections=') && s.includes('sections_url=')) return true;
return false;
} catch (e) {
return false;
}
};
window.fetch = async (input, init) => {
const url = (input instanceof Request) ? input.url : input;
const method =
(init && init.method) ||
(input instanceof Request ? input.method : 'GET') ||
'GET';
const isPost = String(method).toUpperCase() === 'POST';
const shouldWatch = isPost && urlMatchesCartMutation(url);
// Let the request happen first
const res = await originalFetch(input, init);
if (shouldWatch && res && res.ok) {
// If this was the theme itself morphing sections, skip our refresh to reduce flicker.
if (looksLikeThemeSectionChange(url, init)) {
logDebug('[Native Cart] Skip refresh (theme section change request)', url);
return res;
}
logDebug('[Native Cart] Detected Shopify cart mutation → scheduling refresh', url);
scheduleRefresh(String(url));
}
return res;
};
logDebug('[Native Cart] Installed cart mutation refresh interceptor (debounced + guarded)');
};
// Helper: limit quantity for tagged products in Smart Cart
const limitItemQuantities = () => {
setTimeout(() => {
if (!window.Rebuy || !Rebuy.SmartCart || !Rebuy.Cart) return;
const cartItems = Array.isArray(Rebuy.SmartCart.items()) ? Rebuy.SmartCart.items() : [];
const limitTags = ['DigitalPurchase', 'Membership', 'Subscription'];
cartItems.forEach((item) => {
const tags = item.product?.tags || [];
const shouldLimit = limitTags.some(t => tags.includes(t));
if (shouldLimit && item.quantity > 1) {
Rebuy.Cart.setItemQuantity(item, 1);
}
});
}, 300);
};
function getProgressBarEl() {
if (progressBarEl && document.contains(progressBarEl)) return progressBarEl;
progressBarEl = document.querySelector('div[data-rebuy-component="progress-bar"]');
return progressBarEl;
}
// shows/hides smart cart error message
// can be extended to handle different error messages if needed (msg = '')
function handleCartError(display) {
const cartBodyEl = (isNativeCartPage ? document.querySelector('main') : document.querySelector('div[data-rebuy-cart-anchor="body"]'));
const cartItemsComponentEl = (isNativeCartPage ? document.querySelector('main div.shopify-section:first-child') : document.querySelector('div[data-rebuy-component="cart-items"]'));
const cartErrorMsgEl = document.querySelector('div[data-rebuy-cart-component="error"]');
if (display) {
if (cartErrorMsgEl) return;
const errorMsgInnerHTML = `<div class="rebuy-cart__error-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14 14" focusable="false" aria-hidden="true"><g clip-path="url(#alertCircle_svg__a)"><circle cx="7" cy="7" r="5.5"></circle><path stroke-linecap="round" stroke-linejoin="round" d="M7 3.75v3.5"></path><path stroke-linejoin="round" d="M6.99 9.74h.02v.02h-.02z"></path></g><defs><clipPath id="alertCircle_svg__a"><path fill="#fff" d="M0 0h14v14H0z"></path></clipPath></defs></svg></div><div class="rebuy-cart__error-message">Your cart contains multiple BODi Subscriptions. Please choose 1 and remove all others to proceed.</div>`;
const errorMsgEl = document.createElement('div');
errorMsgEl.setAttribute('data-rebuy-cart-component', 'error');
errorMsgEl.role = 'alert';
errorMsgEl.classList = 'rebuy-cart__error-container';
errorMsgEl.innerHTML = errorMsgInnerHTML;
cartBodyEl.insertBefore(errorMsgEl, cartItemsComponentEl);
} else {
if (!cartErrorMsgEl) return;
cartErrorMsgEl.remove();
}
}
function updateProgressBarVisibility(items) {
const el = getProgressBarEl();
if (!el) return;
const shouldShow = Array.isArray(items)
? items.some(item => hasTag(item.product?.tags, 'supplement'))
: false;
el.style.display = shouldShow ? 'block' : 'none';
}
/** Rebuy tax disclaimer: only when the smart cart has line items. */
function syncSmartCartTaxNote(scope) {
const root =
scope ||
document.querySelector('[data-rebuy-cart-anchor="footer"]') ||
document.querySelector('[data-rebuy-component="cart-subtotal"]')?.parentElement;
if (!root) return;
root.querySelectorAll('.tax-note').forEach((el) => el.parentElement?.remove());
const items = window.Rebuy?.SmartCart?.items?.();
if (!Array.isArray(items) || !items.length) return;
const subtotal = root.querySelector('[data-rebuy-component="cart-subtotal"]');
if (!subtotal) return;
const wrap = document.createElement('div');
wrap.innerHTML = `
<div class="tax-note">
<p>*Shipping & taxes calculated at checkout.</p>
</div>
`;
subtotal.parentNode.insertBefore(wrap, subtotal.nextSibling);
}
// Helper: handle custom actions when cart changes
const manageCartChange = (e) => {
const { cart } = e.detail;
if (window.Rebuy?.Cart?.enrichCart) Rebuy.Cart.enrichCart();
updateProgressBarVisibility(cart.items());
syncSmartCartTaxNote();
limitItemQuantities();
};
// Translate smartcart language based on store locale
const translateSmartCart = (locale) => {
// Only translate for CA French
if (locale !== 'ca_fr') return;
const getComp = (type) =>
(window.Rebuy?.SmartCart?.getComponentsByType?.(type) || [])[0] || null;
const components = {
announcement: getComp('announcement_bar'),
title: getComp('title_bar'),
progress: getComp('tiered_progress_bar'),
checkout: getComp('checkout'),
subtotal: getComp('cart_subtotal'),
items: getComp('cart_items'),
};
// Switch to sub / Buy more save more language at the root SmartCart settings level
const switchToSubscriptionLanguage =
window.Rebuy?.SmartCart?.settings?.switch_to_subscription?.language || null;
const buyMoreSaveMoreLanguage =
window.Rebuy?.SmartCart?.settings?.buy_more_save_more?.language || null;
// Treat blank/placeholder values as "no translation"
const hasValue = (v) => typeof v === 'string' && v.trim() !== '';
const setExisting = (obj, path, value) => {
if (!obj) return false;
let cur = obj;
for (let i = 0; i < path.length - 1; i++) {
const key = path[i];
if (cur == null) return false;
cur = cur[key];
if (cur == null || (typeof cur !== 'object' && !Array.isArray(cur))) return false;
}
const lastKey = path[path.length - 1];
if (cur == null || !(lastKey in cur)) return false;
cur[lastKey] = value;
return true;
};
const patchExisting = (target, entries) => {
if (!target) return;
for (const [path, val] of entries) {
if (!hasValue(val)) continue;
setExisting(target, path, val);
}
};
const t = {
title: " ",
announcement: [
" ",
" ",
" ",
],
progress: {
gift_area_title:
" ",
free_shipping_reached:
" ",
free_shipping_remaining:
" ",
},
checkout: {
checkout_label:
" ",
view_cart_label:
" ",
checking_out_label:
" ",
view_cart_working_label:
" ",
continue_shopping_label:
" ",
terms_and_conditions_label:
" ",
},
cart_subtotal: {
subtotal_plural_text:
" ",
subtotal_singular_text:
" ",
discount_summary_count_label:
" ",
discount_summary_count_label_plural:
" ",
},
cart_items: {
plural_line_item_label:
" ",
single_line_item_label:
" ",
nested_items_hidden_label:
" ",
nested_items_displayed_label:
" ",
savings_violator:
"Saving",
},
switch_to_subscription: {
upgrading_label:
" ",
downgrading_label:
" ",
onetime_option_label:
" ",
subscription_option_label:
" ",
onetime_option_group_label:
" ",
upgrade_to_subscription_label:
" ",
subscription_option_group_label:
" ",
upgrade_to_subscription_default_frequency:
" ",
upgrade_to_subscription_without_discount_label:
" ",
},
buy_more_save_more: {
bmsm_discount_message:
" ",
bmsm_discount_success:
" ",
},
empty_cart_markup: " ",
};
// Savings violator label
window.__BODI_REBUY__.test_var = t.cart_items.savings_violator;
// Announcement bar
const msgs = components.announcement?.settings?.messages;
if (Array.isArray(msgs) && msgs.length) {
t.announcement.forEach((val, i) => {
if (msgs[i] != null && hasValue(val)) msgs[i] = val;
});
}
// Title bar
if (hasValue(t.title)) {
setExisting(components.title, ['settings', 'title'], t.title);
}
// Tiered progress bar (bar[0])
// only supports 1 bar, will need go extend if needed
const bar0 = components.progress?.settings?.bars?.[0];
if (bar0?.language) {
patchExisting(bar0, [
[['language', 'gift_area_title'], t.progress.gift_area_title],
[['language', 'free_shipping_reached'], t.progress.free_shipping_reached],
[['language', 'free_shipping_remaining'], t.progress.free_shipping_remaining],
]);
}
// Checkout
patchExisting(components.checkout, [
[['settings', 'language', 'checkout_label'], t.checkout.checkout_label],
[['settings', 'language', 'view_cart_label'], t.checkout.view_cart_label],
[['settings', 'language', 'checking_out_label'], t.checkout.checking_out_label],
[['settings', 'language', 'view_cart_working_label'], t.checkout.view_cart_working_label],
[['settings', 'language', 'continue_shopping_label'], t.checkout.continue_shopping_label],
[['settings', 'language', 'terms_and_conditions_label'], t.checkout.terms_and_conditions_label],
]);
// Cart subtotal
patchExisting(components.subtotal, [
[['settings', 'language', 'subtotal_plural_text'], t.cart_subtotal.subtotal_plural_text],
[['settings', 'language', 'subtotal_singular_text'], t.cart_subtotal.subtotal_singular_text],
[['settings', 'language', 'discount_summary_count_label'], t.cart_subtotal.discount_summary_count_label],
[['settings', 'language', 'discount_summary_count_label_plural'], t.cart_subtotal.discount_summary_count_label_plural],
]);
// Cart items
patchExisting(components.items, [
[['settings', 'language', 'plural_line_item_label'], t.cart_items.plural_line_item_label],
[['settings', 'language', 'single_line_item_label'], t.cart_items.single_line_item_label],
[['settings', 'language', 'nested_items_hidden_label'], t.cart_items.nested_items_hidden_label],
[['settings', 'language', 'nested_items_displayed_label'], t.cart_items.nested_items_displayed_label],
]);
// Switch to subscription
if (switchToSubscriptionLanguage && typeof switchToSubscriptionLanguage === 'object') {
patchExisting(switchToSubscriptionLanguage, [
[['upgrading_label'], t.switch_to_subscription.upgrading_label],
[['downgrading_label'], t.switch_to_subscription.downgrading_label],
[['onetime_option_label'], t.switch_to_subscription.onetime_option_label],
[['subscription_option_label'], t.switch_to_subscription.subscription_option_label],
[['onetime_option_group_label'], t.switch_to_subscription.onetime_option_group_label],
[['upgrade_to_subscription_label'], t.switch_to_subscription.upgrade_to_subscription_label],
[['subscription_option_group_label'], t.switch_to_subscription.subscription_option_group_label],
[['upgrade_to_subscription_default_frequency'], t.switch_to_subscription.upgrade_to_subscription_default_frequency],
[['upgrade_to_subscription_without_discount_label'], t.switch_to_subscription.upgrade_to_subscription_without_discount_label],
]);
}
// Buy more save more
if (buyMoreSaveMoreLanguage && typeof buyMoreSaveMoreLanguage === 'object') {
patchExisting(buyMoreSaveMoreLanguage, [
[['bmsm_discount_message'], t.buy_more_save_more.bmsm_discount_message],
[['bmsm_discount_success'], t.buy_more_save_more.bmsm_discount_success],
]);
}
// Empty cart message
if (window.Rebuy?.SmartCart?.settings?.empty_cart_markup) {
window.Rebuy.SmartCart.settings.empty_cart_markup = t.empty_cart_markup;
}
};
// widgets: init
document.addEventListener('rebuy.init', (event) => {
const { widget } = event.detail;
applyWidgetDiscountMessageOverride(widget);
applyWidgetFrDiscountMessageOverride(widget);
});
// widgets: ready
document.addEventListener('rebuy.ready', (event) => {
logDebug('rebuy.ready fired');
const isWidgetLevel = event.detail && event.detail.widget;
if (isWidgetLevel) {
const widget = event.detail.widget;
logDebug('Widget-level rebuy.ready for widget id:', widget.id);
if (linkedWidgetIdSet.has(widget.id)) {
widget.data = widget.data || {};
widget.data.config = widget.data.config || {};
widget.data.config.popup_trigger = 'manual';
logDebug('Set popup_trigger="manual" for linked widget', widget.id, widget.data.config);
}
// Apply EN then CA-FR discount message overrides (CA-FR layers on top of EN)
applyWidgetDiscountMessageOverride(widget);
applyWidgetFrDiscountMessageOverride(widget);
return;
}
logDebug('Global-level rebuy.ready (filtering active widgets)');
if (!window.Rebuy || !Array.isArray(window.Rebuy.widgets)) {
logDebug('window.Rebuy.widgets not ready, skipping global filtering');
return;
}
const activeIds = window.Rebuy.widgets.map(w => w.id);
logDebug('Active widget IDs:', activeIds);
for (let i = bodiWidgets.length - 1; i >= 0; i--) {
if (!activeIds.includes(bodiWidgets[i].id)) {
logDebug('Pruning bodiWidget:', bodiWidgets[i]);
bodiWidgets.splice(i, 1);
}
}
bodiWidgetById.clear();
bodiWidgets.forEach((w) => bodiWidgetById.set(w.id, w));
document.querySelectorAll('.rebuy-widget--global').forEach(el => {
const id = parseInt(el.dataset.rebuyId, 10);
if (!activeIds.includes(id)) {
logDebug('Removing unused global widget container:', id);
el.remove();
}
});
logDebug('bodiWidgets after filtering:', bodiWidgets);
});
// Utilize StorefrontHelper to enrich product JSON with locale-aware titles
// update product JSON every time products are loaded or changed
document.addEventListener('rebuy.productsChange', (e) => {
const widget = e.detail.widget;
const storefrontHelper = new ShopifyStorefrontHelper();
// loop over products in the widget and enrich product json
const steps = widget?.data?.config?.steps;
if (Array.isArray(steps) && steps.length) {
} else {
// Regular widget: enrich flat products array
(widget.data.products || []).forEach((product) => storefrontHelper.updateProductJSON(product));
}
patchSmartCartDiscountTitles();
});
// widgets: before show
document.addEventListener('rebuy.beforeShow', (event) => {
logDebug('rebuy.beforeShow fired for widget id:', event.detail.widget.id);
const { rebuy, bodi } = getWidgetPair(event.detail.widget.id);
if (!rebuy || !bodi) {
logDebug('No rebuy or bodi config found for widget id:', event.detail.widget.id);
return;
}
// Apply discount message overrides now that datasource metadata is populated
// EN is applied first; CA-FR layers on top if applicable
applyWidgetDiscountMessageOverride(rebuy);
applyWidgetFrDiscountMessageOverride(rebuy);
if (bodi.hide_cart_on_open) {
logDebug('hide_cart_on_open=true for widget id:', bodi.id, '→ hiding SmartCart');
window.Rebuy.SmartCart.hide();
window.Rebuy.SmartCart.skip_open = true;
}
if (bodi.linked_widget_id) {
logDebug('Hiding linked widget placeholder for linked widget id:', bodi.linked_widget_id);
const el = document.getElementById('rebuy-widget-' + bodi.linked_widget_id);
if (el) el.style.display = 'none';
}
});
// widgets: hide
document.addEventListener('rebuy.hide', (event) => {
logDebug('rebuy.hide fired for widget id:', event.detail.widget.id);
const { rebuy, bodi } = getWidgetPair(event.detail.widget.id);
if (!rebuy || !bodi) return;
if (bodi.linked_widget_id) {
const nextId = bodi.linked_widget_id;
const nextRebuyWidget = getRebuyWidget(nextId);
const nextEl = document.getElementById('rebuy-widget-' + nextId);
if (nextEl) nextEl.style.display = 'block';
if (nextRebuyWidget && typeof nextRebuyWidget.show === 'function') {
nextRebuyWidget.show();
}
}
if (bodi.show_cart_on_close) {
window.Rebuy.SmartCart.skip_open = false;
window.Rebuy.SmartCart.show();
}
});
// smartcart: init
document.addEventListener('rebuy:smartcart.init', (event) => {
logDebug('rebuy:smartcart.init fired');
const desktop = document.querySelector('.bodi-nav__cart-button');
const mobile = document.querySelector('.bodi-nav-mobile__cart-button');
if (desktop) desktop.addEventListener('click', () => Rebuy.SmartCart.show());
if (mobile) mobile.addEventListener('click', () => Rebuy.SmartCart.show());
translateSmartCart(shopLocaleCode);
});
// smartcart: ready
document.addEventListener('rebuy:smartcart.ready', (event) => {
logDebug('rebuy:smartcart.ready fired');
var STORAGE_KEY = 'bodi_rebuy_discount_synced';
var smartcart = event.detail.smartcart;
var urlDiscount = new URLSearchParams(window.location.search).get('discount');
if (urlDiscount && !/^[a-zA-Z0-9_-]{1,50}$/.test(urlDiscount)) {
urlDiscount = null;
}
var applyPromise = urlDiscount
? fetch('/cart/update.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ discount: urlDiscount })
})
: Promise.resolve();
applyPromise
.then(function () { return fetch('/cart.js'); })
.then(function (res) { return res.json(); })
.then(function (cart) {
var applications = cart.cart_level_discount_applications || [];
var codeApp = applications.find(function (app) {
return app.type === 'discount_code';
});
if (!codeApp || sessionStorage.getItem(STORAGE_KEY) === codeApp.title) {
return;
}
smartcart.applyDiscount(codeApp.title);
sessionStorage.setItem(STORAGE_KEY, codeApp.title);
})
.catch(function () {});
patchSmartCartDiscountTitles();
const header = document.querySelector('div[data-rebuy-cart-anchor="header"]');
const bar = document.querySelector('div[data-rebuy-component="announcement-bar"]');
if (header && bar) header.before(bar);
if (window.Rebuy?.SmartCart?.items) {
Rebuy.Cart.enrichCart();
updateProgressBarVisibility(Rebuy.SmartCart.items());
syncSmartCartTaxNote();
}
});
// smartcart: show
document.addEventListener('rebuy:smartcart.show', (event) => {
logDebug('rebuy:smartcart.show fired');
patchSmartCartDiscountTitles();
const cart = event.detail.smartcart.dom.cart;
if (!cart) return;
syncSmartCartTaxNote(cart);
// Proper continue shopping CTA URL for FR
if (shopLocaleCode === 'ca_fr' && cart.querySelector('.rebuy-cart__flyout-empty-cart a')) {
const continueCTA = cart.querySelector('.rebuy-cart__flyout-empty-cart a');
continueCTA.href = '/fr';
}
// Translate guarantee copy in the custom cart items template
if (shopLocaleCode === 'ca_fr' && cart.querySelector('#rebuyCartGuaranteeLanguage')) {
const guaranteeHtml = cart.querySelector('#rebuyCartGuaranteeLanguage');
const guaranteeMsg = " ";
if (typeof guaranteeMsg === 'string' && guaranteeMsg.trim() !== '') {
guaranteeHtml.innerHTML = '<p>' + guaranteeMsg + '</p>';
}
}
});
// cart: change — debounced prune to let cart state fully settle before checking
// for orphaned promo items. Prevents race condition where a just-added promo
// is removed because the source product hasn't been reflected in cart state yet.
let __smartCartPruneTimer = null;
document.addEventListener('rebuy:cart.change', (event) => {
patchSmartCartDiscountTitles();
manageCartChange(event);
hasMultipleUniques();
if (__smartCartPruneTimer) clearTimeout(__smartCartPruneTimer);
__smartCartPruneTimer = setTimeout(() => {
__smartCartPruneTimer = null;
pruneSmartCartOrphans();
}, 500);
});
// Native /cart: hook theme cart update event (ThemeEvents.cartUpdate === 'cart:update')
// (() => {
// if (!isNativeCartPage) return;
// // Native /cart refresh because we were not seeing the
// // DOM update for GWP removals or adds from cross-sells on /cart only
// installNativeCartMutationRefresh();
// let scheduled = false;
// const schedule = () => {
// if (scheduled) return;
// scheduled = true;
// setTimeout(async () => {
// scheduled = false;
// await pruneNativeCartOrphans();
// }, 150);
// };
// document.addEventListener('cart:update', (e) => {
// if (e?.detail?.data?.didError) return;
// const nextCart = e?.detail?.data?.cart;
// if (nextCart) __nativeCartCache = nextCart;
// schedule();
// });
// schedule();
// })();
})();
function isBodiSpotlight(id) {
return !!(window.__BODI_REBUY__?.isSpotlight?.(id));
}
function bodiSubscriptionFrequencyLabel(item, defaultLabel) {
const overrides = [
{ tag: 'supplement', message: '1 month subscription with discounts' },
];
const hasTag = window.__BODI_REBUY__?.hasTag;
if (!overrides.length || typeof hasTag !== 'function') return defaultLabel;
const tags = item?.product?.tags;
const match = overrides.find((o) => o?.tag && hasTag(tags, o.tag));
return (match && typeof match.message === 'string' && match.message.trim() !== '')
? match.message
: defaultLabel;
}
</script>
<script id="rebuy-widget-274810" type="text/template">
<div class="rebuy-widget"
v-cloak
v-on:click="stopPropagation($event)"
v-bind:id="'rebuy-widget-' + id"
v-bind:class="['widget-type-' + config.type.replace('_','-'), 'widget-display-' + config.display_type, products.length > 0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
<div
class="rebuy-widget-container"
v-cloak
v-bind:class="['widget-display-' + config.display_type, visible ? 'is-visible' : 'is-hidden' ]"
v-on:click.self="hide()">
<div
class="rebuy-widget-content"
v-bind:class="[isBodiSpotlight(id) ? 'widget-spotlight' : '']"
>
<div class="rebuy-modal-close" v-on:click="hide()" aria-label="close modal">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<g clip-path="url(#clip0_5603_464)">
<rect opacity="0.01" width="24" height="24" fill="#E8E8E8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.8219 17.6852C18.0691 17.4471 18.0599 17.0443 17.8219 16.8062L12.9238 11.9082L17.8219 7.00095C18.0599 6.76291 18.0691 6.36923 17.8219 6.1312C17.5838 5.884 17.181 5.89316 16.943 6.1312L12.0449 11.0293L7.14682 6.1312C6.90878 5.89316 6.50595 5.884 6.26791 6.1312C6.02072 6.36923 6.02988 6.76291 6.26791 7.00095L11.166 11.9082L6.26791 16.8062C6.02988 17.0443 6.02072 17.4471 6.26791 17.6852C6.50595 17.9323 6.90878 17.9232 7.14682 17.6852L12.0449 12.7871L16.943 17.6852C17.181 17.9232 17.5838 17.9323 17.8219 17.6852Z" fill="#161819"/>
</g>
<defs>
<clipPath id="clip0_5603_464">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>
</div>
<div class="rebuy-timer" v-if="hasTimer()">
<p class="rebuy-timer-title" v-if="config.language.timer_title">
<span v-html="config.language.timer_title"></span> <span class="rebuy-timer-minutes" v-html="config.timer.duration_minutes"></span>:<span class="rebuy-timer-seconds" v-html="config.timer.duration_seconds"></span>
</p>
</div>
<p
class="super-title"
v-if="config.language.super_title"
v-html="config.language.super_title"
></p>
<p class="primary-title"
v-if="config.language.title"
v-html="config.language.title"
></p>
<div class="description" v-if="config.language.description" v-html="config.language.description"></div>
<div class="rebuy-product-grid" v-bind:class="layoutClasses" tabindex="0" role="list">
<div
v-for="(product, product_index) in products"
v-bind:class="[
product.handle,
'product-id-' + product.id,
cartHasProduct(product) ? 'cart-has-item' : '',
productTagClasses(product),
hasSplideCarousel ? 'splide__slide' : '',
]"
aria-label="product"
class="rebuy-product-block"
role="listitem"
>
<div class="rebuy-product-media">
<a
class="rebuy-product-image"
tabindex="-1"
v-bind:href="learnMoreURL(product)"
v-bind:style="imageStyles"
v-on:click="learnMore(product, $event);"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
rel="nofollow"
>
<img v-bind:loading="product_index > 1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
</a>
<button
class="rebuy-button"
v-if="config.display_type == 'embed'"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="15" viewBox="0 0 16 15" fill="none">
<g clip-path="url(#clip0_4267_416)">
<path d="M0 7.05261C0 7.40758 0.301393 7.70228 0.656367 7.70228H6.39624V13.4421C6.39624 13.7971 6.69093 14.0985 7.04592 14.0985C7.40758 14.0985 7.70228 13.7971 7.70228 13.4421V7.70228H13.4421C13.7971 7.70228 14.0985 7.40758 14.0985 7.05261C14.0985 6.69093 13.7971 6.39624 13.4421 6.39624H7.70228V0.656367C7.70228 0.301393 7.40758 0 7.04592 0C6.69093 0 6.39624 0.301393 6.39624 0.656367V6.39624H0.656367C0.301393 6.39624 0 6.69093 0 7.05261Z" fill="#161819"></path>
</g>
<defs>
<clipPath id="clip0_4267_416">
<rect width="15.063" height="14.1119" fill="white"></rect>
</clipPath>
</defs>
</svg>
</button>
</div>
<div class="rebuy-product-info">
<p
class="rebuy-product-message"
v-if="config.discount.message
&& config.display_type == 'embed'
&& isBodiSpotlight(id)"
v-html="config.discount.message"
></p>
<div
class="rebuy-product-title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']">
<a
v-bind:href="learnMoreURL(product)"
class="rebuy-product-title-link"
v-on:click="learnMore(product, $event);"
v-html="metadata.custom && metadata.custom.product_title_override
&& metadata.custom.product_title_override ? metadata.custom.product_title_override : product.title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
v-bind:aria-label="'View ' + product.title"
rel="nofollow"
></a>
</div>
<div
class="rebuy-product-vendor-container"
v-if="showProductVendor(product.vendor)"
>
<a
class="rebuy-product-vendor"
v-bind:class="[hasEnabledProductVendorLink() ? 'clickable' : '']"
v-html="product.vendor"
v-bind:href="vendorURL(product.vendor)"
v-bind:aria-label="'View ' + product.vendor + ' products'"
rel="nofollow"
></a>
</div>
<div class="rebuy-variant-title" v-if="showVariantTitle(product)" v-html="product.selected_variant.title"></div>
<div class="rebuy-product-review" v-if="hasProductReviews(product)" aria-label="product star rating">
<span class="rebuy-star-rating">
<span
v-if="product.reviews.star_rating"
class="rebuy-star-rating-value sr-only"
v-html="product.reviews.star_rating + ' stars out of 5 stars'"
>
</span>
<span class="rebuy-star-rating-background"></span>
<span class="rebuy-star-rating-foreground" v-bind:style="{ width: productReviewRatingPercentage(product) }"></span>
</span>
<span class="rebuy-review-count" v-html="productReviewCount(product)"></span>
</div>
<div class="rebuy-product-price">
<div v-if="variantOnSale(product, product.selected_variant)">
<span class="rebuy-money compare-at">
<span class="sr-only">Original price</span>
<span v-html="formatMoney(variantCompareAtPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-money sale">
<span class="sr-only">Sale price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-price-label"
v-if="metadata.custom
&& metadata.custom.price_label"
v-html="metadata.custom.price_label"
></span>
</div>
<div v-if="!(variantOnSale(product, product.selected_variant))">
<span class="rebuy-money">
<span class="sr-only">Price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
</div>
</div>
<div v-if="config.display_type == 'embed'" class="rebuy-product-actions">
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'cart' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-description" v-if="showProductDescription(product)" v-html="text(product.body_html)"></div>
</div>
<div class="rebuy-product-options" v-if="showVariantSelect(product)">
<select
title="Select product variant"
:id="id + '-' + 'select' + '-' + product_index"
:class="{ hide : config.view_options.variant_selector === 'buttons' }"
class="rebuy-select"
v-bind:aria-label="'variant of ' + product.title"
v-model="product.selected_variant_id"
v-on:change="selectVariant(product)">
<option
v-for="variant in product.variants"
class="rebuy-product-options__option"
:class="{ 'rebuy-product-options__option--oos' : !variantAvailable(variant) }"
v-bind:value="variant.id"
:disabled="!variantAvailable(variant)"
v-html="formatVariantOptionTitle(variant)">
</option>
</select>
<div
class="rebuy-product-options__button-swatches-container"
:class="{ 'rebuy-style__hidden-block' : config.view_options.variant_selector === 'select' }"
>
<div
v-for="option in product.options"
:key="'option-' + product.id + '-' + option.name"
class="rebuy-product-options__button-swatches rebuy-size-swatches"
>
<div
v-for="(value, value_index) in filterOOSOptions(option, product)"
:key="'value-' + product.id + '-' + option.name + '-' + value + '-' + value_index"
>
<div v-if="displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-color-swatch">
<input
:name="id + '-color-' + product_index"
:id="id + '-color-' + product_index + '-' + value + '-' + value_index"
:checked="hasSwatchOptionSelected(product, value, value_index, 'color')"
:value="value"
type="radio"
class="rebuy-color-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-color-' + product_index + '-' + value + '-' + value_index"
:style="getMerchantThemeColorAssetStyle(value)"
:title="value"
class="rebuy-color-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
</label>
</div>
<div v-if="!displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-size-swatch">
<input
:name="id + '-' + option.name + '-' + product_index"
:id="id + '-' + option.name + '-' + product_index + '-' + value"
:checked="hasSwatchOptionSelected(product, value, value_index, option.name)"
:value="value"
type="radio"
class="rebuy-size-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-' + option.name + '-' + product_index + '-' + value"
class="rebuy-size-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
{{ value }}
</label>
</div>
</div>
</div>
</div>
</div>
<div v-if="config.display_type != 'embed'" class="rebuy-product-actions">
<div class="subscription-checkbox" v-if="config.display_type != 'embed' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'product' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-disclaimer"
v-if="metadata.custom
&& metadata.custom.disclaimer
&& metadata.custom.disclaimer != ''"
v-html="metadata.custom.disclaimer"
></div>
</div>
</div>
</div>
</div>
</div>
</script>
<script id="rebuy-widget-274645" type="text/template">
<div class="rebuy-widget"
v-cloak
v-on:click="stopPropagation($event)"
v-bind:id="'rebuy-widget-' + id"
v-bind:class="['widget-type-' + config.type.replace('_','-'), 'widget-display-' + config.display_type, products.length > 0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
<div
class="rebuy-widget-container"
v-cloak
v-bind:class="['widget-display-' + config.display_type, visible ? 'is-visible' : 'is-hidden' ]"
v-on:click.self="hide()">
<div
class="rebuy-widget-content"
v-bind:class="[isBodiSpotlight(id) ? 'widget-spotlight' : '']"
>
<div class="rebuy-modal-close" v-on:click="hide()" aria-label="close modal">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<g clip-path="url(#clip0_5603_464)">
<rect opacity="0.01" width="24" height="24" fill="#E8E8E8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.8219 17.6852C18.0691 17.4471 18.0599 17.0443 17.8219 16.8062L12.9238 11.9082L17.8219 7.00095C18.0599 6.76291 18.0691 6.36923 17.8219 6.1312C17.5838 5.884 17.181 5.89316 16.943 6.1312L12.0449 11.0293L7.14682 6.1312C6.90878 5.89316 6.50595 5.884 6.26791 6.1312C6.02072 6.36923 6.02988 6.76291 6.26791 7.00095L11.166 11.9082L6.26791 16.8062C6.02988 17.0443 6.02072 17.4471 6.26791 17.6852C6.50595 17.9323 6.90878 17.9232 7.14682 17.6852L12.0449 12.7871L16.943 17.6852C17.181 17.9232 17.5838 17.9323 17.8219 17.6852Z" fill="#161819"/>
</g>
<defs>
<clipPath id="clip0_5603_464">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>
</div>
<div class="rebuy-timer" v-if="hasTimer()">
<p class="rebuy-timer-title" v-if="config.language.timer_title">
<span v-html="config.language.timer_title"></span> <span class="rebuy-timer-minutes" v-html="config.timer.duration_minutes"></span>:<span class="rebuy-timer-seconds" v-html="config.timer.duration_seconds"></span>
</p>
</div>
<p
class="super-title"
v-if="config.language.super_title"
v-html="config.language.super_title"
></p>
<p class="primary-title"
v-if="config.language.title"
v-html="config.language.title"
></p>
<div class="description" v-if="config.language.description" v-html="config.language.description"></div>
<div class="rebuy-product-grid" v-bind:class="layoutClasses" tabindex="0" role="list">
<div
v-for="(product, product_index) in products"
v-bind:class="[
product.handle,
'product-id-' + product.id,
cartHasProduct(product) ? 'cart-has-item' : '',
productTagClasses(product),
hasSplideCarousel ? 'splide__slide' : '',
]"
aria-label="product"
class="rebuy-product-block"
role="listitem"
>
<div class="rebuy-product-media">
<a
class="rebuy-product-image"
tabindex="-1"
v-bind:href="learnMoreURL(product)"
v-bind:style="imageStyles"
v-on:click="learnMore(product, $event);"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
rel="nofollow"
>
<img v-bind:loading="product_index > 1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
</a>
<button
class="rebuy-button"
v-if="config.display_type == 'embed'"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="15" viewBox="0 0 16 15" fill="none">
<g clip-path="url(#clip0_4267_416)">
<path d="M0 7.05261C0 7.40758 0.301393 7.70228 0.656367 7.70228H6.39624V13.4421C6.39624 13.7971 6.69093 14.0985 7.04592 14.0985C7.40758 14.0985 7.70228 13.7971 7.70228 13.4421V7.70228H13.4421C13.7971 7.70228 14.0985 7.40758 14.0985 7.05261C14.0985 6.69093 13.7971 6.39624 13.4421 6.39624H7.70228V0.656367C7.70228 0.301393 7.40758 0 7.04592 0C6.69093 0 6.39624 0.301393 6.39624 0.656367V6.39624H0.656367C0.301393 6.39624 0 6.69093 0 7.05261Z" fill="#161819"></path>
</g>
<defs>
<clipPath id="clip0_4267_416">
<rect width="15.063" height="14.1119" fill="white"></rect>
</clipPath>
</defs>
</svg>
</button>
</div>
<div class="rebuy-product-info">
<p
class="rebuy-product-message"
v-if="config.discount.message
&& config.display_type == 'embed'
&& isBodiSpotlight(id)"
v-html="config.discount.message"
></p>
<div
class="rebuy-product-title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']">
<a
v-bind:href="learnMoreURL(product)"
class="rebuy-product-title-link"
v-on:click="learnMore(product, $event);"
v-html="metadata.custom && metadata.custom.product_title_override
&& metadata.custom.product_title_override ? metadata.custom.product_title_override : product.title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
v-bind:aria-label="'View ' + product.title"
rel="nofollow"
></a>
</div>
<div
class="rebuy-product-vendor-container"
v-if="showProductVendor(product.vendor)"
>
<a
class="rebuy-product-vendor"
v-bind:class="[hasEnabledProductVendorLink() ? 'clickable' : '']"
v-html="product.vendor"
v-bind:href="vendorURL(product.vendor)"
v-bind:aria-label="'View ' + product.vendor + ' products'"
rel="nofollow"
></a>
</div>
<div class="rebuy-variant-title" v-if="showVariantTitle(product)" v-html="product.selected_variant.title"></div>
<div class="rebuy-product-review" v-if="hasProductReviews(product)" aria-label="product star rating">
<span class="rebuy-star-rating">
<span
v-if="product.reviews.star_rating"
class="rebuy-star-rating-value sr-only"
v-html="product.reviews.star_rating + ' stars out of 5 stars'"
>
</span>
<span class="rebuy-star-rating-background"></span>
<span class="rebuy-star-rating-foreground" v-bind:style="{ width: productReviewRatingPercentage(product) }"></span>
</span>
<span class="rebuy-review-count" v-html="productReviewCount(product)"></span>
</div>
<div class="rebuy-product-price">
<div v-if="variantOnSale(product, product.selected_variant)">
<span class="rebuy-money compare-at">
<span class="sr-only">Original price</span>
<span v-html="formatMoney(variantCompareAtPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-money sale">
<span class="sr-only">Sale price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-price-label"
v-if="metadata.custom
&& metadata.custom.price_label"
v-html="metadata.custom.price_label"
></span>
</div>
<div v-if="!(variantOnSale(product, product.selected_variant))">
<span class="rebuy-money">
<span class="sr-only">Price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
</div>
</div>
<div v-if="config.display_type == 'embed'" class="rebuy-product-actions">
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'cart' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-description" v-if="showProductDescription(product)" v-html="text(product.body_html)"></div>
</div>
<div class="rebuy-product-options" v-if="showVariantSelect(product)">
<select
title="Select product variant"
:id="id + '-' + 'select' + '-' + product_index"
:class="{ hide : config.view_options.variant_selector === 'buttons' }"
class="rebuy-select"
v-bind:aria-label="'variant of ' + product.title"
v-model="product.selected_variant_id"
v-on:change="selectVariant(product)">
<option
v-for="variant in product.variants"
class="rebuy-product-options__option"
:class="{ 'rebuy-product-options__option--oos' : !variantAvailable(variant) }"
v-bind:value="variant.id"
:disabled="!variantAvailable(variant)"
v-html="formatVariantOptionTitle(variant)">
</option>
</select>
<div
class="rebuy-product-options__button-swatches-container"
:class="{ 'rebuy-style__hidden-block' : config.view_options.variant_selector === 'select' }"
>
<div
v-for="option in product.options"
:key="'option-' + product.id + '-' + option.name"
class="rebuy-product-options__button-swatches rebuy-size-swatches"
>
<div
v-for="(value, value_index) in filterOOSOptions(option, product)"
:key="'value-' + product.id + '-' + option.name + '-' + value + '-' + value_index"
>
<div v-if="displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-color-swatch">
<input
:name="id + '-color-' + product_index"
:id="id + '-color-' + product_index + '-' + value + '-' + value_index"
:checked="hasSwatchOptionSelected(product, value, value_index, 'color')"
:value="value"
type="radio"
class="rebuy-color-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-color-' + product_index + '-' + value + '-' + value_index"
:style="getMerchantThemeColorAssetStyle(value)"
:title="value"
class="rebuy-color-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
</label>
</div>
<div v-if="!displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-size-swatch">
<input
:name="id + '-' + option.name + '-' + product_index"
:id="id + '-' + option.name + '-' + product_index + '-' + value"
:checked="hasSwatchOptionSelected(product, value, value_index, option.name)"
:value="value"
type="radio"
class="rebuy-size-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-' + option.name + '-' + product_index + '-' + value"
class="rebuy-size-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
{{ value }}
</label>
</div>
</div>
</div>
</div>
</div>
<div v-if="config.display_type != 'embed'" class="rebuy-product-actions">
<div class="subscription-checkbox" v-if="config.display_type != 'embed' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'product' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-disclaimer"
v-if="metadata.custom
&& metadata.custom.disclaimer
&& metadata.custom.disclaimer != ''"
v-html="metadata.custom.disclaimer"
></div>
</div>
</div>
</div>
</div>
</div>
</script>
<script id="rebuy-widget-298800" type="text/template">
<div class="rebuy-widget"
v-cloak
v-on:click="stopPropagation($event)"
v-bind:id="'rebuy-widget-' + id"
v-bind:class="['widget-type-' + config.type.replace('_','-'), 'widget-display-' + config.display_type, products.length > 0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
<div
class="rebuy-widget-container"
v-cloak
v-bind:class="['widget-display-' + config.display_type, visible ? 'is-visible' : 'is-hidden' ]"
v-on:click.self="hide()">
<div
class="rebuy-widget-content"
v-bind:class="[isBodiSpotlight(id) ? 'widget-spotlight' : '']"
>
<div class="rebuy-modal-close" v-on:click="hide()" aria-label="close modal">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<g clip-path="url(#clip0_5603_464)">
<rect opacity="0.01" width="24" height="24" fill="#E8E8E8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.8219 17.6852C18.0691 17.4471 18.0599 17.0443 17.8219 16.8062L12.9238 11.9082L17.8219 7.00095C18.0599 6.76291 18.0691 6.36923 17.8219 6.1312C17.5838 5.884 17.181 5.89316 16.943 6.1312L12.0449 11.0293L7.14682 6.1312C6.90878 5.89316 6.50595 5.884 6.26791 6.1312C6.02072 6.36923 6.02988 6.76291 6.26791 7.00095L11.166 11.9082L6.26791 16.8062C6.02988 17.0443 6.02072 17.4471 6.26791 17.6852C6.50595 17.9323 6.90878 17.9232 7.14682 17.6852L12.0449 12.7871L16.943 17.6852C17.181 17.9232 17.5838 17.9323 17.8219 17.6852Z" fill="#161819"/>
</g>
<defs>
<clipPath id="clip0_5603_464">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>
</div>
<div class="rebuy-timer" v-if="hasTimer()">
<p class="rebuy-timer-title" v-if="config.language.timer_title">
<span v-html="config.language.timer_title"></span> <span class="rebuy-timer-minutes" v-html="config.timer.duration_minutes"></span>:<span class="rebuy-timer-seconds" v-html="config.timer.duration_seconds"></span>
</p>
</div>
<p
class="super-title"
v-if="config.language.super_title"
v-html="config.language.super_title"
></p>
<p class="primary-title"
v-if="config.language.title"
v-html="config.language.title"
></p>
<div class="description" v-if="config.language.description" v-html="config.language.description"></div>
<div class="rebuy-product-grid" v-bind:class="layoutClasses" tabindex="0" role="list">
<div
v-for="(product, product_index) in products"
v-bind:class="[
product.handle,
'product-id-' + product.id,
cartHasProduct(product) ? 'cart-has-item' : '',
productTagClasses(product),
hasSplideCarousel ? 'splide__slide' : '',
]"
aria-label="product"
class="rebuy-product-block"
role="listitem"
>
<div class="rebuy-product-media">
<a
class="rebuy-product-image"
tabindex="-1"
v-bind:href="learnMoreURL(product)"
v-bind:style="imageStyles"
v-on:click="learnMore(product, $event);"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
rel="nofollow"
>
<img v-bind:loading="product_index > 1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
</a>
<button
class="rebuy-button"
v-if="config.display_type == 'embed'"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="15" viewBox="0 0 16 15" fill="none">
<g clip-path="url(#clip0_4267_416)">
<path d="M0 7.05261C0 7.40758 0.301393 7.70228 0.656367 7.70228H6.39624V13.4421C6.39624 13.7971 6.69093 14.0985 7.04592 14.0985C7.40758 14.0985 7.70228 13.7971 7.70228 13.4421V7.70228H13.4421C13.7971 7.70228 14.0985 7.40758 14.0985 7.05261C14.0985 6.69093 13.7971 6.39624 13.4421 6.39624H7.70228V0.656367C7.70228 0.301393 7.40758 0 7.04592 0C6.69093 0 6.39624 0.301393 6.39624 0.656367V6.39624H0.656367C0.301393 6.39624 0 6.69093 0 7.05261Z" fill="#161819"></path>
</g>
<defs>
<clipPath id="clip0_4267_416">
<rect width="15.063" height="14.1119" fill="white"></rect>
</clipPath>
</defs>
</svg>
</button>
</div>
<div class="rebuy-product-info">
<p
class="rebuy-product-message"
v-if="config.discount.message
&& config.display_type == 'embed'
&& isBodiSpotlight(id)"
v-html="config.discount.message"
></p>
<div
class="rebuy-product-title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']">
<a
v-bind:href="learnMoreURL(product)"
class="rebuy-product-title-link"
v-on:click="learnMore(product, $event);"
v-html="metadata.custom && metadata.custom.product_title_override
&& metadata.custom.product_title_override ? metadata.custom.product_title_override : product.title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
v-bind:aria-label="'View ' + product.title"
rel="nofollow"
></a>
</div>
<div
class="rebuy-product-vendor-container"
v-if="showProductVendor(product.vendor)"
>
<a
class="rebuy-product-vendor"
v-bind:class="[hasEnabledProductVendorLink() ? 'clickable' : '']"
v-html="product.vendor"
v-bind:href="vendorURL(product.vendor)"
v-bind:aria-label="'View ' + product.vendor + ' products'"
rel="nofollow"
></a>
</div>
<div class="rebuy-variant-title" v-if="showVariantTitle(product)" v-html="product.selected_variant.title"></div>
<div class="rebuy-product-review" v-if="hasProductReviews(product)" aria-label="product star rating">
<span class="rebuy-star-rating">
<span
v-if="product.reviews.star_rating"
class="rebuy-star-rating-value sr-only"
v-html="product.reviews.star_rating + ' stars out of 5 stars'"
>
</span>
<span class="rebuy-star-rating-background"></span>
<span class="rebuy-star-rating-foreground" v-bind:style="{ width: productReviewRatingPercentage(product) }"></span>
</span>
<span class="rebuy-review-count" v-html="productReviewCount(product)"></span>
</div>
<div class="rebuy-product-price">
<div v-if="variantOnSale(product, product.selected_variant)">
<span class="rebuy-money compare-at">
<span class="sr-only">Original price</span>
<span v-html="formatMoney(variantCompareAtPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-money sale">
<span class="sr-only">Sale price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-price-label"
v-if="metadata.custom
&& metadata.custom.price_label"
v-html="metadata.custom.price_label"
></span>
</div>
<div v-if="!(variantOnSale(product, product.selected_variant))">
<span class="rebuy-money">
<span class="sr-only">Price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
</div>
</div>
<div v-if="config.display_type == 'embed'" class="rebuy-product-actions">
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'cart' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-description" v-if="showProductDescription(product)" v-html="text(product.body_html)"></div>
</div>
<div class="rebuy-product-options" v-if="showVariantSelect(product)">
<select
title="Select product variant"
:id="id + '-' + 'select' + '-' + product_index"
:class="{ hide : config.view_options.variant_selector === 'buttons' }"
class="rebuy-select"
v-bind:aria-label="'variant of ' + product.title"
v-model="product.selected_variant_id"
v-on:change="selectVariant(product)">
<option
v-for="variant in product.variants"
class="rebuy-product-options__option"
:class="{ 'rebuy-product-options__option--oos' : !variantAvailable(variant) }"
v-bind:value="variant.id"
:disabled="!variantAvailable(variant)"
v-html="formatVariantOptionTitle(variant)">
</option>
</select>
<div
class="rebuy-product-options__button-swatches-container"
:class="{ 'rebuy-style__hidden-block' : config.view_options.variant_selector === 'select' }"
>
<div
v-for="option in product.options"
:key="'option-' + product.id + '-' + option.name"
class="rebuy-product-options__button-swatches rebuy-size-swatches"
>
<div
v-for="(value, value_index) in filterOOSOptions(option, product)"
:key="'value-' + product.id + '-' + option.name + '-' + value + '-' + value_index"
>
<div v-if="displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-color-swatch">
<input
:name="id + '-color-' + product_index"
:id="id + '-color-' + product_index + '-' + value + '-' + value_index"
:checked="hasSwatchOptionSelected(product, value, value_index, 'color')"
:value="value"
type="radio"
class="rebuy-color-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-color-' + product_index + '-' + value + '-' + value_index"
:style="getMerchantThemeColorAssetStyle(value)"
:title="value"
class="rebuy-color-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
</label>
</div>
<div v-if="!displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-size-swatch">
<input
:name="id + '-' + option.name + '-' + product_index"
:id="id + '-' + option.name + '-' + product_index + '-' + value"
:checked="hasSwatchOptionSelected(product, value, value_index, option.name)"
:value="value"
type="radio"
class="rebuy-size-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-' + option.name + '-' + product_index + '-' + value"
class="rebuy-size-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
{{ value }}
</label>
</div>
</div>
</div>
</div>
</div>
<div v-if="config.display_type != 'embed'" class="rebuy-product-actions">
<div class="subscription-checkbox" v-if="config.display_type != 'embed' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'product' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-disclaimer"
v-if="metadata.custom
&& metadata.custom.disclaimer
&& metadata.custom.disclaimer != ''"
v-html="metadata.custom.disclaimer"
></div>
</div>
</div>
</div>
</div>
</div>
</script>
<script id="rebuy-widget-274634" type="text/template">
<div class="rebuy-widget"
v-cloak
v-on:click="stopPropagation($event)"
v-bind:id="'rebuy-widget-' + id"
v-bind:class="['widget-type-' + config.type.replace('_','-'), 'widget-display-' + config.display_type, products.length > 0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
<div
class="rebuy-widget-container"
v-cloak
v-bind:class="['widget-display-' + config.display_type, visible ? 'is-visible' : 'is-hidden' ]"
v-on:click.self="hide()">
<div
class="rebuy-widget-content"
v-bind:class="[isBodiSpotlight(id) ? 'widget-spotlight' : '']"
>
<div class="rebuy-modal-close" v-on:click="hide()" aria-label="close modal">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<g clip-path="url(#clip0_5603_464)">
<rect opacity="0.01" width="24" height="24" fill="#E8E8E8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.8219 17.6852C18.0691 17.4471 18.0599 17.0443 17.8219 16.8062L12.9238 11.9082L17.8219 7.00095C18.0599 6.76291 18.0691 6.36923 17.8219 6.1312C17.5838 5.884 17.181 5.89316 16.943 6.1312L12.0449 11.0293L7.14682 6.1312C6.90878 5.89316 6.50595 5.884 6.26791 6.1312C6.02072 6.36923 6.02988 6.76291 6.26791 7.00095L11.166 11.9082L6.26791 16.8062C6.02988 17.0443 6.02072 17.4471 6.26791 17.6852C6.50595 17.9323 6.90878 17.9232 7.14682 17.6852L12.0449 12.7871L16.943 17.6852C17.181 17.9232 17.5838 17.9323 17.8219 17.6852Z" fill="#161819"/>
</g>
<defs>
<clipPath id="clip0_5603_464">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>
</div>
<div class="rebuy-timer" v-if="hasTimer()">
<p class="rebuy-timer-title" v-if="config.language.timer_title">
<span v-html="config.language.timer_title"></span> <span class="rebuy-timer-minutes" v-html="config.timer.duration_minutes"></span>:<span class="rebuy-timer-seconds" v-html="config.timer.duration_seconds"></span>
</p>
</div>
<p
class="super-title"
v-if="config.language.super_title"
v-html="config.language.super_title"
></p>
<p class="primary-title"
v-if="config.language.title"
v-html="config.language.title"
></p>
<div class="description" v-if="config.language.description" v-html="config.language.description"></div>
<div class="rebuy-product-grid" v-bind:class="layoutClasses" tabindex="0" role="list">
<div
v-for="(product, product_index) in products"
v-bind:class="[
product.handle,
'product-id-' + product.id,
cartHasProduct(product) ? 'cart-has-item' : '',
productTagClasses(product),
hasSplideCarousel ? 'splide__slide' : '',
]"
aria-label="product"
class="rebuy-product-block"
role="listitem"
>
<div class="rebuy-product-media">
<a
class="rebuy-product-image"
tabindex="-1"
v-bind:href="learnMoreURL(product)"
v-bind:style="imageStyles"
v-on:click="learnMore(product, $event);"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
rel="nofollow"
>
<img v-bind:loading="product_index > 1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
</a>
<button
class="rebuy-button"
v-if="config.display_type == 'embed'"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="15" viewBox="0 0 16 15" fill="none">
<g clip-path="url(#clip0_4267_416)">
<path d="M0 7.05261C0 7.40758 0.301393 7.70228 0.656367 7.70228H6.39624V13.4421C6.39624 13.7971 6.69093 14.0985 7.04592 14.0985C7.40758 14.0985 7.70228 13.7971 7.70228 13.4421V7.70228H13.4421C13.7971 7.70228 14.0985 7.40758 14.0985 7.05261C14.0985 6.69093 13.7971 6.39624 13.4421 6.39624H7.70228V0.656367C7.70228 0.301393 7.40758 0 7.04592 0C6.69093 0 6.39624 0.301393 6.39624 0.656367V6.39624H0.656367C0.301393 6.39624 0 6.69093 0 7.05261Z" fill="#161819"></path>
</g>
<defs>
<clipPath id="clip0_4267_416">
<rect width="15.063" height="14.1119" fill="white"></rect>
</clipPath>
</defs>
</svg>
</button>
</div>
<div class="rebuy-product-info">
<p
class="rebuy-product-message"
v-if="config.discount.message
&& config.display_type == 'embed'
&& isBodiSpotlight(id)"
v-html="config.discount.message"
></p>
<div
class="rebuy-product-title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']">
<a
v-bind:href="learnMoreURL(product)"
class="rebuy-product-title-link"
v-on:click="learnMore(product, $event);"
v-html="metadata.custom && metadata.custom.product_title_override
&& metadata.custom.product_title_override ? metadata.custom.product_title_override : product.title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
v-bind:aria-label="'View ' + product.title"
rel="nofollow"
></a>
</div>
<div
class="rebuy-product-vendor-container"
v-if="showProductVendor(product.vendor)"
>
<a
class="rebuy-product-vendor"
v-bind:class="[hasEnabledProductVendorLink() ? 'clickable' : '']"
v-html="product.vendor"
v-bind:href="vendorURL(product.vendor)"
v-bind:aria-label="'View ' + product.vendor + ' products'"
rel="nofollow"
></a>
</div>
<div class="rebuy-variant-title" v-if="showVariantTitle(product)" v-html="product.selected_variant.title"></div>
<div class="rebuy-product-review" v-if="hasProductReviews(product)" aria-label="product star rating">
<span class="rebuy-star-rating">
<span
v-if="product.reviews.star_rating"
class="rebuy-star-rating-value sr-only"
v-html="product.reviews.star_rating + ' stars out of 5 stars'"
>
</span>
<span class="rebuy-star-rating-background"></span>
<span class="rebuy-star-rating-foreground" v-bind:style="{ width: productReviewRatingPercentage(product) }"></span>
</span>
<span class="rebuy-review-count" v-html="productReviewCount(product)"></span>
</div>
<div class="rebuy-product-price">
<div v-if="variantOnSale(product, product.selected_variant)">
<span class="rebuy-money compare-at">
<span class="sr-only">Original price</span>
<span v-html="formatMoney(variantCompareAtPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-money sale">
<span class="sr-only">Sale price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-price-label"
v-if="metadata.custom
&& metadata.custom.price_label"
v-html="metadata.custom.price_label"
></span>
</div>
<div v-if="!(variantOnSale(product, product.selected_variant))">
<span class="rebuy-money">
<span class="sr-only">Price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
</div>
</div>
<div v-if="config.display_type == 'embed'" class="rebuy-product-actions">
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'cart' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-description" v-if="showProductDescription(product)" v-html="text(product.body_html)"></div>
</div>
<div class="rebuy-product-options" v-if="showVariantSelect(product)">
<select
title="Select product variant"
:id="id + '-' + 'select' + '-' + product_index"
:class="{ hide : config.view_options.variant_selector === 'buttons' }"
class="rebuy-select"
v-bind:aria-label="'variant of ' + product.title"
v-model="product.selected_variant_id"
v-on:change="selectVariant(product)">
<option
v-for="variant in product.variants"
class="rebuy-product-options__option"
:class="{ 'rebuy-product-options__option--oos' : !variantAvailable(variant) }"
v-bind:value="variant.id"
:disabled="!variantAvailable(variant)"
v-html="formatVariantOptionTitle(variant)">
</option>
</select>
<div
class="rebuy-product-options__button-swatches-container"
:class="{ 'rebuy-style__hidden-block' : config.view_options.variant_selector === 'select' }"
>
<div
v-for="option in product.options"
:key="'option-' + product.id + '-' + option.name"
class="rebuy-product-options__button-swatches rebuy-size-swatches"
>
<div
v-for="(value, value_index) in filterOOSOptions(option, product)"
:key="'value-' + product.id + '-' + option.name + '-' + value + '-' + value_index"
>
<div v-if="displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-color-swatch">
<input
:name="id + '-color-' + product_index"
:id="id + '-color-' + product_index + '-' + value + '-' + value_index"
:checked="hasSwatchOptionSelected(product, value, value_index, 'color')"
:value="value"
type="radio"
class="rebuy-color-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-color-' + product_index + '-' + value + '-' + value_index"
:style="getMerchantThemeColorAssetStyle(value)"
:title="value"
class="rebuy-color-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
</label>
</div>
<div v-if="!displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-size-swatch">
<input
:name="id + '-' + option.name + '-' + product_index"
:id="id + '-' + option.name + '-' + product_index + '-' + value"
:checked="hasSwatchOptionSelected(product, value, value_index, option.name)"
:value="value"
type="radio"
class="rebuy-size-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-' + option.name + '-' + product_index + '-' + value"
class="rebuy-size-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
{{ value }}
</label>
</div>
</div>
</div>
</div>
</div>
<div v-if="config.display_type != 'embed'" class="rebuy-product-actions">
<div class="subscription-checkbox" v-if="config.display_type != 'embed' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'product' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-disclaimer"
v-if="metadata.custom
&& metadata.custom.disclaimer
&& metadata.custom.disclaimer != ''"
v-html="metadata.custom.disclaimer"
></div>
</div>
</div>
</div>
</div>
</div>
</script>
<script id="rebuy-widget-274648" type="text/template">
<div class="rebuy-widget"
v-cloak
v-on:click="stopPropagation($event)"
v-bind:id="'rebuy-widget-' + id"
v-bind:class="['widget-type-' + config.type.replace('_','-'), 'widget-display-' + config.display_type, products.length > 0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
<div
class="rebuy-widget-container"
v-cloak
v-bind:class="['widget-display-' + config.display_type, visible ? 'is-visible' : 'is-hidden' ]"
v-on:click.self="hide()">
<div
class="rebuy-widget-content"
v-bind:class="[isBodiSpotlight(id) ? 'widget-spotlight' : '']"
>
<div class="rebuy-modal-close" v-on:click="hide()" aria-label="close modal">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<g clip-path="url(#clip0_5603_464)">
<rect opacity="0.01" width="24" height="24" fill="#E8E8E8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.8219 17.6852C18.0691 17.4471 18.0599 17.0443 17.8219 16.8062L12.9238 11.9082L17.8219 7.00095C18.0599 6.76291 18.0691 6.36923 17.8219 6.1312C17.5838 5.884 17.181 5.89316 16.943 6.1312L12.0449 11.0293L7.14682 6.1312C6.90878 5.89316 6.50595 5.884 6.26791 6.1312C6.02072 6.36923 6.02988 6.76291 6.26791 7.00095L11.166 11.9082L6.26791 16.8062C6.02988 17.0443 6.02072 17.4471 6.26791 17.6852C6.50595 17.9323 6.90878 17.9232 7.14682 17.6852L12.0449 12.7871L16.943 17.6852C17.181 17.9232 17.5838 17.9323 17.8219 17.6852Z" fill="#161819"/>
</g>
<defs>
<clipPath id="clip0_5603_464">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>
</div>
<div class="rebuy-timer" v-if="hasTimer()">
<p class="rebuy-timer-title" v-if="config.language.timer_title">
<span v-html="config.language.timer_title"></span> <span class="rebuy-timer-minutes" v-html="config.timer.duration_minutes"></span>:<span class="rebuy-timer-seconds" v-html="config.timer.duration_seconds"></span>
</p>
</div>
<p
class="super-title"
v-if="config.language.super_title"
v-html="config.language.super_title"
></p>
<p class="primary-title"
v-if="config.language.title"
v-html="config.language.title"
></p>
<div class="description" v-if="config.language.description" v-html="config.language.description"></div>
<div class="rebuy-product-grid" v-bind:class="layoutClasses" tabindex="0" role="list">
<div
v-for="(product, product_index) in products"
v-bind:class="[
product.handle,
'product-id-' + product.id,
cartHasProduct(product) ? 'cart-has-item' : '',
productTagClasses(product),
hasSplideCarousel ? 'splide__slide' : '',
]"
aria-label="product"
class="rebuy-product-block"
role="listitem"
>
<div class="rebuy-product-media">
<a
class="rebuy-product-image"
tabindex="-1"
v-bind:href="learnMoreURL(product)"
v-bind:style="imageStyles"
v-on:click="learnMore(product, $event);"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
rel="nofollow"
>
<img v-bind:loading="product_index > 1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
</a>
<button
class="rebuy-button"
v-if="config.display_type == 'embed'"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="15" viewBox="0 0 16 15" fill="none">
<g clip-path="url(#clip0_4267_416)">
<path d="M0 7.05261C0 7.40758 0.301393 7.70228 0.656367 7.70228H6.39624V13.4421C6.39624 13.7971 6.69093 14.0985 7.04592 14.0985C7.40758 14.0985 7.70228 13.7971 7.70228 13.4421V7.70228H13.4421C13.7971 7.70228 14.0985 7.40758 14.0985 7.05261C14.0985 6.69093 13.7971 6.39624 13.4421 6.39624H7.70228V0.656367C7.70228 0.301393 7.40758 0 7.04592 0C6.69093 0 6.39624 0.301393 6.39624 0.656367V6.39624H0.656367C0.301393 6.39624 0 6.69093 0 7.05261Z" fill="#161819"></path>
</g>
<defs>
<clipPath id="clip0_4267_416">
<rect width="15.063" height="14.1119" fill="white"></rect>
</clipPath>
</defs>
</svg>
</button>
</div>
<div class="rebuy-product-info">
<p
class="rebuy-product-message"
v-if="config.discount.message
&& config.display_type == 'embed'
&& isBodiSpotlight(id)"
v-html="config.discount.message"
></p>
<div
class="rebuy-product-title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']">
<a
v-bind:href="learnMoreURL(product)"
class="rebuy-product-title-link"
v-on:click="learnMore(product, $event);"
v-html="metadata.custom && metadata.custom.product_title_override
&& metadata.custom.product_title_override ? metadata.custom.product_title_override : product.title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
v-bind:aria-label="'View ' + product.title"
rel="nofollow"
></a>
</div>
<div
class="rebuy-product-vendor-container"
v-if="showProductVendor(product.vendor)"
>
<a
class="rebuy-product-vendor"
v-bind:class="[hasEnabledProductVendorLink() ? 'clickable' : '']"
v-html="product.vendor"
v-bind:href="vendorURL(product.vendor)"
v-bind:aria-label="'View ' + product.vendor + ' products'"
rel="nofollow"
></a>
</div>
<div class="rebuy-variant-title" v-if="showVariantTitle(product)" v-html="product.selected_variant.title"></div>
<div class="rebuy-product-review" v-if="hasProductReviews(product)" aria-label="product star rating">
<span class="rebuy-star-rating">
<span
v-if="product.reviews.star_rating"
class="rebuy-star-rating-value sr-only"
v-html="product.reviews.star_rating + ' stars out of 5 stars'"
>
</span>
<span class="rebuy-star-rating-background"></span>
<span class="rebuy-star-rating-foreground" v-bind:style="{ width: productReviewRatingPercentage(product) }"></span>
</span>
<span class="rebuy-review-count" v-html="productReviewCount(product)"></span>
</div>
<div class="rebuy-product-price">
<div v-if="variantOnSale(product, product.selected_variant)">
<span class="rebuy-money compare-at">
<span class="sr-only">Original price</span>
<span v-html="formatMoney(variantCompareAtPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-money sale">
<span class="sr-only">Sale price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-price-label"
v-if="metadata.custom
&& metadata.custom.price_label"
v-html="metadata.custom.price_label"
></span>
</div>
<div v-if="!(variantOnSale(product, product.selected_variant))">
<span class="rebuy-money">
<span class="sr-only">Price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
</div>
</div>
<div v-if="config.display_type == 'embed'" class="rebuy-product-actions">
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'cart' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-description" v-if="showProductDescription(product)" v-html="text(product.body_html)"></div>
</div>
<div class="rebuy-product-options" v-if="showVariantSelect(product)">
<select
title="Select product variant"
:id="id + '-' + 'select' + '-' + product_index"
:class="{ hide : config.view_options.variant_selector === 'buttons' }"
class="rebuy-select"
v-bind:aria-label="'variant of ' + product.title"
v-model="product.selected_variant_id"
v-on:change="selectVariant(product)">
<option
v-for="variant in product.variants"
class="rebuy-product-options__option"
:class="{ 'rebuy-product-options__option--oos' : !variantAvailable(variant) }"
v-bind:value="variant.id"
:disabled="!variantAvailable(variant)"
v-html="formatVariantOptionTitle(variant)">
</option>
</select>
<div
class="rebuy-product-options__button-swatches-container"
:class="{ 'rebuy-style__hidden-block' : config.view_options.variant_selector === 'select' }"
>
<div
v-for="option in product.options"
:key="'option-' + product.id + '-' + option.name"
class="rebuy-product-options__button-swatches rebuy-size-swatches"
>
<div
v-for="(value, value_index) in filterOOSOptions(option, product)"
:key="'value-' + product.id + '-' + option.name + '-' + value + '-' + value_index"
>
<div v-if="displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-color-swatch">
<input
:name="id + '-color-' + product_index"
:id="id + '-color-' + product_index + '-' + value + '-' + value_index"
:checked="hasSwatchOptionSelected(product, value, value_index, 'color')"
:value="value"
type="radio"
class="rebuy-color-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-color-' + product_index + '-' + value + '-' + value_index"
:style="getMerchantThemeColorAssetStyle(value)"
:title="value"
class="rebuy-color-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
</label>
</div>
<div v-if="!displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-size-swatch">
<input
:name="id + '-' + option.name + '-' + product_index"
:id="id + '-' + option.name + '-' + product_index + '-' + value"
:checked="hasSwatchOptionSelected(product, value, value_index, option.name)"
:value="value"
type="radio"
class="rebuy-size-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-' + option.name + '-' + product_index + '-' + value"
class="rebuy-size-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
{{ value }}
</label>
</div>
</div>
</div>
</div>
</div>
<div v-if="config.display_type != 'embed'" class="rebuy-product-actions">
<div class="subscription-checkbox" v-if="config.display_type != 'embed' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'product' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-disclaimer"
v-if="metadata.custom
&& metadata.custom.disclaimer
&& metadata.custom.disclaimer != ''"
v-html="metadata.custom.disclaimer"
></div>
</div>
</div>
</div>
</div>
</div>
</script>
<script id="rebuy-widget-274807" type="text/template">
<div class="rebuy-widget"
v-cloak
v-on:click="stopPropagation($event)"
v-bind:id="'rebuy-widget-' + id"
v-bind:class="['widget-type-' + config.type.replace('_','-'), 'widget-display-' + config.display_type, products.length > 0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
<div
class="rebuy-widget-container"
v-cloak
v-bind:class="['widget-display-' + config.display_type, visible ? 'is-visible' : 'is-hidden' ]"
v-on:click.self="hide()">
<div
class="rebuy-widget-content"
v-bind:class="[isBodiSpotlight(id) ? 'widget-spotlight' : '']"
>
<div class="rebuy-modal-close" v-on:click="hide()" aria-label="close modal">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<g clip-path="url(#clip0_5603_464)">
<rect opacity="0.01" width="24" height="24" fill="#E8E8E8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.8219 17.6852C18.0691 17.4471 18.0599 17.0443 17.8219 16.8062L12.9238 11.9082L17.8219 7.00095C18.0599 6.76291 18.0691 6.36923 17.8219 6.1312C17.5838 5.884 17.181 5.89316 16.943 6.1312L12.0449 11.0293L7.14682 6.1312C6.90878 5.89316 6.50595 5.884 6.26791 6.1312C6.02072 6.36923 6.02988 6.76291 6.26791 7.00095L11.166 11.9082L6.26791 16.8062C6.02988 17.0443 6.02072 17.4471 6.26791 17.6852C6.50595 17.9323 6.90878 17.9232 7.14682 17.6852L12.0449 12.7871L16.943 17.6852C17.181 17.9232 17.5838 17.9323 17.8219 17.6852Z" fill="#161819"/>
</g>
<defs>
<clipPath id="clip0_5603_464">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>
</div>
<div class="rebuy-timer" v-if="hasTimer()">
<p class="rebuy-timer-title" v-if="config.language.timer_title">
<span v-html="config.language.timer_title"></span> <span class="rebuy-timer-minutes" v-html="config.timer.duration_minutes"></span>:<span class="rebuy-timer-seconds" v-html="config.timer.duration_seconds"></span>
</p>
</div>
<p
class="super-title"
v-if="config.language.super_title"
v-html="config.language.super_title"
></p>
<p class="primary-title"
v-if="config.language.title"
v-html="config.language.title"
></p>
<div class="description" v-if="config.language.description" v-html="config.language.description"></div>
<div class="rebuy-product-grid" v-bind:class="layoutClasses" tabindex="0" role="list">
<div
v-for="(product, product_index) in products"
v-bind:class="[
product.handle,
'product-id-' + product.id,
cartHasProduct(product) ? 'cart-has-item' : '',
productTagClasses(product),
hasSplideCarousel ? 'splide__slide' : '',
]"
aria-label="product"
class="rebuy-product-block"
role="listitem"
>
<div class="rebuy-product-media">
<a
class="rebuy-product-image"
tabindex="-1"
v-bind:href="learnMoreURL(product)"
v-bind:style="imageStyles"
v-on:click="learnMore(product, $event);"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
rel="nofollow"
>
<img v-bind:loading="product_index > 1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
</a>
<button
class="rebuy-button"
v-if="config.display_type == 'embed'"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="15" viewBox="0 0 16 15" fill="none">
<g clip-path="url(#clip0_4267_416)">
<path d="M0 7.05261C0 7.40758 0.301393 7.70228 0.656367 7.70228H6.39624V13.4421C6.39624 13.7971 6.69093 14.0985 7.04592 14.0985C7.40758 14.0985 7.70228 13.7971 7.70228 13.4421V7.70228H13.4421C13.7971 7.70228 14.0985 7.40758 14.0985 7.05261C14.0985 6.69093 13.7971 6.39624 13.4421 6.39624H7.70228V0.656367C7.70228 0.301393 7.40758 0 7.04592 0C6.69093 0 6.39624 0.301393 6.39624 0.656367V6.39624H0.656367C0.301393 6.39624 0 6.69093 0 7.05261Z" fill="#161819"></path>
</g>
<defs>
<clipPath id="clip0_4267_416">
<rect width="15.063" height="14.1119" fill="white"></rect>
</clipPath>
</defs>
</svg>
</button>
</div>
<div class="rebuy-product-info">
<p
class="rebuy-product-message"
v-if="config.discount.message
&& config.display_type == 'embed'
&& isBodiSpotlight(id)"
v-html="config.discount.message"
></p>
<div
class="rebuy-product-title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']">
<a
v-bind:href="learnMoreURL(product)"
class="rebuy-product-title-link"
v-on:click="learnMore(product, $event);"
v-html="metadata.custom && metadata.custom.product_title_override
&& metadata.custom.product_title_override ? metadata.custom.product_title_override : product.title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
v-bind:aria-label="'View ' + product.title"
rel="nofollow"
></a>
</div>
<div
class="rebuy-product-vendor-container"
v-if="showProductVendor(product.vendor)"
>
<a
class="rebuy-product-vendor"
v-bind:class="[hasEnabledProductVendorLink() ? 'clickable' : '']"
v-html="product.vendor"
v-bind:href="vendorURL(product.vendor)"
v-bind:aria-label="'View ' + product.vendor + ' products'"
rel="nofollow"
></a>
</div>
<div class="rebuy-variant-title" v-if="showVariantTitle(product)" v-html="product.selected_variant.title"></div>
<div class="rebuy-product-review" v-if="hasProductReviews(product)" aria-label="product star rating">
<span class="rebuy-star-rating">
<span
v-if="product.reviews.star_rating"
class="rebuy-star-rating-value sr-only"
v-html="product.reviews.star_rating + ' stars out of 5 stars'"
>
</span>
<span class="rebuy-star-rating-background"></span>
<span class="rebuy-star-rating-foreground" v-bind:style="{ width: productReviewRatingPercentage(product) }"></span>
</span>
<span class="rebuy-review-count" v-html="productReviewCount(product)"></span>
</div>
<div class="rebuy-product-price">
<div v-if="variantOnSale(product, product.selected_variant)">
<span class="rebuy-money compare-at">
<span class="sr-only">Original price</span>
<span v-html="formatMoney(variantCompareAtPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-money sale">
<span class="sr-only">Sale price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-price-label"
v-if="metadata.custom
&& metadata.custom.price_label"
v-html="metadata.custom.price_label"
></span>
</div>
<div v-if="!(variantOnSale(product, product.selected_variant))">
<span class="rebuy-money">
<span class="sr-only">Price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
</div>
</div>
<div v-if="config.display_type == 'embed'" class="rebuy-product-actions">
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'cart' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-description" v-if="showProductDescription(product)" v-html="text(product.body_html)"></div>
</div>
<div class="rebuy-product-options" v-if="showVariantSelect(product)">
<select
title="Select product variant"
:id="id + '-' + 'select' + '-' + product_index"
:class="{ hide : config.view_options.variant_selector === 'buttons' }"
class="rebuy-select"
v-bind:aria-label="'variant of ' + product.title"
v-model="product.selected_variant_id"
v-on:change="selectVariant(product)">
<option
v-for="variant in product.variants"
class="rebuy-product-options__option"
:class="{ 'rebuy-product-options__option--oos' : !variantAvailable(variant) }"
v-bind:value="variant.id"
:disabled="!variantAvailable(variant)"
v-html="formatVariantOptionTitle(variant)">
</option>
</select>
<div
class="rebuy-product-options__button-swatches-container"
:class="{ 'rebuy-style__hidden-block' : config.view_options.variant_selector === 'select' }"
>
<div
v-for="option in product.options"
:key="'option-' + product.id + '-' + option.name"
class="rebuy-product-options__button-swatches rebuy-size-swatches"
>
<div
v-for="(value, value_index) in filterOOSOptions(option, product)"
:key="'value-' + product.id + '-' + option.name + '-' + value + '-' + value_index"
>
<div v-if="displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-color-swatch">
<input
:name="id + '-color-' + product_index"
:id="id + '-color-' + product_index + '-' + value + '-' + value_index"
:checked="hasSwatchOptionSelected(product, value, value_index, 'color')"
:value="value"
type="radio"
class="rebuy-color-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-color-' + product_index + '-' + value + '-' + value_index"
:style="getMerchantThemeColorAssetStyle(value)"
:title="value"
class="rebuy-color-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
</label>
</div>
<div v-if="!displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-size-swatch">
<input
:name="id + '-' + option.name + '-' + product_index"
:id="id + '-' + option.name + '-' + product_index + '-' + value"
:checked="hasSwatchOptionSelected(product, value, value_index, option.name)"
:value="value"
type="radio"
class="rebuy-size-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-' + option.name + '-' + product_index + '-' + value"
class="rebuy-size-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
{{ value }}
</label>
</div>
</div>
</div>
</div>
</div>
<div v-if="config.display_type != 'embed'" class="rebuy-product-actions">
<div class="subscription-checkbox" v-if="config.display_type != 'embed' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'product' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-disclaimer"
v-if="metadata.custom
&& metadata.custom.disclaimer
&& metadata.custom.disclaimer != ''"
v-html="metadata.custom.disclaimer"
></div>
</div>
</div>
</div>
</div>
</div>
</script>
<script id="rebuy-widget-274646" type="text/template">
<div class="rebuy-widget"
v-cloak
v-on:click="stopPropagation($event)"
v-bind:id="'rebuy-widget-' + id"
v-bind:class="['widget-type-' + config.type.replace('_','-'), 'widget-display-' + config.display_type, products.length > 0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
<div
class="rebuy-widget-container"
v-cloak
v-bind:class="['widget-display-' + config.display_type, visible ? 'is-visible' : 'is-hidden' ]"
v-on:click.self="hide()">
<div
class="rebuy-widget-content"
v-bind:class="[isBodiSpotlight(id) ? 'widget-spotlight' : '']"
>
<div class="rebuy-modal-close" v-on:click="hide()" aria-label="close modal">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<g clip-path="url(#clip0_5603_464)">
<rect opacity="0.01" width="24" height="24" fill="#E8E8E8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.8219 17.6852C18.0691 17.4471 18.0599 17.0443 17.8219 16.8062L12.9238 11.9082L17.8219 7.00095C18.0599 6.76291 18.0691 6.36923 17.8219 6.1312C17.5838 5.884 17.181 5.89316 16.943 6.1312L12.0449 11.0293L7.14682 6.1312C6.90878 5.89316 6.50595 5.884 6.26791 6.1312C6.02072 6.36923 6.02988 6.76291 6.26791 7.00095L11.166 11.9082L6.26791 16.8062C6.02988 17.0443 6.02072 17.4471 6.26791 17.6852C6.50595 17.9323 6.90878 17.9232 7.14682 17.6852L12.0449 12.7871L16.943 17.6852C17.181 17.9232 17.5838 17.9323 17.8219 17.6852Z" fill="#161819"/>
</g>
<defs>
<clipPath id="clip0_5603_464">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>
</div>
<div class="rebuy-timer" v-if="hasTimer()">
<p class="rebuy-timer-title" v-if="config.language.timer_title">
<span v-html="config.language.timer_title"></span> <span class="rebuy-timer-minutes" v-html="config.timer.duration_minutes"></span>:<span class="rebuy-timer-seconds" v-html="config.timer.duration_seconds"></span>
</p>
</div>
<p
class="super-title"
v-if="config.language.super_title"
v-html="config.language.super_title"
></p>
<p class="primary-title"
v-if="config.language.title"
v-html="config.language.title"
></p>
<div class="description" v-if="config.language.description" v-html="config.language.description"></div>
<div class="rebuy-product-grid" v-bind:class="layoutClasses" tabindex="0" role="list">
<div
v-for="(product, product_index) in products"
v-bind:class="[
product.handle,
'product-id-' + product.id,
cartHasProduct(product) ? 'cart-has-item' : '',
productTagClasses(product),
hasSplideCarousel ? 'splide__slide' : '',
]"
aria-label="product"
class="rebuy-product-block"
role="listitem"
>
<div class="rebuy-product-media">
<a
class="rebuy-product-image"
tabindex="-1"
v-bind:href="learnMoreURL(product)"
v-bind:style="imageStyles"
v-on:click="learnMore(product, $event);"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
rel="nofollow"
>
<img v-bind:loading="product_index > 1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
</a>
<button
class="rebuy-button"
v-if="config.display_type == 'embed'"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="15" viewBox="0 0 16 15" fill="none">
<g clip-path="url(#clip0_4267_416)">
<path d="M0 7.05261C0 7.40758 0.301393 7.70228 0.656367 7.70228H6.39624V13.4421C6.39624 13.7971 6.69093 14.0985 7.04592 14.0985C7.40758 14.0985 7.70228 13.7971 7.70228 13.4421V7.70228H13.4421C13.7971 7.70228 14.0985 7.40758 14.0985 7.05261C14.0985 6.69093 13.7971 6.39624 13.4421 6.39624H7.70228V0.656367C7.70228 0.301393 7.40758 0 7.04592 0C6.69093 0 6.39624 0.301393 6.39624 0.656367V6.39624H0.656367C0.301393 6.39624 0 6.69093 0 7.05261Z" fill="#161819"></path>
</g>
<defs>
<clipPath id="clip0_4267_416">
<rect width="15.063" height="14.1119" fill="white"></rect>
</clipPath>
</defs>
</svg>
</button>
</div>
<div class="rebuy-product-info">
<p
class="rebuy-product-message"
v-if="config.discount.message
&& config.display_type == 'embed'
&& isBodiSpotlight(id)"
v-html="config.discount.message"
></p>
<div
class="rebuy-product-title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']">
<a
v-bind:href="learnMoreURL(product)"
class="rebuy-product-title-link"
v-on:click="learnMore(product, $event);"
v-html="metadata.custom && metadata.custom.product_title_override
&& metadata.custom.product_title_override ? metadata.custom.product_title_override : product.title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
v-bind:aria-label="'View ' + product.title"
rel="nofollow"
></a>
</div>
<div
class="rebuy-product-vendor-container"
v-if="showProductVendor(product.vendor)"
>
<a
class="rebuy-product-vendor"
v-bind:class="[hasEnabledProductVendorLink() ? 'clickable' : '']"
v-html="product.vendor"
v-bind:href="vendorURL(product.vendor)"
v-bind:aria-label="'View ' + product.vendor + ' products'"
rel="nofollow"
></a>
</div>
<div class="rebuy-variant-title" v-if="showVariantTitle(product)" v-html="product.selected_variant.title"></div>
<div class="rebuy-product-review" v-if="hasProductReviews(product)" aria-label="product star rating">
<span class="rebuy-star-rating">
<span
v-if="product.reviews.star_rating"
class="rebuy-star-rating-value sr-only"
v-html="product.reviews.star_rating + ' stars out of 5 stars'"
>
</span>
<span class="rebuy-star-rating-background"></span>
<span class="rebuy-star-rating-foreground" v-bind:style="{ width: productReviewRatingPercentage(product) }"></span>
</span>
<span class="rebuy-review-count" v-html="productReviewCount(product)"></span>
</div>
<div class="rebuy-product-price">
<div v-if="variantOnSale(product, product.selected_variant)">
<span class="rebuy-money compare-at">
<span class="sr-only">Original price</span>
<span v-html="formatMoney(variantCompareAtPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-money sale">
<span class="sr-only">Sale price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-price-label"
v-if="metadata.custom
&& metadata.custom.price_label"
v-html="metadata.custom.price_label"
></span>
</div>
<div v-if="!(variantOnSale(product, product.selected_variant))">
<span class="rebuy-money">
<span class="sr-only">Price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
</div>
</div>
<div v-if="config.display_type == 'embed'" class="rebuy-product-actions">
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'cart' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-description" v-if="showProductDescription(product)" v-html="text(product.body_html)"></div>
</div>
<div class="rebuy-product-options" v-if="showVariantSelect(product)">
<select
title="Select product variant"
:id="id + '-' + 'select' + '-' + product_index"
:class="{ hide : config.view_options.variant_selector === 'buttons' }"
class="rebuy-select"
v-bind:aria-label="'variant of ' + product.title"
v-model="product.selected_variant_id"
v-on:change="selectVariant(product)">
<option
v-for="variant in product.variants"
class="rebuy-product-options__option"
:class="{ 'rebuy-product-options__option--oos' : !variantAvailable(variant) }"
v-bind:value="variant.id"
:disabled="!variantAvailable(variant)"
v-html="formatVariantOptionTitle(variant)">
</option>
</select>
<div
class="rebuy-product-options__button-swatches-container"
:class="{ 'rebuy-style__hidden-block' : config.view_options.variant_selector === 'select' }"
>
<div
v-for="option in product.options"
:key="'option-' + product.id + '-' + option.name"
class="rebuy-product-options__button-swatches rebuy-size-swatches"
>
<div
v-for="(value, value_index) in filterOOSOptions(option, product)"
:key="'value-' + product.id + '-' + option.name + '-' + value + '-' + value_index"
>
<div v-if="displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-color-swatch">
<input
:name="id + '-color-' + product_index"
:id="id + '-color-' + product_index + '-' + value + '-' + value_index"
:checked="hasSwatchOptionSelected(product, value, value_index, 'color')"
:value="value"
type="radio"
class="rebuy-color-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-color-' + product_index + '-' + value + '-' + value_index"
:style="getMerchantThemeColorAssetStyle(value)"
:title="value"
class="rebuy-color-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
</label>
</div>
<div v-if="!displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-size-swatch">
<input
:name="id + '-' + option.name + '-' + product_index"
:id="id + '-' + option.name + '-' + product_index + '-' + value"
:checked="hasSwatchOptionSelected(product, value, value_index, option.name)"
:value="value"
type="radio"
class="rebuy-size-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-' + option.name + '-' + product_index + '-' + value"
class="rebuy-size-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
{{ value }}
</label>
</div>
</div>
</div>
</div>
</div>
<div v-if="config.display_type != 'embed'" class="rebuy-product-actions">
<div class="subscription-checkbox" v-if="config.display_type != 'embed' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'product' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-disclaimer"
v-if="metadata.custom
&& metadata.custom.disclaimer
&& metadata.custom.disclaimer != ''"
v-html="metadata.custom.disclaimer"
></div>
</div>
</div>
</div>
</div>
</div>
</script>
<script id="rebuy-widget-294582" type="text/template">
<div class="rebuy-widget"
v-cloak
v-on:click="stopPropagation($event)"
v-bind:id="'rebuy-widget-' + id"
v-bind:class="['widget-type-' + config.type.replace('_','-'), 'widget-display-' + config.display_type, products.length > 0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
<div
class="rebuy-widget-container"
v-cloak
v-bind:class="['widget-display-' + config.display_type, visible ? 'is-visible' : 'is-hidden' ]"
v-on:click.self="hide()">
<div
class="rebuy-widget-content"
v-bind:class="[isBodiSpotlight(id) ? 'widget-spotlight' : '']"
>
<div class="rebuy-modal-close" v-on:click="hide()" aria-label="close modal">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<g clip-path="url(#clip0_5603_464)">
<rect opacity="0.01" width="24" height="24" fill="#E8E8E8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.8219 17.6852C18.0691 17.4471 18.0599 17.0443 17.8219 16.8062L12.9238 11.9082L17.8219 7.00095C18.0599 6.76291 18.0691 6.36923 17.8219 6.1312C17.5838 5.884 17.181 5.89316 16.943 6.1312L12.0449 11.0293L7.14682 6.1312C6.90878 5.89316 6.50595 5.884 6.26791 6.1312C6.02072 6.36923 6.02988 6.76291 6.26791 7.00095L11.166 11.9082L6.26791 16.8062C6.02988 17.0443 6.02072 17.4471 6.26791 17.6852C6.50595 17.9323 6.90878 17.9232 7.14682 17.6852L12.0449 12.7871L16.943 17.6852C17.181 17.9232 17.5838 17.9323 17.8219 17.6852Z" fill="#161819"/>
</g>
<defs>
<clipPath id="clip0_5603_464">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>
</div>
<div class="rebuy-timer" v-if="hasTimer()">
<p class="rebuy-timer-title" v-if="config.language.timer_title">
<span v-html="config.language.timer_title"></span> <span class="rebuy-timer-minutes" v-html="config.timer.duration_minutes"></span>:<span class="rebuy-timer-seconds" v-html="config.timer.duration_seconds"></span>
</p>
</div>
<p
class="super-title"
v-if="config.language.super_title"
v-html="config.language.super_title"
></p>
<p class="primary-title"
v-if="config.language.title"
v-html="config.language.title"
></p>
<div class="description" v-if="config.language.description" v-html="config.language.description"></div>
<div class="rebuy-product-grid" v-bind:class="layoutClasses" tabindex="0" role="list">
<div
v-for="(product, product_index) in products"
v-bind:class="[
product.handle,
'product-id-' + product.id,
cartHasProduct(product) ? 'cart-has-item' : '',
productTagClasses(product),
hasSplideCarousel ? 'splide__slide' : '',
]"
aria-label="product"
class="rebuy-product-block"
role="listitem"
>
<div class="rebuy-product-media">
<a
class="rebuy-product-image"
tabindex="-1"
v-bind:href="learnMoreURL(product)"
v-bind:style="imageStyles"
v-on:click="learnMore(product, $event);"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
rel="nofollow"
>
<img v-bind:loading="product_index > 1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
</a>
<button
class="rebuy-button"
v-if="config.display_type == 'embed'"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="15" viewBox="0 0 16 15" fill="none">
<g clip-path="url(#clip0_4267_416)">
<path d="M0 7.05261C0 7.40758 0.301393 7.70228 0.656367 7.70228H6.39624V13.4421C6.39624 13.7971 6.69093 14.0985 7.04592 14.0985C7.40758 14.0985 7.70228 13.7971 7.70228 13.4421V7.70228H13.4421C13.7971 7.70228 14.0985 7.40758 14.0985 7.05261C14.0985 6.69093 13.7971 6.39624 13.4421 6.39624H7.70228V0.656367C7.70228 0.301393 7.40758 0 7.04592 0C6.69093 0 6.39624 0.301393 6.39624 0.656367V6.39624H0.656367C0.301393 6.39624 0 6.69093 0 7.05261Z" fill="#161819"></path>
</g>
<defs>
<clipPath id="clip0_4267_416">
<rect width="15.063" height="14.1119" fill="white"></rect>
</clipPath>
</defs>
</svg>
</button>
</div>
<div class="rebuy-product-info">
<p
class="rebuy-product-message"
v-if="config.discount.message
&& config.display_type == 'embed'
&& isBodiSpotlight(id)"
v-html="config.discount.message"
></p>
<div
class="rebuy-product-title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']">
<a
v-bind:href="learnMoreURL(product)"
class="rebuy-product-title-link"
v-on:click="learnMore(product, $event);"
v-html="metadata.custom && metadata.custom.product_title_override
&& metadata.custom.product_title_override ? metadata.custom.product_title_override : product.title"
v-bind:class="[hasLearnMore() ? 'clickable' : '']"
v-bind:aria-label="'View ' + product.title"
rel="nofollow"
></a>
</div>
<div
class="rebuy-product-vendor-container"
v-if="showProductVendor(product.vendor)"
>
<a
class="rebuy-product-vendor"
v-bind:class="[hasEnabledProductVendorLink() ? 'clickable' : '']"
v-html="product.vendor"
v-bind:href="vendorURL(product.vendor)"
v-bind:aria-label="'View ' + product.vendor + ' products'"
rel="nofollow"
></a>
</div>
<div class="rebuy-variant-title" v-if="showVariantTitle(product)" v-html="product.selected_variant.title"></div>
<div class="rebuy-product-review" v-if="hasProductReviews(product)" aria-label="product star rating">
<span class="rebuy-star-rating">
<span
v-if="product.reviews.star_rating"
class="rebuy-star-rating-value sr-only"
v-html="product.reviews.star_rating + ' stars out of 5 stars'"
>
</span>
<span class="rebuy-star-rating-background"></span>
<span class="rebuy-star-rating-foreground" v-bind:style="{ width: productReviewRatingPercentage(product) }"></span>
</span>
<span class="rebuy-review-count" v-html="productReviewCount(product)"></span>
</div>
<div class="rebuy-product-price">
<div v-if="variantOnSale(product, product.selected_variant)">
<span class="rebuy-money compare-at">
<span class="sr-only">Original price</span>
<span v-html="formatMoney(variantCompareAtPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-money sale">
<span class="sr-only">Sale price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-price-label"
v-if="metadata.custom
&& metadata.custom.price_label"
v-html="metadata.custom.price_label"
></span>
</div>
<div v-if="!(variantOnSale(product, product.selected_variant))">
<span class="rebuy-money">
<span class="sr-only">Price</span>
<span tabindex="0" v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
</div>
</div>
<div v-if="config.display_type == 'embed'" class="rebuy-product-actions">
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'cart' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-description" v-if="showProductDescription(product)" v-html="text(product.body_html)"></div>
</div>
<div class="rebuy-product-options" v-if="showVariantSelect(product)">
<select
title="Select product variant"
:id="id + '-' + 'select' + '-' + product_index"
:class="{ hide : config.view_options.variant_selector === 'buttons' }"
class="rebuy-select"
v-bind:aria-label="'variant of ' + product.title"
v-model="product.selected_variant_id"
v-on:change="selectVariant(product)">
<option
v-for="variant in product.variants"
class="rebuy-product-options__option"
:class="{ 'rebuy-product-options__option--oos' : !variantAvailable(variant) }"
v-bind:value="variant.id"
:disabled="!variantAvailable(variant)"
v-html="formatVariantOptionTitle(variant)">
</option>
</select>
<div
class="rebuy-product-options__button-swatches-container"
:class="{ 'rebuy-style__hidden-block' : config.view_options.variant_selector === 'select' }"
>
<div
v-for="option in product.options"
:key="'option-' + product.id + '-' + option.name"
class="rebuy-product-options__button-swatches rebuy-size-swatches"
>
<div
v-for="(value, value_index) in filterOOSOptions(option, product)"
:key="'value-' + product.id + '-' + option.name + '-' + value + '-' + value_index"
>
<div v-if="displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-color-swatch">
<input
:name="id + '-color-' + product_index"
:id="id + '-color-' + product_index + '-' + value + '-' + value_index"
:checked="hasSwatchOptionSelected(product, value, value_index, 'color')"
:value="value"
type="radio"
class="rebuy-color-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-color-' + product_index + '-' + value + '-' + value_index"
:style="getMerchantThemeColorAssetStyle(value)"
:title="value"
class="rebuy-color-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
</label>
</div>
<div v-if="!displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-size-swatch">
<input
:name="id + '-' + option.name + '-' + product_index"
:id="id + '-' + option.name + '-' + product_index + '-' + value"
:checked="hasSwatchOptionSelected(product, value, value_index, option.name)"
:value="value"
type="radio"
class="rebuy-size-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-' + option.name + '-' + product_index + '-' + value"
class="rebuy-size-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
{{ value }}
</label>
</div>
</div>
</div>
</div>
</div>
<div v-if="config.display_type != 'embed'" class="rebuy-product-actions">
<div class="subscription-checkbox" v-if="config.display_type != 'embed' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="subscription-frequency" v-if="showSubscriptionFrequency(product) && product.subscription_frequencies && product.subscription_frequencies.length > 1">
<!-- <div
v-if="product.subscription_frequencies.length == 1"
v-html="frequencyLabel(product.subscription_frequencies[0], product.subscription_interval)"
class="rebuy-fequency-label"
></div> -->
<select
class="rebuy-select"
aria-label="subscription frequency"
v-model="product.subscription_frequency"
v-on:change="updateSubscriptionFrequency(product)"
v-if="product.subscription_frequencies && product.subscription_frequencies.length > 1">
<option v-for="frequency in product.subscription_frequencies" v-bind:value="frequency">{{ frequencyLabel(frequency, product.subscription_interval) }}</option>
</select>
</div>
<div class="product-quantity" v-if="hasQuantityInputEnabled()">
<div class="rebuy-select-wrapper">
<label class="rebuy-label">Quantity</label>
<select
class="rebuy-select"
aria-label="product quantity"
v-model="product.quantity">
<option v-for="n in maxQuantityInputValue()" v-bind:value="n">{{ n }}</option>
</select>
</div>
</div>
<button
class="rebuy-button"
v-bind:class="{ working: (product.status != 'ready' && product.status != 'selecting') }"
v-bind:disabled="!(variantAvailable(product.selected_variant)) || (product.status != 'ready' && product.status != 'selecting')"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addToCart(product)"
type="button">
<span v-html="buttonLabel(product)"></span>
</button>
<div class="no-thanks" v-if="showContinueButton()" v-on:click="hide()">
<span v-html="declineLabel(product)"></span>
</div>
</div>
<div class="subscription-checkbox" v-if="config.display_type == 'embed' && config.type == 'product' && showSubscriptionOptions(product)">
<label class="rebuy-checkbox-label">
<input
class="checkbox-input rebuy-checkbox"
v-model="product.subscription"
v-on:change="toggleSubscription(product)"
type="checkbox"
:aria-label="upgradeToSubscriptionAriaLabel(product)"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.25C13.2131 5.25 14.4153 5.2957 15.6052 5.38545C17.2196 5.50723 18.4928 6.78038 18.6146 8.39481C18.6586 8.97827 18.692 9.56471 18.7146 10.1539L17.0303 8.46967C16.7374 8.17678 16.2626 8.17678 15.9697 8.46967C15.6768 8.76256 15.6768 9.23744 15.9697 9.53033L18.9697 12.5303C19.2626 12.8232 19.7374 12.8232 20.0303 12.5303L23.0303 9.53033C23.3232 9.23744 23.3232 8.76256 23.0303 8.46967C22.7374 8.17678 22.2626 8.17678 21.9697 8.46967L20.2181 10.2212C20.1948 9.57151 20.1588 8.92503 20.1103 8.28199C19.9327 5.92812 18.0719 4.06725 15.718 3.8897C14.4907 3.79712 13.2508 3.75 12 3.75C10.7492 3.75 9.50933 3.79712 8.28199 3.8897C5.92812 4.06725 4.06725 5.92812 3.8897 8.28199C3.87284 8.50552 3.85748 8.72948 3.84365 8.95384C3.81815 9.36727 4.13264 9.72308 4.54606 9.74858C4.95949 9.77407 5.31531 9.45959 5.3408 9.04616C5.35422 8.82864 5.3691 8.61152 5.38545 8.39481C5.50723 6.78038 6.78038 5.50723 8.39481 5.38545C9.58465 5.2957 10.7869 5.25 12 5.25ZM5.03033 11.4697C4.73744 11.1768 4.26256 11.1768 3.96967 11.4697L0.96967 14.4697C0.676777 14.7626 0.676777 15.2374 0.96967 15.5303C1.26256 15.8232 1.73744 15.8232 2.03033 15.5303L3.78186 13.7788C3.80517 14.4285 3.84119 15.075 3.8897 15.718C4.06725 18.0719 5.92812 19.9327 8.28199 20.1103C9.50933 20.2029 10.7492 20.25 12 20.25C13.2508 20.25 14.4907 20.2029 15.718 20.1103C18.0719 19.9327 19.9327 18.0719 20.1103 15.718C20.1272 15.4945 20.1425 15.2705 20.1564 15.0462C20.1818 14.6327 19.8674 14.2769 19.4539 14.2514C19.0405 14.2259 18.6847 14.5404 18.6592 14.9538C18.6458 15.1714 18.6309 15.3885 18.6146 15.6052C18.4928 17.2196 17.2196 18.4928 15.6052 18.6146C14.4153 18.7043 13.2131 18.75 12 18.75C10.7869 18.75 9.58465 18.7043 8.39481 18.6146C6.78038 18.4928 5.50723 17.2196 5.38545 15.6052C5.34144 15.0217 5.30802 14.4353 5.28539 13.8461L6.96967 15.5303C7.26256 15.8232 7.73744 15.8232 8.03033 15.5303C8.32322 15.2374 8.32322 14.7626 8.03033 14.4697L5.03033 11.4697Z" fill="#161819"/>
</svg>
<span class="checkbox-label" v-html="upgradeToSubscriptionLabel(product)"></span>
</label>
</div>
<div class="rebuy-product-disclaimer"
v-if="metadata.custom
&& metadata.custom.disclaimer
&& metadata.custom.disclaimer != ''"
v-html="metadata.custom.disclaimer"
></div>
</div>
</div>
</div>
</div>
</div>
</script>
<script id="rebuy-dynamic-bundle-template" type="text/template">
<div class="rebuy-widget"
v-cloak
v-on:click="stopPropagation($event)"
v-bind:id="'rebuy-widget-' + id"
v-bind:class="['widget-type-' + config.type.replace('_','-'), products.length > 0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
<div class="rebuy-widget-container"
v-bind:class="['widget-display-' + config.display_type, visible ? 'is-visible' : 'is-hidden' ]">
<div class="rebuy-widget-content">
<div class="rebuy-timer" v-if="hasTimer()">
<h5 class="rebuy-timer-title" v-if="config.language.timer_title">
<span v-html="config.language.timer_title"></span> <span class="rebuy-timer-minutes" v-html="config.timer.duration_minutes"></span>:<span class="rebuy-timer-seconds" v-html="config.timer.duration_seconds"></span>
</h5>
</div>
<div class="rebuy-dynamic-bundle-header" v-if="products.length > 0">
<div class="super-title" v-if="config.language.super_title != ''" v-html="config.language.super_title"></div>
<h2 class="primary-title" v-if="config.language.title != ''" v-html="config.language.title"></h2>
<div class="description" v-if="config.language.description != ''" v-html="config.language.description"></div>
</div>
<div class="rebuy-bundle">
<div class="rebuy-bundle__items"
v-bind:class="[products.length > 2 ? 'rebuy-bundle-items-many' : 'rebuy-bundle-items-duo']">
<div
v-for="(product, product_index) in products"
class="rebuy-product-block"
v-bind:class="[product.handle, 'product-id-' + product.id, cartHasProduct(product) ? 'cart-has-item' : '', productTagClasses(product), isInputProduct(product) ? 'is-input-product' : '' ,product.selected ? 'is-selected': '', variantAvailable(product.selected_variant) ? '' : 'rebuy-product-block--out-of-stock']"
>
<div class="rebuy-bundle-image">
<a class="rebuy-bundle__image-item bundle-single-image"
v-bind:href="learnMoreURL(product)"
v-bind:style="imageStyles"
v-on:click="learnMore(product);"
v-bind:class="[hasLearnMore() && !isInputProduct(product) ? 'clickable' : '' ]">
<img v-bind:src="itemImage(product, product.selected_variant)" v-bind:alt="product.title">
</a>
</div>
<div class="rebuy-product-info">
<div class="rebuy-product-title-info">
<div class="rebuy-product-badge">
<span v-if="product.selected_variant.metafields.custom.badge" v-html="product.selected_variant.metafields.custom.badge"></span>
</div>
<a class="rebuy-product-title" v-bind:href="learnMoreURL(product)" v-on:click="learnMore(product);" v-bind:class="[hasLearnMore() && !isInputProduct(product) ? 'clickable' : '']">
<h3 v-html="product.title"></h3>
</a>
<div class="rebuy-variant-title" v-if="showVariantTitle(product)" v-html="product.selected_variant.title"></div>
<div class="rebuy-product-description" v-if="showProductDescription(product)" v-html="text(product.body_html)"></div>
</div>
<div class="rebuy-product-review" v-if="hasProductReviews(product)">
<span class="rebuy-star-rating" aria-label="product star rating">
<span class="rebuy-star-rating-background"></span>
<span class="rebuy-star-rating-foreground" v-bind:style="{ width: productReviewRatingPercentage(product) }"></span>
</span>
<span class="rebuy-review-count" v-html="productReviewCount(product)"></span>
</div>
<div class="rebuy-product-options" v-if="showVariantSelect(product)">
<!--<div v-for="(option, option_index) in product.options" :key="'option-select-' + product.id + '-' + option.name" class="rebuy-product-option-select">
<select
class="rebuy-select"
:id="id + '-option-select-' + product_index + '-' + option_index"
@change="selectVariantByOption(product, option.name, $event.target.value)"
>
<option
v-for="(value, value_index) in filterOOSOptions(option, product)"
:key="'value-' + product.id + '-' + option.name + '-' + value_index"
:value="value"
:selected="hasSwatchOptionSelected(product, value, value_index, option.name)"
:disabled="isDisabledOptionValue(product, option.name, value)"
v-html="value"
></option>
</select>
</div>-->
<div
v-for="(option, option_index) in product.options"
:key="'option-select-' + product.id + '-' + option.name"
class="rebuy-product-option-select"
>
<!-- More than one value: show the select -->
<template v-if="filterOOSOptions(option, product).length > 1">
<select
class="rebuy-select"
:id="id + '-option-select-' + product_index + '-' + option_index"
@change="selectVariantByOption(product, option.name, $event.target.value)"
>
<option
v-for="(value, value_index) in filterOOSOptions(option, product)"
:key="'value-' + product.id + '-' + option.name + '-' + value_index"
:value="value"
:selected="hasSwatchOptionSelected(product, value, value_index, option.name)"
:disabled="isDisabledOptionValue(product, option.name, value)"
v-html="value"
></option>
</select>
</template>
<!-- Exactly one value: just display the text -->
<!--<template v-else-if="filterOOSOptions(option, product).length === 1">
<p class="rebuy-option-single-value" v-html="filterOOSOptions(option, product)[0]"></p>
</template>-->
<!-- Zero values (all OOS): render nothing, or a sold-out message -->
<!--<template v-else>
<p class="rebuy-option-sold-out"></p>
</template>-->
</div>
<div
class="rebuy-product-options__button-swatches-container"
:class="{ 'rebuy-style__hidden-block' : config.view_options.variant_selector === 'select' }"
>
<div
v-for="option in product.options"
:key="'option-' + product.id + '-' + option.name"
class="rebuy-product-options__button-swatches rebuy-size-swatches"
>
<div
v-for="(value, value_index) in filterOOSOptions(option, product)"
:key="'value-' + product.id + '-' + option.name + '-' + value + '-' + value_index"
>
<div v-if="displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-color-swatch">
<input
:name="id + '-color-' + product_index"
:id="id + '-color-' + product_index + '-' + value + '-' + value_index"
:checked="hasSwatchOptionSelected(product, value, value_index, 'color')"
:value="value"
type="radio"
class="rebuy-color-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-color-' + product_index + '-' + value + '-' + value_index"
:style="getMerchantThemeColorAssetStyle(value)"
:title="value"
class="rebuy-color-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
</label>
</div>
<div v-if="!displayColorSwatches(option)" class="rebuy-product-options__button-swatch rebuy-size-swatch">
<input
:name="id + '-' + option.name + '-' + product_index"
:id="id + '-' + option.name + '-' + product_index + '-' + value"
:checked="hasSwatchOptionSelected(product, value, value_index, option.name)"
:value="value"
type="radio"
class="rebuy-size-input hide"
v-on:change="selectVariantByOption(product, option.name, value)"
:disabled="isDisabledOptionValue(product, option.name, value)"
/>
<label
:for="id + '-' + option.name + '-' + product_index + '-' + value"
class="rebuy-size-label"
:class="{ 'rebuy-product-options__button-swatch-label--disabled' : isDisabledOptionValue(product, option.name, value) }"
>
</label>
</div>
</div>
</div>
</div>
</div>
<div class="rebuy-product-price">
<div v-if="variantOnSale(product, product.selected_variant)">
<span class="rebuy-money compare-at">
<span class="sr-only">Original price</span>
<span v-html="formatMoney(variantCompareAtPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-money sale">
<span class="sr-only">Sale price</span>
<span v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
</div>
<div v-if="!(variantOnSale(product, product.selected_variant))">
<span class="rebuy-money">
<span class="sr-only">Price</span>
<span v-html="formatMoney(variantPrice(product, product.selected_variant))"></span>
</span>
</div>
</div>
</div>
<div class="rebuy-product-checkbox" v-if="!bundleRequiresAllItems()">
<label class="rebuy-checkbox-label">
<span class="sr-only">
Select Ultimate Reset for bundle
</span>
<input
class="checkbox-input rebuy-checkbox"
v-model="product.selected"
type="checkbox"
:id="'checkbox-' + product.id" />
</label>
</div>
</div>
</div>
<div class="rebuy-bundle__actions" v-if="subtotal() > 0">
<div class="rebuy-bundle__actions-price">
<!--<strong
class="rebuy-bundle__actions-price-label"
v-if="metadata.custom.total_price_label"
v-html="metadata.custom.total_price_label">
</strong>
<strong
class="rebuy-bundle__actions-price-label"
v-else
v-html="config.language.total_price_label">
</strong> -->
<p class="rebuy-bundle__actions-price-value" v-if="bundleOnSale()">
<span class="rebuy-money compare-at">
<span class="sr-only">Original price</span>
<span v-html="formatMoney(compareAtSubtotal())"></span>
</span>
<span class="rebuy-money sale">
<span class="sr-only">Sale price</span>
<span v-html="formatMoney(subtotal())"></span>
</span>
</p>
<p class="rebuy-bundle__actions-price-value" v-if="!(bundleOnSale())">
<span class="rebuy-money">
<span class="sr-only">Total Price</span>
<span v-html="formatMoney(subtotal())"></span>
</span>
</p>
</div>
<div class="rebuy-bundle__actions-buttons">
<button
class="rebuy-button"
v-on:click="addSelectedProductsToCart()"
v-bind:disabled="isBundleIncomplete()"
type="button">
<span v-html="buttonWidgetLabel()"></span>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</script>
<script type="text/javascript">
function getRoundedSavingPercent(value) {
if (value == null || value === '') return '';
return `${Math.round(parseFloat(value))}%`;
}
</script>
<script id="rebuy-bundle-builder-template" type="text/template">
<div
class="rebuy-widget rebuy-bundle-builder"
v-bind:id="'rebuy-widget-' + id"
>
<div
class="rebuy-bundle-builder__main rebuy-bundle-builder-layout"
v-bind:class="['rebuy-bundle-builder__layout--' + config.layout.type]"
ref="stepTabsWrapper"
>
<!-- Page Header Section -->
<div v-if="hasBundleHeaderSection()" class="rebuy-bundle-builder__main-header">
<h1
v-if="getBundleConfigLabel('super_title')"
class="rebuy-bundle-builder__main-header-super-title"
v-html="getBundleConfigLabel('super_title')"
>
</h1>
<h2
v-if="getBundleConfigLabel('title')"
class="rebuy-bundle-builder__main-header-title"
v-html="getBundleConfigLabel('title')"
>
</h2>
<p
v-if="getBundleConfigLabel('description')"
class="rebuy-bundle-builder__main-header-description"
v-html="getBundleConfigLabel('description')"
>
</p>
</div>
<!-- /Page Header Section -->
<!-- Sorting and Filtering Section -->
<div
class="rebuy-bundle-builder__header-utility-container"
v-bind:class="[hasBundleFiltering() && hasBundleBuilderSorting() ? 'rebuy-bundle-builder__header-utility-container--space-between' : 'rebuy-bundle-builder__header-utility-container--end']"
>
<!-- Filter Section -->
<div v-if="hasBundleFiltering()" class="rebuy-bundle-builder__filter-section">
<div class="rebuy-bundle-builder__filter-trigger">
<button
type="button"
class="rebuy-bundle-builder__filter-trigger-button"
v-on:click.stop="toggleBundleFilterSection()"
v-bind:aria-expanded="is_filter_visible ? 'true' : 'false'"
aria-controls="rebuy-bundle-filter-section"
aria-label="Toggle product filters"
>
<span
class="rebuy-bundle-builder__filter-trigger-label"
v-html="getBundleConfigLabel('filter_title')">
</span>
<rebuy-icon
name="list-filter"
class="rebuy-icon-wrapper--inline"
></rebuy-icon>
</button>
</div>
<div
class="rebuy-bundle-builder__filter-flyout-overlay"
v-bind:class="[is_filter_visible && isBundleFilterFlyoutLayout() ? 'rebuy-bundle-builder__filter-flyout-overlay--active' : '']"
v-on:click="toggleBundleFilterSection()"
></div>
<div
id="rebuy-bundle-filter-section"
class="rebuy-bundle-builder__filter-panel"
v-bind:class="[getBundleFilterLayoutClass(), is_filter_visible ? 'rebuy-bundle-builder__filter-panel--active' : '']"
role="region"
aria-label="Product filters"
>
<button
type="button"
class="rebuy-bundle-builder__filter-panel-close"
v-on:click="toggleBundleFilterSection()"
aria-label="Close product filters"
>
<rebuy-icon name="x"></rebuy-icon>
</button>
<!-- Selected Filter Tags -->
<div
v-if="hasBundleFiltersActive() && shouldShowBundleSelectedFilters()"
class="rebuy-bundle-builder__filter-selected"
>
<div class="rebuy-bundle-builder__filter-selected-header">
<h4
class="rebuy-bundle-builder__filter-selected-title"
v-html="getBundleConfigLabel('filter_selected_Label')">
</h4>
<button
type="button"
class="rebuy-bundle-builder__filter-selected-reset"
v-on:click="clearBundleFilters()"
aria-label="Reset all filters"
v-html="getBundleConfigLabel('filter_reset_label')"
>
</button>
</div>
<div class="rebuy-bundle-builder__filter-selected-body">
<div
v-for="(item, item_index) in getSelectedBundleFilterItems()"
:key="item.key + '-' + item_index"
class="rebuy-bundle-builder__filter-selected-tag"
>
<span
class="rebuy-bundle-builder__filter-selected-tag-label"
v-html="item.label"
>
</span>
<button
type="button"
class="rebuy-bundle-builder__filter-selected-tag-remove"
v-bind:aria-label="'Remove ' + item.label + ' filter'"
v-on:click="handleRemovingBundleFilterItem(item.filterType, item.rawValue)"
>
<rebuy-icon name="x"></rebuy-icon>
</button>
</div>
</div>
</div>
<!-- Empty State -->
<div
v-if="!mapped_aggregated_filters || mapped_aggregated_filters.length === 0"
class="rebuy-bundle-builder__filter-empty"
v-html="getBundleConfigLabel('filter_no_results_label')"
></div>
<!-- Filter Groups -->
<ul
v-else
class="rebuy-bundle-builder__filter-list-container"
>
<li
v-for="(filter, filter_index) in mapped_aggregated_filters"
:key="filter.type + '-' + filter_index"
class="rebuy-bundle-builder__filter-panel-list-item"
>
<div
v-if="hasBundleFilterEnabled(filter)"
>
<div class="rebuy-bundle-builder__filter-list-header">
<button
class="rebuy-bundle-builder__filter-list-toggle"
type="button"
v-bind:aria-expanded="filter.isExpanded ? 'true' : 'false'"
v-bind:aria-label="filter.isExpanded ? 'Collapse ' + getBundleFilterName(filter) + ' filters' : 'Expand ' + getBundleFilterName(filter) + ' filters'"
v-on:click="handleToggleBundleFilterExpansion(filter, filter_index)"
>
<h4
class="rebuy-bundle-builder__filter-list-title"
v-html="getBundleFilterName(filter)"
></h4>
<div v-if="getBundleFilterDropDownStyle('plusMinus')">
<rebuy-icon v-if="filter.isExpanded" name="minus"></rebuy-icon>
<rebuy-icon v-else name="plus"></rebuy-icon>
</div>
<div v-if="getBundleFilterDropDownStyle('chevron')">
<rebuy-icon
v-bind:name="filter.isExpanded ? 'chevron-up' : 'chevron-down'"
></rebuy-icon>
</div>
</button>
</div>
<div
v-bind:class="[filter.isExpanded ? 'active' : '']"
class="rebuy-bundle-builder__filter-list-body"
>
<!-- Product Tags Filter -->
<ul
v-if="isBundleFilterType(filter, 'product-tags')"
class="rebuy-bundle-builder__filter-option rebuy-bundle-builder__filter-product-tags"
>
<li
v-for="(value, value_index) in filter.values"
:key="'tag-' + value_index + '-' + value.tags"
class="rebuy-bundle-builder__filter-option-list"
>
<input
:id="'rebuy-bundle-filter-tag-' + value.tags"
type="checkbox"
class="rebuy-checkbox"
:checked="hasSelectedBundleFilter('product-tags', value.tags)"
v-on:change="handleBundleFilterUpdate('product-tags', value.tags)"
/>
<label
:for="'rebuy-bundle-filter-tag-' + value.tags"
class="rebuy-bundle-builder__filter-option-checkbox-label"
>
<span class="rebuy-bundle-builder__filter-option-checkbox-label-text" v-html="formatTagValue(value.tags)"></span>
<span v-if="shouldShowBundleProductFilterCount()" class="rebuy-bundle-builder__filter-label" v-html="value.numProducts"></span>
</label>
</li>
</ul>
<!-- Product Vendor Filter -->
<ul
v-if="isBundleFilterType(filter, 'vendor')"
class="rebuy-bundle-builder__filter-option rebuy-bundle-builder__filter-vendor"
>
<li
v-for="(value, value_index) in filter.values"
:key="'vendor-' + value_index + '-' + value.vendorAsTag"
class="rebuy-bundle-builder__filter-option-list"
>
<input
:id="'rebuy-bundle-filter-vendor-' + value.vendorAsTag"
type="checkbox"
class="rebuy-checkbox"
:checked="hasSelectedBundleFilter('vendor', value.vendorAsTag)"
v-on:change="handleBundleFilterUpdate('vendor', value.vendorAsTag)"
/>
<label
:for="'rebuy-bundle-filter-vendor-' + value.vendorAsTag"
class="rebuy-bundle-builder__filter-option-checkbox-label"
>
<span class="rebuy-bundle-builder__filter-option-checkbox-label-text" v-html="value.vendorAsTag"></span>
<span v-if="shouldShowBundleProductFilterCount()" class="rebuy-bundle-builder__filter-label" v-html="value.numProducts"></span>
</label>
</li>
</ul>
<!-- Product Availability Filter -->
<ul
v-if="isBundleFilterType(filter, 'availability')"
class="rebuy-bundle-builder__filter-option rebuy-bundle-builder__filter-availability"
role="radiogroup"
aria-label="Filter by availability"
>
<li class="rebuy-bundle-builder__filter-option-list">
<label class="rebuy-radio-label">
<input
class="radio-input rebuy-radio"
v-on:click="handleBundleFilterUpdate('availability', 'available')"
:checked="hasSelectedBundleFilter('availability', 'available')"
v-bind:value="true"
type="radio"
name="rebuy-bundle-availability-filter"
v-bind:disabled="!hasInStockBundleAvailabilityFilter(filter.values)"
/>
<span
class="radio-label"
v-bind:class="[!hasInStockBundleAvailabilityFilter(filter.values) ? 'disabled' : '']"
>
<span class="rebuy-bundle-builder__filter-option-checkbox-label-text">Available</span>
<span
v-if="hasInStockBundleAvailabilityFilter(filter.values) && shouldShowBundleProductFilterCount()"
v-html="bundleAvailabilityFilterCount(filter.values, 'available')"
class="rebuy-bundle-builder__filter-label"
>
</span>
</span>
</label>
</li>
<li class="rebuy-bundle-builder__filter-option-list">
<label class="rebuy-radio-label">
<input
class="radio-input rebuy-radio"
v-on:click="handleBundleFilterUpdate('availability', 'soldOut')"
:checked="hasSelectedBundleFilter('availability', 'soldOut')"
v-bind:value="false"
type="radio"
name="rebuy-bundle-availability-filter"
v-bind:disabled="!hasSoldOutBundleAvailabilityFilter(filter.values)"
/>
<span
class="radio-label"
v-bind:class="[!hasSoldOutBundleAvailabilityFilter(filter.values) ? 'disabled' : '']"
>
<span class="rebuy-bundle-builder__filter-option-checkbox-label-text">Sold Out</span>
<span
v-if="hasSoldOutBundleAvailabilityFilter(filter.values) && shouldShowBundleProductFilterCount()"
v-html="bundleAvailabilityFilterCount(filter.values, 'soldOut')"
class="rebuy-bundle-builder__filter-label"
>
</span>
</span>
</label>
</li>
</ul>
<!-- Product Type Filter -->
<ul
v-if="isBundleFilterType(filter, 'product-type')"
class="rebuy-bundle-builder__filter-option rebuy-bundle-builder__filter-product-type"
>
<li
v-for="(value, value_index) in filter.values"
:key="'type-' + value_index + '-' + value.categories"
class="rebuy-bundle-builder__filter-option-list"
>
<input
:id="'rebuy-bundle-filter-product-type-' + value.categories"
type="checkbox"
class="rebuy-checkbox"
:checked="hasSelectedBundleFilter('product-type', value.categories)"
v-on:change="handleBundleFilterUpdate('product-type', value.categories)"
/>
<label
:for="'rebuy-bundle-filter-product-type-' + value.categories"
class="rebuy-bundle-builder__filter-option-checkbox-label"
>
<span class="rebuy-bundle-builder__filter-option-checkbox-label-text" v-html="value.categories"></span>
<span v-if="shouldShowBundleProductFilterCount()" class="rebuy-bundle-builder__filter-label" v-html="value.numProducts"></span>
</label>
</li>
</ul>
<!-- Product Price Filter -->
<div
v-if="isBundleFilterType(filter, 'price')"
class="rebuy-bundle-builder__filter-option rebuy-bundle-builder__filter-option--row rebuy-bundle-builder__filter-price"
>
<div class="rebuy-bundle-builder__filter-price-block">
<label
for="rebuy-bundle-filter-price-from"
v-html="shopCurrencySymbol()"
class="rebuy-bundle-builder__filter-price-label"
>
</label>
<input
id="rebuy-bundle-filter-price-from"
type="number"
class="rebuy-input rebuy-bundle-builder__filter-price-input"
placeholder="From"
v-bind:value="getBundleFilterPriceMin()"
min="0"
:max="getBundleFilterPriceMax()"
v-on:change="handleBundlePriceFilterChange('min', $event)"
/>
</div>
<div class="rebuy-bundle-builder__filter-price-dash">-</div>
<div class="rebuy-bundle-builder__filter-price-block">
<label
for="rebuy-bundle-filter-price-to"
v-html="shopCurrencySymbol()"
class="rebuy-bundle-builder__filter-price-label"
>
</label>
<input
id="rebuy-bundle-filter-price-to"
type="number"
class="rebuy-input rebuy-bundle-builder__filter-price-input"
placeholder="To"
v-bind:value="getBundleFilterPriceMax()"
:min="getBundleFilterPriceMin()"
v-on:change="handleBundlePriceFilterChange('max', $event)"
/>
</div>
</div>
</div>
</div>
</li>
</ul>
</div>
</div>
<!-- /Filter Section -->
<!-- Sorting Section -->
<div v-if="hasBundleBuilderSorting()" class="rebuy-bundle-builder__header-utility-sorting-container">
<select
aria-label="Sort By"
name="selected_sorting_option"
v-model="selected_sorting_option"
v-on:change="handleBundleBuilderSortingOptionChange"
class="rebuy-bundle-builder__header-utility-sorting rebuy-select"
>
<option disabled value="">Sort By</option>
<option v-for="option in sorting_options" :value="option.value" :key="option.value"></option>
</select>
</div>
<!-- /Sorting Section -->
</div>
<!-- /Sorting and Filtering Section -->
<!-- Page Body Section -->
<div class="rebuy-bundle-builder__main-body">
<!-- Steps Section -->
<div class="rebuy-bundle-builder__steps-container" role="list">
<!-- Step Tabs Section -->
<div v-if="isBundleBuilderTabLayout()" class="rebuy-bundle-builder__step-tabs rebuy-bundle-builder__step-tabs--sticky">
<div class="rebuy-bundle-builder__step-tabs-wrapper">
<div
v-for="(step, step_index) in config.steps"
class="rebuy-bundle-builder__step-tab"
v-bind:key="'rebuy-bundle-builder__step-tab-' + step_index"
v-bind:class="['rebuy-bundle-builder__step-tab-' + step_index, active_step_index === step_index ? 'active' : '']"
v-bind:aria-label="'Select step tab: ' + step.title"
role="button"
tabindex="0"
v-on:click="handleSelectingBundleStep(step_index)"
v-on:keydown.enter.space="handleSelectingBundleStep(step_index)"
>
<h3
v-if="step.title"
v-html="step.title"
class="rebuy-bundle-builder__step-tab-title">
</h3>
<p
v-if="step.description"
v-html="step.description"
class="rebuy-bundle-builder__step-tab-description">
</p>
</div>
</div>
<button
v-on:click="scrollToTargetBundleElement('main', id)"
class="rebuy-bundle-builder__scroll-to-button"
aria-label="scroll to top"
>
<rebuy-icon name="chevron-up"></rebuy-icon>
<span>Top</span>
</button>
</div>
<!-- /Step Tabs Section -->
<!-- Step Section -->
<div
v-for="(step, step_index) in config.steps"
class="rebuy-bundle-builder__step-container"
v-bind:key="'rebuy-bundle-builder__step-container-' + step_index"
v-bind:class="[
'rebuy-bundle-builder__step-container-' + step_index,
step.unlocked ? '' : 'locked',
isBundleBuilderCollapsibleLayout() ? 'rebuy-bundle-builder__step-container--collapsible' : '',
!shouldRenderBundleStep(step_index) ? 'rebuy-bundle-builder__step-container--not-active' : 'rebuy-bundle-builder__step-container--active'
]"
aria-label="step"
role="listitem"
>
<!-- Step Header Section -->
<div v-if="!isBundleBuilderTabLayout()" class="rebuy-bundle-builder__step-header">
<div class="rebuy-bundle-builder__step-header-copy-container">
<h2
v-if="step.title"
v-html="step.title"
class="rebuy-bundle-builder__step-header-title">
</h2>
<p
v-if="step.description"
v-html="step.description"
class="rebuy-bundle-builder__step-header-description">
</p>
</div>
<div class="rebuy-bundle-builder__step-header-actions">
<div v-if="isBundleBuilderCollapsibleLayout()">
<button
class="rebuy-bundle-builder__step-header-collapse-button"
v-on:click="handleCollapsingBundleStep(step_index)"
v-bind:aria-label="shouldRenderBundleStep(step_index) ? 'Collapse ' + step.title : 'Expand ' + step.title"
>
<rebuy-icon
:name="shouldRenderBundleStep(step_index) ? 'minus' : 'plus'"
class="rebuy-bundle-builder__step-header-collapse-button-icon">
</rebuy-icon>
</button>
</div>
<button
v-if="!isBundleBuilderCollapsibleLayout()"
v-on:click="scrollToTargetBundleElement('step', id, (step_index - (step_index === 0 ? 0 : 1)))"
:class="[
'rebuy-bundle-builder__scroll-to-button',
step_index === 0 ? 'rebuy-bundle-builder__top-button' : 'rebuy-bundle-builder__prev-button',
'rebuy-bundle-builder__step-button-' + step_index
]"
aria-label="scroll to top"
>
<rebuy-icon name="chevron-up"></rebuy-icon>
<span v-html="step_index === 0 ? 'Top' : 'Prev'"></span>
</button>
</div>
</div>
<!-- /Step Header Section -->
<!-- Step Body Section -->
<div
:role="hasBundleBuilderStepSplideCarousel(step) ? 'region' : 'list'"
:aria-roledescription="hasBundleBuilderStepSplideCarousel(step) ? 'carousel' : null"
:aria-label="hasBundleBuilderStepSplideCarousel(step) ? (step.title || 'Product carousel') : null"
class="rebuy-bundle-builder__step-body rebuy-product-grid start-column rebuy-product-grid-step-100"
:class="[getBundleBuilderLayoutClasses(step), 'rebuy-product-grid__step-' + step_index]"
>
<!-- Step Product Section -->
<div
v-for="(product, product_index) in step.products"
:class="[product.handle, 'product-id-' + product.id, productTagClasses(product), hasBundleBuilderStepSplideCarousel(step) ? 'splide__slide' : '']"
class="rebuy-product-block"
:aria-label="hasBundleBuilderStepSplideCarousel(step) ? (product.title || 'Product slide') : 'product'"
:aria-roledescription="hasBundleBuilderStepSplideCarousel(step) ? 'slide' : null"
:role="hasBundleBuilderStepSplideCarousel(step) ? 'group' : 'listitem'"
>
<div v-if="product.type !== 'placeholder'" class="rebuy-bundle-builder__step-product">
<!-- Product Image Section -->
<div class="rebuy-product-media">
<a
class="rebuy-product-image clickable"
v-bind:href="learnMoreURL(product)"
v-on:click="learnMore(product, $event);"
rel="nofollow"
>
<!-- Preload second img in the background hack, so on hover browser can serve the cached image -->
<img
v-if="product.hover_image"
class="rebuy-style__hidden-block"
v-bind:src="sizeImage(product.hover_image.src, '400x400')"
v-bind:alt="'View ' + product.title"
/>
<img
class="rebuy-style__hover-transition"
v-bind:loading="product_index > 1 ? 'lazy' : 'eager'"
v-bind:src="getBundleBuilderProductImage(product)"
v-bind:alt="'View ' + product.title"
v-on:mouseover="handleProductImageHover(product, true)"
v-on:mouseleave="handleProductImageHover(product, false)"
/>
</a>
</div>
<!-- /Product Image Section -->
<!-- Product Info Section -->
<div class="rebuy-product-info">
<h3 class="rebuy-product-title clickable">
<div class="rebuy-product-badge">
<span v-if="product.selected_variant?.metafields?.custom?.badge" v-html="product.selected_variant.metafields.custom.badge"></span>
</div>
<a
class="rebuy-product-title clickable"
v-bind:href="learnMoreURL(product)"
v-on:click="learnMore(product, $event);"
v-html="product.title"
v-bind:aria-label="'View ' + product.title"
rel="nofollow">
</a>
</h3>
<div
class="rebuy-variant-title"
v-html="product.selected_variant.title.toLowerCase() !== 'default title'
? product.selected_variant.title
: ''"
></div>
<div class="rebuy-product-review" v-if="hasProductReviews(product)" aria-label="product star rating">
<span class="rebuy-star-rating">
<span
v-if="product.reviews.star_rating"
class="rebuy-star-rating-value sr-only"
v-html="product.reviews.star_rating + ' stars out of 5 stars'"
>
</span>
<span class="rebuy-star-rating-background"></span>
<span class="rebuy-star-rating-foreground" v-bind:style="{ width: productReviewRatingPercentage(product) }"></span>
</span>
<span class="rebuy-review-count" v-html="productReviewCount(product)"></span>
</div>
<div
v-if="showProductDescription(product)"
class="rebuy-product-description rebuy-bundle-builder__product-description"
v-html="text(product.body_html)">
</div>
<div class="rebuy-product-price">
<div v-if="bundleVariantOnSale(product, product.selected_variant)">
<span class="rebuy-money sale">
<span class="sr-only">Sale price</span>
<span tabindex="0" v-html="formatMoney(bundleVariantPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-money compare-at">
<span class="sr-only">Original price</span>
<span v-html="formatMoney(bundleVariantCompareAtPrice(product, product.selected_variant))"></span>
</span>
</div>
<div v-if="!(bundleVariantOnSale(product, product.selected_variant))">
<span class="rebuy-money">
<span class="sr-only">Price</span>
<span tabindex="0" v-html="formatMoney(bundleVariantPrice(product, product.selected_variant))"></span>
</span>
</div>
</div>
</div>
<!-- /Product Info Section -->
<!-- Product Variant Selection Section (one dropdown per option, dynamic count) -->
<div class="rebuy-product-options rebuy-product-options--split" v-if="showVariantSelect(product)">
<template v-for="pos in (product.options ? product.options.length : 3)">
<div
v-if="product.variants.some(v => v['option' + pos])"
:key="id + '-optgroup-' + product_index + '-' + pos"
class="rebuy-product-options__group"
>
<select
:id="id + '-select-' + product_index + '-' + pos"
class="rebuy-select rebuy-product-options__select"
:aria-label="'Option ' + pos + ' of ' + product.title"
:value="product.selected_variant['option' + pos]"
v-on:change="
product.selected_variant_id = (
product.variants.find(v =>
v['option' + pos] === $event.target.value &&
Array.from({ length: (product.options ? product.options.length : 3) }, (_, k) => k + 1).every(p => p === pos || !product.selected_variant['option' + p] || v['option' + p] === product.selected_variant['option' + p])
)
|| product.variants.find(v => v['option' + pos] === $event.target.value)
|| product.selected_variant
).id;
selectVariant(product);
"
>
<option
v-for="val in product.variants.map(v => v['option' + pos]).filter((x, i, a) => x != null && x !== '' && a.indexOf(x) === i)"
:key="'optval-' + pos + '-' + val"
:value="val"
:disabled="!product.variants.filter(v => v['option' + pos] === val).some(v => variantAvailable(v))"
v-html="val"
></option>
</select>
</div>
</template>
</div>
<!-- /Product Variant Selection Section -->
<!-- Product CTA Section -->
<div class="rebuy-bundle-builder__product-actions rebuy-product-actions">
<button
v-if="hasProductQuickViewEnabled()"
v-on:click="openVariantModal(product, step, step_index)"
class="rebuy-button secondary rebuy-bundle-builder__product-quick-view"
v-html="getBundleConfigLabel('quick_view_label')"
>
</button>
<div class="rebuy-bundle-builder__product-quantity">
<div v-if="foundStepProductInBundleHolder(product.selected_variant_id, step_index)">
<div class="rebuy-bundle-builder__item-quantity-widget">
<button
class="rebuy-bundle-builder__item-quantity-widget-button"
v-on:click="removeLastAddedProductStep(product.selected_variant_id, step_index)"
v-bind:aria-label="'Decrease quantity of ' + product.title"
>
<rebuy-icon name="minus" class="rebuy-grey"></rebuy-icon>
</button>
<span
class="rebuy-bundle-builder__item-quantity-widget-label"
v-html="getBundleVariantQuantity(product.selected_variant_id, step_index)">
</span>
<button
class="rebuy-bundle-builder__item-quantity-widget-button"
v-on:click="addProductToBundle(product, step, step_index)"
v-bind:aria-label="'Increase quantity of ' + product.title"
v-bind:disabled="shouldDisableProductAddToBundle(product, step, step_index)"
>
<rebuy-icon name="plus" class="rebuy-grey"></rebuy-icon>
</button>
</div>
</div>
<button
v-if="!foundStepProductInBundleHolder(product.selected_variant_id, step_index)"
class="rebuy-button"
v-bind:disabled="shouldDisableProductAddToBundle(product, step, step_index)"
v-bind:aria-label="buttonAriaLabel(product)"
v-on:click="addProductToBundle(product, step, step_index)"
>
<span v-if="!variantAvailable(product.selected_variant)" v-html="getBundleConfigLabel('sold_out')"></span>
<span v-else v-html="getBundleConfigLabel('add_to_bundle', step)"></span>
</button>
</div>
</div>
<!-- /Product CTA Section -->
</div>
<!-- Product Skeleton Section -->
<div
v-if="product.type === 'placeholder'"
class="rebuy-bundle-builder__step-product-skeleton">
<span></span>
</div>
<!-- /Product Skeleton Section -->
</div>
<!-- /Step Product Section -->
</div>
<!-- /Step Body Section -->
</div>
<!-- /Step Section -->
</div>
<!-- /Steps Section -->
<!-- Product Group Section -->
<div
class="rebuy-bundle-builder__group-container"
v-bind:class="[has_container_expanded ? 'expanded' : 'default']">
<div class="rebuy-bundle-builder__group-container-inner">
<div class="rebuy-bundle-builder__group-container-header">
<div class="rebuy-bundle-builder__group-container-header--left">
<h3
class="rebuy-bundle-builder__group-container-header-title"
v-html="getBundleConfigLabel('bundle_container_title')"
>
</h3>
<span class="rebuy-bundle-builder__group-container-header-title-count">
<span
class="rebuy-bundle-builder__group-container-header-products_count"
v-html="getBundleContainerHeaderValue('products_count')">
</span>
<span class="rebuy-bundle-builder__group-container-header-divider">/</span>
<span
class="rebuy-bundle-builder__group-container-header-container-length"
v-html="getBundleContainerHeaderValue('container_length')">
</span>
</span>
</div>
<button
class="rebuy-bundle-builder__group-container-header-expand"
v-on:click="handleExpandingBundleContainer()"
:aria-label="hasBundleContainerExpanded() ? 'Collapse bundle container' : 'Expand bundle container'"
:aria-expanded="hasBundleContainerExpanded()"
>
<svg v-if="hasBundleContainerExpanded()" xmlns="http://www.w3.org/2000/svg" width="16" height="10" viewBox="0 0 14 8" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.183058 1.06689C-0.0610194 0.822815 -0.0610194 0.427087 0.183058 0.18301C0.416524 -0.050456 0.78874 -0.060607 1.03427 0.152557L1.06694 0.18301L6.575 5.6912L12.0831 0.18301C12.3165 -0.050456 12.6887 -0.060607 12.9343 0.152557L12.9669 0.18301C13.2004 0.416475 13.2106 0.788691 12.9974 1.03422L12.9669 1.06689L7.01694 7.01689C6.78348 7.25036 6.41126 7.26051 6.16573 7.04734L6.13306 7.01689L0.183058 1.06689Z" fill="#161819"/>
</svg>
<svg v-if="!hasBundleContainerExpanded()" xmlns="http://www.w3.org/2000/svg" width="16" height="10" viewBox="0 0 14 8" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.183058 6.13306C-0.0610194 6.37714 -0.0610194 6.77286 0.183058 7.01694C0.416524 7.25041 0.78874 7.26056 1.03427 7.04739L1.06694 7.01694L6.575 1.50875L12.0831 7.01694C12.3165 7.25041 12.6887 7.26056 12.9343 7.04739L12.9669 7.01694C13.2004 6.78348 13.2106 6.41126 12.9974 6.16573L12.9669 6.13306L7.01694 0.183058C6.78348 -0.0504074 6.41126 -0.060558 6.16573 0.152606L6.13306 0.183058L0.183058 6.13306Z" fill="#161819"/>
</svg>
</button>
</div>
<!-- Bundle Tier Progress Bar -->
<div class="rebuy-builder__progress-containew">
<div v-if="shouldDisplayBundleTierProgressBar()" class="rebuy-bundle-builder__group-container-progress-bar">
<div
class="rebuy-bundle-builder__group-progress-step-wrapper rebuy-bundle-builder__progress-step-wrapper"
v-bind:class="[ 'count-' + config.discount.tiers.length ]"
>
<div
v-for="(tier, tier_index) in config.discount.tiers"
class="rebuy-bundle-builder__progress-step"
v-bind:style="{ left: progressStepPosition(tier) }"
v-bind:class="[
progressTierReached(tier, products) ? 'complete' : '',
'rebuy-bundle-builder__progress-step--' + tier_index
]"
>
<div
class="rebuy-bundle-builder__progress-step-icon"
v-bind:class="[ 'rebuy-bundle-builder__progress-step-icon-type-' + getBundleTierProgressStepType(tier) ]"
>
<span
v-if="getBundleTierProgressStepType(tier) !== 'none'"
v-html="formatBundleTierValue(tier.discount_value, tier.discount_type)"
class="rebuy-bundle-builder__progress-step-value"
v-bind:class="[ 'rebuy-bundle-builder__progress-step-value-type--' + getBundleTierProgressStepType(tier) ]"
>
</span>
</div>
<span
class="rebuy-bundle-builder__progress-step-label"
v-html="formatBundleTierLabel(tier)">
</span>
</div>
</div>
<div class="rebuy-bundle-builder__progress-bar-wrapper">
<div
class="rebuy-bundle-builder__progress-bar-meter"
v-bind:class="[hasTierProgress(products) ? 'has-progress' : 'no-progress']">
<div
class="rebuy-bundle-builder__progress-bar-meter-fill"
v-bind:style="{ width: tiersPercentageComplete(config.discount.tiers, products) }"
role="progressbar"
tabindex="0"
aria-valuemin="0"
aria-valuemax="100"
:aria-valuenow="tiersPercentageCompleteNumeric(config.discount.tiers, products)"
aria-label="Bundle tier progress"
>
<span class="sr-only" v-html="'Bundle progress: ' + tiersPercentageComplete(config.discount.tiers, products) + ' complete'"></span>
</div>
</div>
</div>
</div>
</div>
<!-- /Bundle Tier Progress Bar -->
<!-- Bundle Gifts Selecting Section -->
<div v-if="isEligibleDiscountWithGift()" class="rebuy-bundle-builder__group-container-gifts">
<h3 class="rebuy-bundle-builder__gift-header" v-html="getBundleDiscountTierLabel('gift_header_message')"></h3>
<div
v-for="(product, product_index) in eligible_discount.gift_items"
v-if="product.data"
class="rebuy-bundle-builder__gift-product"
v-bind:key="'rebuy-bundle-builder-gift-product--' + product_index"
>
<div class="rebuy-bundle-builder__gift-product-image">
<img
v-bind:src="itemImage(product.data, product.data.selected_variant, '80x80')"
v-bind:alt="'View ' + product.data.title"
/>
</div>
<div class="rebuy-bundle-builder__gift-product-info-wrapper">
<div class="rebuy-bundle-builder__gift-product-info">
<h3 class="rebuy-bundle-builder__gift-product-title" v-html="product.data.title"></h3>
</div>
<div v-if="product.data.variants.length > 1" class="rebuy-product-options">
<select
:id="id + '-' + 'gift-select' + '-' + product_index"
class="rebuy-select rebuy-bundle-builder__gift-product-select"
v-bind:aria-label="'variant of ' + product.data.title"
v-model="product.data.selected_variant_id"
v-on:change="selectVariant(product.data)">
<option
v-for="variant in product.data.variants"
class="rebuy-product-options__option"
:class="{ 'rebuy-product-options__option--oos' : !variantAvailable(variant) }"
v-bind:value="variant.id"
:disabled="!variantAvailable(variant)"
v-html="formatVariantOptionTitle(variant)">
</option>
</select>
</div>
<div class="rebuy-bundle-builder__gift-product-actions">
<button
v-if="hasSelectedGiftProduct(product.data)"
class="rebuy-bundle-builder__gift-product-button rebuy-bundle-builder__gift-product-button--remove"
v-on:click="handleRemovingGiftProduct(product.data)"
:aria-label="'Remove gift: ' + product.data.title">
<rebuy-icon name="x"></rebuy-icon>
</button>
<button
v-if="!hasSelectedGiftProduct(product.data)"
class="rebuy-button rebuy-bundle-builder__gift-product-button rebuy-bundle-builder__gift-product-button--add"
v-on:click="handleAddingGiftProduct(product.data)">
<span v-html="getBundleConfigLabel('select_gift')"></span>
</button>
</div>
</div>
</div>
</div>
<!-- /Bundle Gifts Selecting Section -->
<!-- Bundle Products Section -->
<div class="rebuy-builder_fill-container">
<div
class="rebuy-bundle-builder__group-container-body"
v-bind:class="[has_container_expanded ? 'expanded' : 'default']">
<div
class="rebuy-bundle-builder__group-container-body-items"
role="list"
tabindex="0"
aria-label="Selected bundle products"
>
<div
v-for="(product, product_index) in bundleProducts"
class="rebuy-bundle-builder__product-holder"
:aria-label="product.title || 'Bundle product'"
role="listitem"
>
<div
v-if="product.classification === 'placeholder'"
class="rebuy-bundle-builder__product-holder-template"
>
<div class="rebuy-bundle-builder__product-sign-holder">
<span class="rebuy-bundle-builder__product-holder-icon">
<rebuy-icon name="plus"></rebuy-icon>
</span>
</div>
<div class="rebuy-bundle-builder__product-holder-detail">
<h3
class="rebuy-bundle-builder__product-holder-detail-title"
v-html="getBundleConfigLabel('select_product')">
</h3>
<p
v-if="product.label"
class="rebuy-bundle-builder__product-holder-detail-description"
v-html="product.label">
</p>
</div>
</div>
<div v-if="!product.classification" class="rebuy-bundle-builder__product-holder-data">
<div class="rebuy-bundle-builder__product-holder-info--left">
<!-- Product Image Section -->
<div class="rebuy-bundle-builder__product-holder-media rebuy-product-media">
<img
v-bind:src="itemImage(product, product.selected_variant, '160x160')"
v-bind:alt="'View ' + product.title"
/>
</div>
<!-- /Product Image Section -->
<!-- Product Info Section -->
<div class="rebuy-bundle-builder__product-holder-info rebuy-product-info">
<h3 class="rebuy-bundle-builder__product-holder-info-title rebuy-product-title" v-html="product.title"></h3>
<p
v-if="!shouldHideDefaultVariantTitle(product)"
class="rebuy-bundle-builder__product-holder-info-variant rebuy-variant-title"
v-html="(() => {
const title = product.selected_variant.title.split(' / ').join(', ');
return title.toLowerCase() !== 'default title' ? title : '';
})() "
>
</p>
<div class="rebuy-bundle-builder__product-holder-info-price rebuy-product-price">
<div v-if="bundleVariantOnSale(product, product.selected_variant, true)">
<span class="rebuy-money compare-at">
<span class="sr-only">Original price</span>
<span v-html="formatMoney(bundleVariantCompareAtPrice(product, product.selected_variant))"></span>
</span>
<span class="rebuy-money sale">
<span class="sr-only">Sale price</span>
<span tabindex="0" v-html="formatMoney(bundleVariantPrice(product, product.selected_variant))"></span>
</span>
<div
v-if="isFixedDiscountBundle()"
class="rebuy-bundle-builder__fixed-discount-line-item-message"
v-html="getBundleConfigLabel('fixed_tier_discount')">
</div>
</div>
<div v-if="!(bundleVariantOnSale(product, product.selected_variant, true))">
<span class="rebuy-money">
<span class="sr-only">Price</span>
<span tabindex="0" v-html="formatMoney(bundleVariantPrice(product, product.selected_variant))"></span>
</span>
</div>
</div>
</div>
</div>
<div class="rebuy-bundle-builder__product-holder-info--right">
<button
class="rebuy-bundle-builder__product-holder-info-delete"
v-on:click="handleRemovingProductFromBundle(product_index)"
:aria-label="'Remove ' + product.title + ' from bundle'"
>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path d="M9.82667 6.00035L9.596 12.0003M6.404 12.0003L6.17333 6.00035M10.5 3.59568C11.2758 3.65574 12.0492 3.74403 12.8187 3.86035C13.0467 3.89501 13.2733 3.93168 13.5 3.97101M12.8187 3.86035L12.1067 13.1157C12.0776 13.4925 11.9074 13.8445 11.63 14.1012C11.3527 14.3579 10.9886 14.5005 10.6107 14.5003H5.38933C5.0114 14.5005 4.64735 14.3579 4.36999 14.1012C4.09262 13.8445 3.92239 13.4925 3.89333 13.1157L3.18133 3.86035M3.18133 3.86035C2.95333 3.89435 2.72667 3.93101 2.5 3.97035M3.18133 3.86035C3.95076 3.74403 4.72416 3.65575 5.5 3.59568M10.5 3.59568V2.98501C10.5 2.19835 9.89333 1.54235 9.10667 1.51768C8.36908 1.49411 7.63092 1.49411 6.89333 1.51768C6.10667 1.54235 5.5 2.19901 5.5 2.98501V3.59568M10.5 3.59568C8.83581 3.46707 7.16419 3.46707 5.5 3.59568" stroke="black" stroke-width="1.125" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
<!-- /Product Info Section -->
</div>
</div>
</div>
<!-- /Bundle Products Section -->
<!-- Total Savings Amount -->
<div
v-if="hasBundleBuilderTotalSavingsEnabled() && getBundleTotalSavingAmount(products) > 0"
class="rebuy-bundle-builder__total-savings-container">
<span class="rebuy-bundle-builder__total-savings-label">
Total Savings:
</span>
<span
class="rebuy-bundle-builder__total-savings-amount rebuy-money sale"
v-html="formatMoney(getBundleTotalSavingAmount(products))">
</span>
</div>
<!-- /Total Savings Amount -->
<!-- Subscription Options Section -->
<div v-if="hasSellingPlansIntervalList()">
<div v-if="hasSelectedEnabledBundleSubscription()" class="rebuy-bundle-builder__subscription-options">
<!-- Subscription Radio Box -->
<div
class="rebuy-bundle-builder__action-box-cta rebuy-bundle-builder__action-box-subscription"
v-bind:class="[!hasSellingPlansIntervalList() ? 'rebuy-bundle-builder__action-box-cta--disabled' : '' ]">
<div class="rebuy-bundle-builder__action-box-top">
<label class="rebuy-radio-label">
<input
class="radio-input rebuy-radio rebuy-bundle-builder__action-box-radio"
v-model="selected_purchase_type"
value="subscription"
type="radio"
v-bind:disabled="!hasSellingPlansIntervalList()"
/>
<span
class="rebuy-bundle-builder__action-box-label"
v-html="getBundleConfigLabel('switch_to_subscription_title')"
>
</span>
</label>
<div class="rebuy-bundle-builder__action-box-price">
<span v-if="bundleHasEligibleDiscount(products) || getSubBundleSubtotalSavingPercent(products)">
<span class="rebuy-money compare-at">
<span class="sr-only">Original subtotal price</span>
<span v-html="formatMoney(getBundleSubtotal(products))"></span>
</span>
<span class="rebuy-money sale">
<span class="sr-only">Sale subtotal price</span>
<span tabindex="0" v-html="formatMoney(getSubBundleDiscountedSubtotal(products))"></span>
</span>
</span>
<span v-if="!getSubBundleSubtotalSavingPercent(products) && (!bundleHasEligibleDiscount(products) && getBundleSubtotal(products))" class="rebuy-money sale">
<span class="sr-only">Subtotal price</span>
<span tabindex="0" v-html="formatMoney(getBundleSubtotal(products))"></span>
</span>
</div>
</div>
<div class="rebuy-bundle-builder__action-box-bottom">
<p
v-if="getBundleConfigLabel('switch_to_subscription_description')"
class="rebuy-bundle-builder__action-box-description"
v-html="getBundleConfigLabel('switch_to_subscription_description')">
</p>
<div v-if="hasSellingPlansIntervalList()" class="rebuy-bundle-builder__action-box-details">
<select
id="rebuy-bundle-builder-subscription-interval"
class="rebuy-select rebuy-bundle-builder__action-box-select"
v-model="selected_interval"
v-on:change="handleSubscriptionIntervalChange($event)"
aria-label="Select subscription delivery interval"
>
<option
v-for="(interval, interval_index) in selling_plan_interval_list"
v-bind:key="'rebuy-bundle-builder-subscription-interval--' + interval_index"
v-bind:value="interval"
v-html="interval"
>
</option>
</select>
<span v-if="getBundleConfigLabel('save_label') && getSubBundleSubtotalSavingPercent(products)" class="rebuy-bundle-builder__action-box-saving">
<span v-html="getBundleConfigLabel('save_label')"></span>
<span v-html="getRoundedSavingPercent(getSubBundleSubtotalSavingPercent(products))"></span>
</span>
</div>
<p
v-if="hasExcludedBundleDiscountEnabled() && getBundleConfigLabel('excluded_bundle_discount_text')"
class="rebuy-bundle-builder__action-box-note"
v-html="getBundleConfigLabel('excluded_bundle_discount_text')">
</p>
</div>
</div>
<!-- /Subscription Radio Box -->
<!-- One-time Radio Box -->
<div v-if="!hasBundleBuilderSubscriptionOnlyEnabled()" class="rebuy-bundle-builder__action-box-cta rebuy-bundle-builder__action-box-subscription">
<div class="rebuy-bundle-builder__action-box-top">
<label class="rebuy-radio-label">
<input
class="radio-input rebuy-radio rebuy-bundle-builder__action-box-radio"
v-model="selected_purchase_type"
value="one-time"
type="radio"
/>
<span
v-if="getBundleConfigLabel('one_time_title')"
class="rebuy-bundle-builder__action-box-label"
v-html="getBundleConfigLabel('one_time_title')"
>
</span>
</label>
<div class="rebuy-bundle-builder__action-box-price">
<span v-if="bundleHasEligibleDiscount()">
<span class="rebuy-money compare-at">
<span class="sr-only">Original subtotal price</span>
<span v-html="formatMoney(getBundleSubtotal(products))"></span>
</span>
<span class="rebuy-money sale">
<span class="sr-only">Sale subtotal price</span>
<span tabindex="0" v-html="formatMoney(getBundleDiscountedSubtotal(products))"></span>
</span>
</span>
<span v-if="!bundleHasEligibleDiscount() && getBundleSubtotal(products)" class="rebuy-money sale">
<span class="sr-only">Subtotal price</span>
<span tabindex="0" v-html="formatMoney(getBundleSubtotal(products))"></span>
</span>
</div>
</div>
<div class="rebuy-bundle-builder__action-box-bottom">
<p
v-if="getBundleConfigLabel('one_time_description')"
class="rebuy-bundle-builder__action-box-description"
v-html="getBundleConfigLabel('one_time_description')">
</p>
</div>
</div>
<!-- /One-time Order Radio Box -->
</div>
</div>
</div>
</div>
<!-- /Subscription Options Section -->
<!-- Add to Cart Section -->
<div class="rebuy-bundle-builder__group-container-action">
<div class="rebuy-bundle-builder__cta-container">
<button
v-if="hasBundleBuilderAddToCartButton()"
class="rebuy-button"
:class="[hasBundleBuilderAccelerateCheckout() ? 'secondary' : '']"
v-on:click="addSelectedProductsToCart()"
v-bind:disabled="shouldDisableAddBundleToCart(products)"
aria-label="Add all selected products to cart"
>
<span v-html="buttonWidgetLabel()"></span>
<span v-if="!hasSelectedEnabledBundleSubscription()">
<span v-if="bundleHasEligibleDiscount()">
<span class="rebuy-money sale">
<span class="sr-only">Sale subtotal price</span>
<span tabindex="0" v-html="formatMoney(getBundleDiscountedSubtotal(products))"></span>
</span>
<span class="rebuy-money compare-at">
<span class="sr-only">Original subtotal price</span>
<span v-html="formatMoney(getBundleSubtotal(products))"></span>
</span>
</span>
<span v-if="!bundleHasEligibleDiscount() && getBundleSubtotal(products)" class="rebuy-money sale">
<span class="sr-only">Subtotal price</span>
<span tabindex="0" v-html="formatMoney(getBundleSubtotal(products))"></span>
</span>
</span>
</button>
<button
v-if="hasBundleBuilderAccelerateCheckout()"
class="rebuy-button"
v-on:click="addSelectedProductsToCheckout()"
v-bind:disabled="shouldDisableAddBundleToCart(products)"
aria-label="Add all selected products to checkout"
>
<span v-html="getBundleBuilderCTAButtonLabel('checkout')"></span>
<span v-if="!hasSelectedEnabledBundleSubscription()">
<span v-if="bundleHasEligibleDiscount()">
<span class="rebuy-money sale">
<span class="sr-only">Sale subtotal price</span>
<span tabindex="0" v-html="formatMoney(getBundleDiscountedSubtotal(products))"></span>
</span>
<span class="rebuy-money compare-at">
<span class="sr-only">Original subtotal price</span>
<span v-html="formatMoney(getBundleSubtotal(products))"></span>
</span>
</span>
<span v-if="!bundleHasEligibleDiscount() && getBundleSubtotal(products)" class="rebuy-money sale">
<span class="sr-only">Subtotal price</span>
<span tabindex="0" v-html="formatMoney(getBundleSubtotal(products))"></span>
</span>
</span>
</button>
</div>
</div>
</div>
<!-- /Add to Cart Section -->
</div>
<!-- /Product Group Section -->
</div>
<!-- /Body Section -->
</div>
<div
v-if="has_container_expanded"
class="rebuy-bundle-builder__full-screen-background rebuy-full-screen__background"
v-on:click="handleExpandingBundleContainer()">
</div>
</div>
</script>
<script>
var customer = {};
</script><!-- BEGIN app block: shopify://apps/redirects-by-shopkit/blocks/redirects/cef9e0c4-4559-4f25-9851-70338bce1224 -->
<script>
const redirects = [{"from":"https://shop.bodi.com/products/2b-mindset","to":"https://www.bodi.com/us/en/s/nutrition-plan/2b-mindset","id":"45653775"},{"from":"https://shop.bodi.com/products/portion-fix","to":"https://www.bodi.com/us/en/s/nutrition-plan/portion-fix","id":"44886058"},{"from":"https://shop.bodi.com/products/belle-vitale-kit","to":"https://www.bodi.com/us/en/s/fitness/belle-vitale","id":"93813512"},{"from":"https://shop.bodi.com/products/2b-mindset","to":"https://www.bodi.com/us/en/s/nutrition-plan/2b-mindset","id":"16791640"},{"from":"https://shop.bodi.com/products/shaker-cup-free-gift?variant=47683217260761","to":"https://shop.bodi.com/products/shakeology-shaker-cup","id":"64644761"},{"from":"https://shop.bodi.com/products/p90x-subscription?selling_plan=5807931609&variant=47743666028761","to":"https://www.bodi.com/us/en/s/fitness/p90x-generation-next","id":"51046181"},{"from":"https://shop.bodi.com/products/shaun-t-subscription?selling_plan=5785354457&variant=47683215589593","to":"https://www.bodi.com/us/en/s/fitness/shaun-t-subscription","id":"49106168"},{"from":"https://shop.bodi.com/products/10-minute-bodi-subscription?selling_plan=5847744729&variant=47683212837081","to":"https://www.bodi.com/us/en/s/fitness/10-minute-subscription","id":"01721179"},{"from":"https://shop.bodi.com/products/autumn-calabrese-subscription?selling_plan=5785321689&variant=47683213361369","to":"https://www.bodi.com/us/en/s/fitness/autumn-calabrese-subscription","id":"64326959"},{"from":"https://shop.bodi.com/products/shaker-cup-free-gift","to":"https://shop.bodi.com/products/shakeology-shaker-cup","id":"64760407"},{"from":"https://shop.bodi.com/products/free-bodi-subscription","to":"https://shop.bodi.com/products/bodi-subscription","id":"14864279"},{"from":"https://shop.bodi.com/products/portion-fix?variant=47683215163609","to":"https://www.bodi.com/us/en/s/nutrition-plan/portion-fix","id":"25849344"},{"from":"https://shop.bodi.com/products/4-week-gut-protocol?variant=47683213033689","to":"https://www.bodi.com/us/en/s/nutrition-plan/4-week-gut-protocol","id":"14363889"},{"from":"https://shop.bodi.com/products/2b-mindset?variant=47683212968153","to":"https://www.bodi.com/us/en/s/nutrition-plan/2b-mindset","id":"72884450"},{"from":"https://shop.bodi.com/products/belle-vitale-kit?variant=47683213459673","to":"https://www.bodi.com/us/en/s/fitness/belle-vitale","id":"38261171"},{"from":"https://shop.bodi.com/products/p90x-subscription","to":"https://www.bodi.com/us/en/s/fitness/p90x-generation-next","id":"15040904"},{"from":"https://shop.bodi.com/products/10-minute-bodi-subscription","to":"https://www.bodi.com/us/en/s/fitness/10-minute-subscription","id":"58145524"},{"from":"https://shop.bodi.com/products/autumn-calabrese-subscription","to":"https://www.bodi.com/us/en/s/fitness/autumn-calabrese-subscription","id":"10318127"},{"from":"https://shop.bodi.com/products/shaun-t-subscription","to":"https://www.bodi.com/us/en/s/fitness/shaun-t-subscription","id":"50839828"}]
const foundRedirect = redirects.find(redirect => {
const isPathName = redirect.from.startsWith("/");
if (isPathName) {
return redirect.from === window.location.pathname;
}
try {
return new URL(redirect.from).toString() === new URL(window.location.href).toString();
} catch (e) {}
return redirect.from === window.location.href;
});
if (foundRedirect) {
document.querySelector('html').style.display = 'none';
window.location.href = foundRedirect.to;
}
</script><!-- END app block --><!-- BEGIN app block: shopify://apps/tt-breadcrumbs-seo-schema/blocks/ttSchema/dda6b26d-4f1a-43c6-a94b-6443ed0f750b -->
<!-- BEGIN app snippet: remove-script --><!-- END app snippet -->
<!-- BEGIN app snippet: carousel -->
<!-- END app snippet -->
<!-- END app block --><!-- BEGIN app block: shopify://apps/yoast-seo/blocks/metatags/7c777011-bc88-4743-a24e-64336e1e5b46 -->
<!-- This site is optimized with Yoast SEO for Shopify -->
<title>Ultimate Reset | 3-week healthy cleanse program | BODi</title>
<meta name="description" content="A comprehensive set of six supplements and a no-starvation meal plan will help you feel invigorated and lose weight in 21 days.*" />
<link rel="canonical" href="https://shop.bodi.com/products/ultimate-reset-cleanse" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" />
<meta property="og:site_name" content="BODi" />
<meta property="og:url" content="https://shop.bodi.com/products/ultimate-reset-cleanse" />
<meta property="og:locale" content="en_US" />
<meta property="og:type" content="product" />
<meta property="og:title" content="Ultimate Reset | 3-week healthy cleanse program | BODi" />
<meta property="og:description" content="A comprehensive set of six supplements and a no-starvation meal plan will help you feel invigorated and lose weight in 21 days.*" />
<meta property="og:image" content="https://shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737" />
<meta property="og:image:height" content="2648" />
<meta property="og:image:width" content="2648" />
<meta property="og:availability" content="backorder" />
<meta property="product:availability" content="available for order" />
<meta property="product:condition" content="new" />
<meta property="product:price:amount" content="149.96" />
<meta property="product:price:currency" content="USD" />
<meta property="product:retailer_item_id" content="MDSUCLN2101" />
<meta property="og:price:standard_amount" content="199.95" />
<meta name="twitter:card" content="summary_large_image" />
<script type="application/ld+json" id="yoast-schema-graph">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://shop.bodi.com/#/schema/organization/1",
"url": "https://shop.bodi.com",
"name": "BODi by Beachbody",
"logo": {
"@id": "https://shop.bodi.com/#/schema/ImageObject/38915357442265"
},
"image": [
{
"@id": "https://shop.bodi.com/#/schema/ImageObject/38915357442265"
}
],
"sameAs": ["https:\/\/www.instagram.com\/bodi","https:\/\/youtube.com\/beachbody","https:\/\/www.facebook.com\/BODi"]
},
{
"@type": "ImageObject",
"@id": "https://shop.bodi.com/#/schema/ImageObject/38915357442265",
"caption": "BODi logo",
"inLanguage": "en",
"width": 480,
"height": 480,
"url": "https:\/\/shop.bodi.com\/cdn\/shop\/files\/bodilogo.jpg?v=1773075845",
"contentUrl": "https:\/\/shop.bodi.com\/cdn\/shop\/files\/bodilogo.jpg?v=1773075845"
},
{
"@type": "WebSite",
"@id": "https://shop.bodi.com/#/schema/website/1",
"url": "https://shop.bodi.com",
"name": "BODi by Beachbody",
"potentialAction": {
"@type": "SearchAction",
"target": "https://shop.bodi.com/search?q={search_term_string}",
"query-input": "required name=search_term_string"
},
"publisher": {
"@id": "https://shop.bodi.com/#/schema/organization/1"
},
"inLanguage": "en"
},
{
"@type": "ItemPage",
"@id": "https:\/\/shop.bodi.com\/products\/ultimate-reset-cleanse",
"name": "Ultimate Reset | 3-week healthy cleanse program | BODi",
"description": "A comprehensive set of six supplements and a no-starvation meal plan will help you feel invigorated and lose weight in 21 days.*",
"datePublished": "2025-12-02T08:12:00-08:00",
"breadcrumb": {
"@id": "https:\/\/shop.bodi.com\/products\/ultimate-reset-cleanse\/#\/schema\/breadcrumb"
},
"primaryImageOfPage": {
"@id": "https://shop.bodi.com/#/schema/ImageObject/38840057069785"
},
"image": [{
"@id": "https://shop.bodi.com/#/schema/ImageObject/38840057069785"
}],
"isPartOf": {
"@id": "https://shop.bodi.com/#/schema/website/1"
},
"url": "https:\/\/shop.bodi.com\/products\/ultimate-reset-cleanse"
},
{
"@type": "ImageObject",
"@id": "https://shop.bodi.com/#/schema/ImageObject/38840057069785",
"caption": "Ultimate Reset cleanse",
"inLanguage": "en",
"width": 2648,
"height": 2648,
"url": "https:\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-ultimate-reset-en-us.png?v=1772479737",
"contentUrl": "https:\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-ultimate-reset-en-us.png?v=1772479737"
},
{
"@type": "BreadcrumbList",
"@id": "https:\/\/shop.bodi.com\/products\/ultimate-reset-cleanse\/#\/schema\/breadcrumb",
"itemListElement": [
{
"@type": "ListItem",
"name": "BODi",
"item": "https:\/\/shop.bodi.com",
"position": 1
},
{
"@type": "ListItem",
"name": "Ultimate Reset",
"position": 2
}
]
}
]}
</script>
<!--/ Yoast SEO -->
<!-- END app block --><!-- BEGIN app block: shopify://apps/hreflang-manager/blocks/gwa-hreflang/35dc0b05-d599-4c8e-8584-8cd17768854a --><!-- BEGIN app snippet: gwa-hreflang-product --><link rel="alternate" hreflang="x-default" href="https://shop.bodi.com/products/ultimate-reset-cleanse"><link rel="alternate" hreflang="en-US" href="https://shop.bodi.com/products/ultimate-reset-cleanse"><!-- END app snippet -->
<!-- END app block --><!-- BEGIN app block: shopify://apps/bloomreach-loomi-ai/blocks/unified-tracking-script/019beafc-b2ba-790d-9ed1-850d869fc572 -->
<!-- BEGIN app snippet: bloomreach-analytics-publish --><script>
/**
* Publishes an event to Shopify.analytics with retry logic.
* Waits for Shopify.analytics to become available before publishing.
*
* @param {string} eventName - The name of the event to publish
* @param {object} eventData - The data payload for the event
*/
window.bloomreachPublishEvent = function(eventName, eventData) {
const maxAttempts = 100; // Max 10 seconds (100 * 100ms)
let attempts = 0;
function tryPublish() {
if (typeof Shopify !== "undefined" && Shopify.analytics && typeof Shopify.analytics.publish === "function") {
Shopify.analytics.publish(eventName, eventData);
} else if (attempts < maxAttempts) {
attempts++;
setTimeout(tryPublish, 100);
} else {
console.error('[Bloomreach Unified Tracking] Shopify.analytics object is not available');
}
}
tryPublish();
};
</script>
<!-- END app snippet -->
<!-- BEGIN app snippet: bloomreach-consent-gate --><script>
(function() {
const LOG_PREFIX = '[Bloomreach Unified Tracking]';
const POLL_INTERVAL_MS = 100;
const MAX_POLL_ATTEMPTS = 100;
let trackingInitialized = false;
let consentListenerRegistered = false;
function isBloomreachTrackingConsentGranted() {
const privacy = window.Shopify && window.Shopify.customerPrivacy;
if (!privacy) {
return false;
}
return typeof privacy.analyticsProcessingAllowed === 'function'
&& typeof privacy.marketingAllowed === 'function'
&& typeof privacy.saleOfDataAllowed === 'function'
&& privacy.analyticsProcessingAllowed()
&& privacy.marketingAllowed()
&& privacy.saleOfDataAllowed();
}
function waitForCustomerPrivacy(onReady, onTimeout) {
let attempts = 0;
function tryLoadPrivacyApi() {
if (typeof window.Shopify === 'undefined'
|| typeof window.Shopify.loadFeatures !== 'function') {
if (attempts < MAX_POLL_ATTEMPTS) {
attempts++;
setTimeout(tryLoadPrivacyApi, POLL_INTERVAL_MS);
return;
}
if (onTimeout) {
onTimeout();
}
return;
}
window.Shopify.loadFeatures(
[{ name: 'consent-tracking-api', version: '0.1' }],
function(error) {
if (error) {
if (onTimeout) {
onTimeout();
}
return;
}
onReady();
},
);
}
tryLoadPrivacyApi();
}
function tryInitialize(initializeFn, config) {
if (trackingInitialized) {
return;
}
if (!isBloomreachTrackingConsentGranted()) {
return;
}
if (typeof window.initializeDiscoveryCookie === 'function') {
window.initializeDiscoveryCookie();
}
trackingInitialized = true;
initializeFn(config);
}
window.runWhenBloomreachTrackingAllowed = function(startFn, config, loadFn) {
if (typeof loadFn === 'function') {
loadFn(config);
}
function onPrivacyApiReady() {
tryInitialize(startFn, config);
if (!consentListenerRegistered) {
consentListenerRegistered = true;
document.addEventListener('visitorConsentCollected', function() {
tryInitialize(startFn, config);
});
}
}
function onPrivacyApiUnavailable() {
console.error(LOG_PREFIX + ' Customer Privacy API unavailable');
}
waitForCustomerPrivacy(onPrivacyApiReady, onPrivacyApiUnavailable);
};
})();
</script>
<!-- END app snippet -->
<script>
// Publish localization data to the web pixel extension
window.bloomreachPublishEvent("bre.localization", {
country: "US",
language: "en"
});
window.bloomreachPublishEvent("bre.feature_flags", {});
window.bloomreachPublishEvent("bre.discovery_config", {
test_data: false,
debug: false
});
</script>
<!-- BEGIN app snippet: bloomreach-br-uid-2-cookie --><script>
(function() {
const BR_UID_2_COOKIE_NAME = '_br_uid_2';
const BR_UID_2_VERSION = 'app';
const BR_UID_2_COOKIE_MAX_AGE_SECONDS = 60 * 60 * 24 * 365 * 2;
function decodeBrUid2CookieValue(value) {
try {
return decodeURIComponent(value);
} catch (error) {
return value;
}
}
function generateBrUid2Uid() {
return String(Math.round(Math.random() * 10e12));
}
function formatBrUid2CookieValue(uid, version, timestamp, hitCount) {
return 'uid=' + uid + ':v=' + version + ':ts=' + timestamp + ':hc=' + hitCount;
}
function generateBrUid2CookieValue(hitCount) {
return formatBrUid2CookieValue(
generateBrUid2Uid(),
BR_UID_2_VERSION,
Date.now(),
hitCount
);
}
function parseBrUid2CookieValue(value) {
const segments = decodeBrUid2CookieValue(value).split(':');
let uid;
let version;
let timestamp;
let hitCount;
for (let i = 0; i < segments.length; i++) {
const segment = segments[i];
if (segment.indexOf('uid=') === 0) {
uid = segment.slice(4);
} else if (segment.indexOf('v=') === 0) {
version = segment.slice(2);
} else if (segment.indexOf('ts=') === 0) {
timestamp = parseInt(segment.slice(3), 10);
} else if (segment.indexOf('hc=') === 0) {
hitCount = parseInt(segment.slice(3), 10);
}
}
if (!uid || !version || isNaN(timestamp) || isNaN(hitCount) || hitCount < 0) {
return null;
}
return {
uid: uid,
version: version,
timestamp: timestamp,
hitCount: hitCount
};
}
function getBrUid2CookieValue() {
const cookiePrefix = BR_UID_2_COOKIE_NAME + '=';
const cookies = document.cookie.split('; ');
for (let i = 0; i < cookies.length; i++) {
if (cookies[i].indexOf(cookiePrefix) === 0) {
return decodeBrUid2CookieValue(cookies[i].substring(cookiePrefix.length));
}
}
return null;
}
function getBaseDomain(host) {
if (!host) {
return '';
}
const parts = host.split('.');
const length = parts.length;
// Handle cases like 'localhost', 'example.com', '192.168.1.1'
if (length <= 2 || /^\d+\.\d+\.\d+\.\d+$/.test(host)) {
return host;
}
return parts[length - 1].length <= 2 && parts[length - 2].length <= 3
? parts.slice(-3).join('.')
: parts.slice(-2).join('.');
}
function buildBrUid2CookieString(value, domain) {
const cookieParts = [
BR_UID_2_COOKIE_NAME + '=' + encodeURIComponent(value),
'path=/',
'max-age=' + BR_UID_2_COOKIE_MAX_AGE_SECONDS,
'SameSite=Lax'
];
if (domain) {
cookieParts.push('domain=' + domain);
}
return cookieParts.join('; ');
}
function setBrUid2CookieValue(value) {
const baseDomain = getBaseDomain(location.hostname);
document.cookie = buildBrUid2CookieString(value, baseDomain);
if (getBrUid2CookieValue() !== value) {
document.cookie = buildBrUid2CookieString(value, null);
}
}
function ensureBrUid2Cookie() {
const existingValue = getBrUid2CookieValue();
if (existingValue) {
const parsed = parseBrUid2CookieValue(existingValue);
if (parsed) {
return existingValue;
}
}
const createdValue = generateBrUid2CookieValue(1);
setBrUid2CookieValue(createdValue);
return createdValue;
}
window.initializeDiscoveryCookie = function() {
const discoveryCookie = ensureBrUid2Cookie();
if (typeof window.bloomreachPublishEvent === 'function') {
window.bloomreachPublishEvent('bre.discovery_cookie', { cookie: discoveryCookie });
}
};
})();
</script>
<!-- END app snippet -->
<script>
const trackingConfig = {
brweb: {
target: "https:\/\/us3-api.eng.bloomreach.com",
stream_id: "f9028d13-b0b2-4507-aec0-0fe71ad180a1",
data_layer: true,
track: {
default_properties: {
customer_locale: "en-US"
}
, visits: false
},
customConfigRaw: "{\n \"track\": {\n \"google_analytics\": false,\n \"visits\": false \n },\n \"webOptimization\": {\n \"experiments\": true,\n \"tagManager\": true,\n \"webLayers\": true\n }\n}"
},
customer: {
},
metadata: null,
deferredEvents: [
{
name: "product_viewed_custom",
data: {
product_id: 9413928616153,
title: "Ultimate Reset",
price: "149.96",
vendor: "bodi-us-prod",
brand: "bodi-us-prod",
variant_id: 47683217391833,
tags: ["cleanses","Supplement","targetedsupplements","UltimateReset"],
available: true,
stock_level: -1477,
variant_inventory: -1477
}
},
]
};
function buildBrwebInitConfig(config) {
const brwebBaseConfig = Object.assign({}, config.brweb);
const customConfigRaw = brwebBaseConfig.customConfigRaw;
delete brwebBaseConfig.customConfigRaw;
let customConfigOverrides = {};
try {
if (customConfigRaw && customConfigRaw.trim() !== '') {
customConfigOverrides = JSON.parse(customConfigRaw);
}
} catch (e) {
console.error('[Bloomreach Unified Tracking] Invalid JSON in Custom Configuration, ignoring: ' + e.message);
}
return Object.assign({}, brwebBaseConfig, customConfigOverrides);
}
function loadBloomreachSdk(config) {
const brwebInitConfig = buildBrwebInitConfig(config);
!function(e,t,n,i,o,r){const s=4e3,c="xnpe_async_hide";function a(e){if("number"!=typeof e)return e;const t=new Date;return new Date(t.getTime()+1e3*e)}function m(e){return e.reduce((function(e,t){return e[t]=function(){e._.push([t.toString(),arguments])},e}),{_:[]})}function p(e,t,n){const i=n.createElement(t);i.src=e;const o=n.getElementsByTagName(t)[0];return o.parentNode.insertBefore(i,o),i}function l(e){return"[object Date]"===Object.prototype.toString.call(e)}r.target=r.target||"https://api.exponea.com",r.file_path=r.file_path||r.target+"/js/brweb.min.js",o[t]=m(["anonymize","initialize","identify","getSegments","update","track","trackLink","trackEnhancedEcommerce","getHtml","showHtml","showBanner","showWebLayer","ping","getAbTest","loadDependency","getRecommendation","reloadWebLayers","_preInitialize","_initializeConfig","metadata"]),o[t].notifications=m(["isAvailable","isSubscribed","subscribe","unsubscribe"]),o[t].segments=m(["subscribe"]),o[t]["snippetVersion"]="v3.1.1",function(e,t,n,i){e[i]={sdk:e[n],sdkObjectName:n,skipExperiments:!!t.new_experiments,path:t.target,streamId:t.stream_id}}(o,r,t,i),function(e,t,n){p(e.file_path,t,n)}(r,n,e),function(e,t,n,i,o,r,m,u){if(!e.new_experiments)return;!0===e.new_experiments&&(e.new_experiments={});const f=e.new_experiments.hide_class||c,d=e.new_experiments.timeout||s,_=encodeURIComponent(r.location.href);let g;e.cookies&&e.cookies.expires&&("number"==typeof e.cookies.expires||l(e.cookies.expires)?g=a(e.cookies.expires):e.cookies.expires.tracking&&("number"==typeof e.cookies.expires.tracking||l(e.cookies.expires.tracking))&&(g=a(e.cookies.expires.tracking))),g&&g<new Date&&(g=void 0);const k=e.target+"/webxp/streams/"+e.stream_id+"/"+t+"/"+(u.exec(m.cookie)||[0,"new"])[1]+"/modifications.min.js?http-referer="+_+"&timeout="+d+"ms"+(g?"&cookie-expires="+Math.floor(g.getTime()/1e3):"");"sync"===e.new_experiments.mode&&r.localStorage.getItem("__exponea__sync_modifications__")?function(e,t,n,i,o){n[o][t]="<"+t+' src="'+e+'"></'+t+">",i.writeln(n[o][t]),i.writeln("<"+t+">!"+o+".init && document.writeln("+o+"."+t+'.replace("/'+t+'/", "/'+t+'-async/").replace("><", " async><"))</'+t+">")}(k,t,r,m,n):function(e,t,n,i,o,r,s,c){r.documentElement.classList.add(e);const a=p(n,i,r);function m(){o[c].init||p(n.replace("/"+i+"/","/"+i+"-async/"),i,r)}function l(){r.documentElement.classList.remove(e)}a.onload=m,a.onerror=m,o.setTimeout(l,t),o[s]._revealPage=l}(f,d,k,t,r,m,o,n)}(r,n,i,0,t,o,e,RegExp("__exponea_etc__"+"=([\\w-]+)")),function(e,t,n){var i;e[t]._initializeConfig(n),(null===(i=n.experimental)||void 0===i?void 0:i.non_personalized_weblayers)&&e[t]._preInitialize(n),e[t].start=function(i){i&&Object.keys(i).forEach((e=>n[e]=i[e])),e[t].initialize(n)}}(o,t,r)}(document,"brweb","script","webxpClient",window, brwebInitConfig);
window.exponea = brweb;
}
function startBloomreachTracking(config) {
window.dataLayer = window.dataLayer || [];
function subscribeCookieListener(dataLayer) {
dataLayer.forEach(processDatalayerEvent);
const originalPush = dataLayer.push;
dataLayer.push = function() {
originalPush.apply(dataLayer, arguments);
Array.from(arguments).forEach(processDatalayerEvent);
};
}
function processDatalayerEvent(event) {
if (event.event === "bre.cookie") {
Shopify.analytics.publish("bre.cookie", event);
}
}
subscribeCookieListener(window.dataLayer);
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
var cookie = undefined;
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
cookie = c.substring(name.length, c.length);
break;
}
}
cookie = decodeURIComponent(cookie);
cookie = cookie.split('?')[0];
return cookie;
}
var customer = Object.assign({}, config.customer);
var cart_id = getCookie('cart');
if (cart_id) customer.cart_id = cart_id;
exponea.start({
customer: customer
});
if (config.metadata) {
exponea.metadata(config.metadata);
}
/**
* Quick View Tracking
* Listens for clicks on native Shopify quick-add-component elements.
* Only tracks when clicking a button[type="button"] (opens modal).
* Ignores button[type="submit"] (direct add to cart).
*/
(function() {
document.addEventListener('click', function(event) {
const quickAddComponent = event.target.closest('quick-add-component');
if (!quickAddComponent) return;
const clickedButton = event.target.closest('button');
if (!clickedButton || clickedButton.type !== 'button') return;
const productForm = quickAddComponent.querySelector('product-form-component');
const productId = productForm?.getAttribute('data-product-id');
if (!productId) return;
const variantInput = quickAddComponent.querySelector('input[name="id"]');
window.bloomreachPublishEvent('bre.quick_view', {
product_id: productId,
title: quickAddComponent.getAttribute('data-product-title') || '',
variant_id: variantInput?.value || ''
});
});
})();
config.deferredEvents.forEach(function(event) {
window.bloomreachPublishEvent(event.name, event.data);
});
}
runWhenBloomreachTrackingAllowed(startBloomreachTracking, trackingConfig, loadBloomreachSdk);
</script>
<!-- END app block --><!-- BEGIN app block: shopify://apps/judge-me-reviews/blocks/judgeme_core/61ccd3b1-a9f2-4160-9fe9-4fec8413e5d8 --><!-- Start of Judge.me Core -->
<link rel="dns-prefetch" href="https://cdn.judge.me">
<link rel="dns-prefetch" href="https://cdn1.judge.me">
<link rel="dns-prefetch" href="https://api.judge.me">
<script data-cfasync='false' class='jdgm-settings-script'>window.jdgmSettings={"pagination":5,"disable_web_reviews":true,"coupon_receiving_condition":"any_review","coupon_value_type":"percentage","coupon_value_percentage":10,"coupon_value_fixed_amount":0,"coupon_discount_type":"single","coupon_tier_text_enabled":false,"coupon_tier_text_percentage":10,"coupon_tier_text_fixed_amount":0,"coupon_tier_photo_enabled":false,"coupon_tier_photo_percentage":10,"coupon_tier_photo_fixed_amount":0,"coupon_tier_video_enabled":false,"coupon_tier_video_percentage":10,"coupon_tier_video_fixed_amount":0,"enable_coupons":false,"badge_no_review_text":"No reviews","badge_n_reviews_text":"{{ average_rating_1_decimal }}","badge_star_color":"#26262C","hide_badge_preview_if_no_reviews":true,"badge_hide_text":false,"enforce_center_preview_badge":false,"widget_title":"What our customers say","widget_open_form_text":"Write a review","widget_close_form_text":"Cancel review","widget_refresh_page_text":"Refresh page","widget_summary_text":"Based on {{ number_of_reviews }} review/reviews","widget_no_review_text":"Be the first to write a review","widget_name_field_text":"Display name","widget_verified_name_field_text":"Verified Name (public)","widget_name_placeholder_text":"Display name","widget_required_field_error_text":"This field is required.","widget_email_field_text":"Email address","widget_verified_email_field_text":"Verified Email (private, can not be edited)","widget_email_placeholder_text":"Your email address","widget_email_field_error_text":"Please enter a valid email address.","widget_rating_field_text":"Rating","widget_review_title_field_text":"Review Title","widget_review_title_placeholder_text":"Give your review a title","widget_review_body_field_text":"Review content","widget_review_body_placeholder_text":"Start writing here...","widget_pictures_field_text":"Picture/Video (optional)","widget_submit_review_text":"Submit Review","widget_submit_verified_review_text":"Submit Verified Review","widget_submit_success_msg_with_auto_publish":"Thank you! Please refresh the page in a few moments to see your review. You can remove or edit your review by logging into \u003ca href='https://judge.me/login' target='_blank' rel='nofollow noopener'\u003eJudge.me\u003c/a\u003e","widget_submit_success_msg_no_auto_publish":"Thank you! Your review will be published as soon as it is approved by the shop admin. You can remove or edit your review by logging into \u003ca href='https://judge.me/login' target='_blank' rel='nofollow noopener'\u003eJudge.me\u003c/a\u003e","widget_show_default_reviews_out_of_total_text":"Showing {{ n_reviews_shown }} out of {{ n_reviews }} reviews.","widget_show_all_link_text":"Show all","widget_show_less_link_text":"Show less","widget_author_said_text":"{{ reviewer_name }} said:","widget_days_text":"{{ n }} days ago","widget_weeks_text":"{{ n }} week/weeks ago","widget_months_text":"{{ n }} month/months ago","widget_years_text":"{{ n }} year/years ago","widget_yesterday_text":"Yesterday","widget_today_text":"Today","widget_replied_text":"\u003e\u003e {{ shop_name }} replied:","widget_read_more_text":"Read more","widget_reviewer_name_as_initial":"","widget_rating_filter_color":"#fbcd0a","widget_rating_filter_see_all_text":"See all reviews","widget_sorting_most_recent_text":"Most Recent","widget_sorting_highest_rating_text":"Highest Rating","widget_sorting_lowest_rating_text":"Lowest Rating","widget_sorting_with_pictures_text":"Only Pictures","widget_sorting_most_helpful_text":"Most Helpful","widget_open_question_form_text":"Ask a question","widget_reviews_subtab_text":"Reviews","widget_questions_subtab_text":"Questions","widget_question_label_text":"Question","widget_answer_label_text":"Answer","widget_question_placeholder_text":"Write your question here","widget_submit_question_text":"Submit Question","widget_question_submit_success_text":"Thank you for your question! We will notify you once it gets answered.","widget_star_color":"#26262C","verified_badge_text":"Verified","verified_badge_bg_color":"","verified_badge_text_color":"","verified_badge_placement":"left-of-reviewer-name","widget_review_max_height":"","widget_hide_border":false,"widget_social_share":false,"widget_thumb":false,"widget_review_location_show":false,"widget_location_format":"","all_reviews_include_out_of_store_products":true,"all_reviews_out_of_store_text":"(out of store)","all_reviews_pagination":100,"all_reviews_product_name_prefix_text":"about","enable_review_pictures":true,"enable_question_anwser":false,"widget_theme":"default","review_date_format":"mm/dd/yyyy","default_sort_method":"most-recent","enable_ai_review_visibility":true,"widget_product_reviews_subtab_text":"Product Reviews","widget_shop_reviews_subtab_text":"Shop Reviews","widget_other_products_reviews_text":"Reviews for other products","widget_store_reviews_subtab_text":"Store reviews","widget_product_variant_reference_text":"Review for","widget_no_store_reviews_text":"This store hasn't received any reviews yet","widget_web_restriction_product_reviews_text":"This product hasn't received any reviews yet","widget_no_items_text":"No items found","widget_show_more_text":"Show more","widget_write_a_store_review_text":"Write a Store Review","widget_product_and_store_reviews_text":"Product and store reviews","widget_reviews_in_collection_text":"Reviews in this collection","widget_other_languages_heading":"Reviews in Other Languages","widget_translate_review_text":"Translate review to {{ language }}","widget_translating_review_text":"Translating...","widget_show_original_translation_text":"Show original ({{ language }})","widget_translate_review_failed_text":"Review couldn't be translated.","widget_translate_review_retry_text":"Retry","widget_translate_review_try_again_later_text":"Try again later","show_product_url_for_grouped_product":false,"widget_sorting_pictures_first_text":"Pictures First","show_pictures_on_all_rev_page_mobile":false,"show_pictures_on_all_rev_page_desktop":false,"floating_tab_hide_mobile_install_preference":false,"floating_tab_button_name":"★ Reviews","floating_tab_title":"Let customers speak for us","floating_tab_button_color":"","floating_tab_button_background_color":"","floating_tab_url":"","floating_tab_url_enabled":false,"floating_tab_tab_style":"text","all_reviews_text_badge_text":"Customers rate us {{ shop.metafields.judgeme.all_reviews_rating | round: 1 }}/5 based on {{ shop.metafields.judgeme.all_reviews_count }} reviews.","all_reviews_text_badge_text_branded_style":"{{ shop.metafields.judgeme.all_reviews_rating | round: 1 }} out of 5 stars based on {{ shop.metafields.judgeme.all_reviews_count }} reviews","is_all_reviews_text_badge_a_link":false,"show_stars_for_all_reviews_text_badge":false,"all_reviews_text_badge_url":"","all_reviews_text_style":"branded","all_reviews_text_color_style":"judgeme_brand_color","all_reviews_text_color":"#108474","all_reviews_text_show_jm_brand":false,"featured_carousel_show_header":true,"featured_carousel_title":"Let customers speak for us","testimonials_carousel_title":"Customers are saying","videos_carousel_title":"Real customer stories","cards_carousel_title":"Customers are saying","featured_carousel_count_text":"from {{ n }} reviews","featured_carousel_add_link_to_all_reviews_page":false,"featured_carousel_url":"","featured_carousel_show_images":true,"featured_carousel_autoslide_interval":5,"featured_carousel_arrows_on_the_sides":false,"featured_carousel_height":250,"featured_carousel_width":80,"featured_carousel_image_size":0,"featured_carousel_image_height":250,"featured_carousel_arrow_color":"#eeeeee","verified_count_badge_style":"branded","verified_count_badge_orientation":"horizontal","verified_count_badge_color_style":"judgeme_brand_color","verified_count_badge_color":"#108474","is_verified_count_badge_a_link":false,"verified_count_badge_url":"","verified_count_badge_show_jm_brand":true,"widget_rating_preset_default":5,"widget_first_sub_tab":"product-reviews","widget_show_histogram":true,"widget_histogram_use_custom_color":false,"widget_pagination_use_custom_color":false,"widget_star_use_custom_color":false,"widget_verified_badge_use_custom_color":false,"widget_write_review_use_custom_color":false,"picture_reminder_submit_button":"Upload Pictures","enable_review_videos":true,"mute_video_by_default":true,"widget_sorting_videos_first_text":"Videos First","widget_review_pending_text":"Pending","featured_carousel_items_for_large_screen":3,"social_share_options_order":"Facebook,Twitter","remove_microdata_snippet":true,"disable_json_ld":false,"enable_json_ld_products":false,"preview_badge_show_question_text":false,"preview_badge_no_question_text":"No questions","preview_badge_n_question_text":"{{ number_of_questions }} question/questions","qa_badge_show_icon":false,"qa_badge_position":"same-row","remove_judgeme_branding":false,"widget_add_search_bar":false,"widget_search_bar_placeholder":"Search","widget_sorting_verified_only_text":"Verified only","widget_sorting_most_relevant_text":"Most Relevant","featured_carousel_theme":"default","featured_carousel_show_rating":true,"featured_carousel_show_title":true,"featured_carousel_show_body":true,"featured_carousel_show_date":false,"featured_carousel_show_reviewer":true,"featured_carousel_show_product":false,"featured_carousel_header_background_color":"#108474","featured_carousel_header_text_color":"#ffffff","featured_carousel_name_product_separator":"reviewed","featured_carousel_full_star_background":"#108474","featured_carousel_empty_star_background":"#dadada","featured_carousel_vertical_theme_background":"#f9fafb","featured_carousel_verified_badge_enable":true,"featured_carousel_verified_badge_color":"#108474","featured_carousel_border_style":"round","featured_carousel_review_line_length_limit":3,"featured_carousel_more_reviews_button_text":"Read more reviews","featured_carousel_view_product_button_text":"View product","all_reviews_page_load_reviews_on":"scroll","all_reviews_page_load_more_text":"Load More Reviews","disable_fb_tab_reviews":false,"enable_ajax_cdn_cache":false,"widget_advanced_speed_features":5,"widget_public_name_text":"displayed publicly like","default_reviewer_name":"John Smith","default_reviewer_name_has_non_latin":true,"widget_reviewer_anonymous":"Anonymous","medals_widget_title":"Judge.me Review Medals","medals_widget_background_color":"#f9fafb","medals_widget_position":"footer_all_pages","medals_widget_border_color":"#f9fafb","medals_widget_verified_text_position":"left","medals_widget_use_monochromatic_version":false,"medals_widget_elements_color":"#108474","show_reviewer_avatar":true,"widget_invalid_yt_video_url_error_text":"Not a YouTube video URL","widget_max_length_field_error_text":"Please enter no more than {0} characters.","widget_show_country_flag":false,"widget_show_collected_via_shop_app":true,"widget_verified_by_shop_badge_style":"light","widget_verified_by_shop_text":"Verified by Shop","widget_show_photo_gallery":false,"widget_load_with_code_splitting":true,"widget_ugc_install_preference":false,"widget_ugc_title":"Made by us, Shared by you","widget_ugc_subtitle":"Tag us to see your picture featured in our page","widget_ugc_arrows_color":"#ffffff","widget_ugc_primary_button_text":"Buy Now","widget_ugc_primary_button_background_color":"#108474","widget_ugc_primary_button_text_color":"#ffffff","widget_ugc_primary_button_border_width":"0","widget_ugc_primary_button_border_style":"none","widget_ugc_primary_button_border_color":"#108474","widget_ugc_primary_button_border_radius":"25","widget_ugc_secondary_button_text":"Load More","widget_ugc_secondary_button_background_color":"#ffffff","widget_ugc_secondary_button_text_color":"#108474","widget_ugc_secondary_button_border_width":"2","widget_ugc_secondary_button_border_style":"solid","widget_ugc_secondary_button_border_color":"#108474","widget_ugc_secondary_button_border_radius":"25","widget_ugc_reviews_button_text":"View Reviews","widget_ugc_reviews_button_background_color":"#ffffff","widget_ugc_reviews_button_text_color":"#108474","widget_ugc_reviews_button_border_width":"2","widget_ugc_reviews_button_border_style":"solid","widget_ugc_reviews_button_border_color":"#108474","widget_ugc_reviews_button_border_radius":"25","widget_ugc_reviews_button_link_to":"judgeme-reviews-page","widget_ugc_show_post_date":true,"widget_ugc_max_width":"800","widget_rating_metafield_value_type":true,"widget_primary_color":"#208468","widget_enable_secondary_color":false,"widget_secondary_color":"#edf5f5","widget_summary_average_rating_text":"{{ average_rating }} out of 5","widget_media_grid_title":"Customer photos \u0026 videos","widget_media_grid_see_more_text":"See more","widget_round_style":false,"widget_show_product_medals":false,"widget_verified_by_judgeme_text":"Verified by Judge.me","widget_show_store_medals":true,"widget_verified_by_judgeme_text_in_store_medals":"Verified by Judge.me","widget_media_field_exceed_quantity_message":"Sorry, we can only accept {{ max_media }} for one review.","widget_media_field_exceed_limit_message":"{{ file_name }} is too large, please select a {{ media_type }} less than {{ size_limit }}MB.","widget_review_submitted_text":"Review Submitted!","widget_question_submitted_text":"Question Submitted!","widget_close_form_text_question":"Cancel","widget_write_your_answer_here_text":"Write your answer here","widget_enabled_branded_link":true,"widget_show_collected_by_judgeme":false,"widget_reviewer_name_color":"","widget_write_review_text_color":"","widget_write_review_bg_color":"","widget_collected_by_judgeme_text":"collected by Judge.me","widget_pagination_type":"standard","widget_load_more_text":"Load More","widget_load_more_color":"#108474","widget_full_review_text":"Full Review","widget_read_more_reviews_text":"Read More Reviews","widget_read_questions_text":"Read Questions","widget_questions_and_answers_text":"Questions \u0026 Answers","widget_verified_by_text":"Verified by","widget_verified_text":"Verified","widget_number_of_reviews_text":"{{ number_of_reviews }} reviews","widget_back_button_text":"Back","widget_next_button_text":"Next","widget_custom_forms_filter_button":"Filters","custom_forms_style":"horizontal","widget_show_review_information":false,"how_reviews_are_collected":"How reviews are collected?","widget_show_review_keywords":false,"widget_gdpr_statement":"How we use your data: We'll only contact you about the review you left, and only if necessary. By submitting your review, you agree to Judge.me's \u003ca href='https://judge.me/terms' target='_blank' rel='nofollow noopener'\u003eterms\u003c/a\u003e, \u003ca href='https://judge.me/privacy' target='_blank' rel='nofollow noopener'\u003eprivacy\u003c/a\u003e and \u003ca href='https://judge.me/content-policy' target='_blank' rel='nofollow noopener'\u003econtent\u003c/a\u003e policies.","widget_multilingual_sorting_enabled":false,"widget_translate_review_content_enabled":false,"widget_translate_review_content_method":"manual","popup_widget_review_selection":"automatically_with_pictures","popup_widget_round_border_style":true,"popup_widget_show_title":true,"popup_widget_show_body":true,"popup_widget_show_reviewer":false,"popup_widget_show_product":true,"popup_widget_show_pictures":true,"popup_widget_use_review_picture":true,"popup_widget_show_on_home_page":true,"popup_widget_show_on_product_page":true,"popup_widget_show_on_collection_page":true,"popup_widget_show_on_cart_page":true,"popup_widget_position":"bottom_left","popup_widget_first_review_delay":5,"popup_widget_duration":5,"popup_widget_interval":5,"popup_widget_review_count":5,"popup_widget_hide_on_mobile":true,"review_snippet_widget_round_border_style":true,"review_snippet_widget_card_color":"#FFFFFF","review_snippet_widget_text_color":"#000000","review_snippet_widget_lighter_text_color":"#7B7B7B","review_snippet_widget_slider_arrows_background_color":"#FFFFFF","review_snippet_widget_slider_arrows_color":"#000000","review_snippet_widget_star_color":"#208468","show_product_variant":false,"all_reviews_product_variant_label_text":"Variant: ","widget_show_verified_branding":true,"widget_ai_summary_title":"Customers say","widget_ai_summary_disclaimer":"AI-powered review summary based on recent customer reviews","widget_show_ai_summary":false,"widget_show_ai_summary_bg":false,"write_review_button_visibility":"no_one","store_summary_widget_heading":"Customers rate this store","store_summary_widget_button_text":"View customer reviews","store_summary_widget_button_theme_text":"See AI reviews summary","widget_show_review_title_input":false,"widget_autofill_review_title":true,"redirect_reviewers_invited_via_email":"external_form","request_store_review_after_product_review":true,"request_review_other_products_in_order":true,"review_form_color_scheme":"default","review_form_corner_style":"square","review_form_star_color":"#208468","review_form_text_color":"#333333","review_form_background_color":"#ffffff","review_form_field_background_color":"#fafafa","review_form_button_color":"#208468","review_form_button_text_color":"#ffffff","review_form_modal_overlay_color":"#000000","review_form_theme":"multi_step","review_form_location":"in_store_popup","review_form_external_page_background_color":"#C5F7F0","review_content_screen_title_text":"How would you rate this product?","review_content_introduction_text":"We would love it if you would share a bit about your experience.","store_review_form_title_text":"How would you rate this store?","store_review_form_introduction_text":"We would love it if you would share a bit about your experience.","show_review_guidance_text":true,"one_star_review_guidance_text":"Poor","five_star_review_guidance_text":"Great","customer_information_screen_title_text":"About you","customer_information_introduction_text":"Please tell us more about you.","custom_questions_screen_title_text":"Your experience in more detail","custom_questions_introduction_text":"Here are a few questions to help us understand more about your experience.","review_submitted_screen_title_text":"Thanks for your review!","review_submitted_screen_thank_you_text":"We are processing it and it will appear on the store soon.","review_submitted_screen_email_verification_text":"Please confirm your email by clicking the link we just sent you. This helps us keep reviews authentic.","confirm_email_screen_title_text":"Confirm your email","confirm_email_screen_message_text":"To help keep reviews authentic, we'll send you a secure link to continue writing your review. It only takes a moment.","check_email_screen_title_text":"Check your email","check_email_screen_message_text":"We sent you an email to {{ email }}. Click the button on the email to continue.","check_email_screen_resend_message_text":"Email resent!","check_email_resend_hint_text":"Didn't get the email? Check your spam folder or [resend the email].","verification_email_rate_limit_error_text":"You've reached the limit for review attempts on this product. Please check your inbox or try again later.","review_submitted_request_store_review_text":"Would you like to share your experience of shopping with us?","review_submitted_review_other_products_text":"Would you like to review these products?","store_review_screen_title_text":"Would you like to share your experience of shopping with us?","store_review_introduction_text":"We value your feedback and use it to improve. Please share any thoughts or suggestions you have.","reviewer_media_screen_title_picture_text":"Share a picture","reviewer_media_introduction_picture_text":"Upload a photo to support your review.","reviewer_media_screen_title_video_text":"Share a video","reviewer_media_introduction_video_text":"Upload a video to support your review.","reviewer_media_screen_title_picture_or_video_text":"Share a picture or video","reviewer_media_introduction_picture_or_video_text":"Upload a photo or video to support your review.","reviewer_media_youtube_url_text":"Paste your Youtube URL here","advanced_settings_next_step_button_text":"Next","advanced_settings_close_review_button_text":"Close","modal_write_review_flow":true,"write_review_flow_required_text":"Required","write_review_flow_privacy_message_text":"We respect your privacy.","write_review_flow_anonymous_text":"Post review as anonymous","write_review_flow_visibility_text":"This won't be visible to other customers.","write_review_flow_multiple_selection_help_text":"Select as many as you like","write_review_flow_single_selection_help_text":"Select one option","write_review_flow_required_field_error_text":"This field is required","write_review_flow_invalid_email_error_text":"Please enter a valid email address","write_review_flow_max_length_error_text":"Max. {{ max_length }} characters.","write_review_flow_media_upload_text":"\u003cb\u003eClick to upload\u003c/b\u003e or drag and drop","write_review_flow_gdpr_statement":"We'll only contact you about your review if necessary. By submitting your review, you agree to our \u003ca href='https://judge.me/terms' target='_blank' rel='nofollow noopener'\u003eterms and conditions\u003c/a\u003e and \u003ca href='https://judge.me/privacy' target='_blank' rel='nofollow noopener'\u003eprivacy policy\u003c/a\u003e.","rating_only_reviews_enabled":false,"show_negative_reviews_help_screen":false,"new_review_flow_help_screen_rating_threshold":3,"negative_review_resolution_screen_title_text":"Tell us more","negative_review_resolution_text":"Your experience matters to us. If there were issues with your purchase, we're here to help. Feel free to reach out to us, we'd love the opportunity to make things right.","negative_review_resolution_button_text":"Contact us","negative_review_resolution_proceed_with_review_text":"Leave a review","negative_review_resolution_subject":"Issue with purchase from {{ shop_name }}.{{ order_name }}","coupon_promo_intro_any_review_text":"Write a review and get a coupon for {{ amount }} off your next purchase","coupon_promo_intro_with_photo_text":"Write a review and add a photo or video to get a coupon for {{ amount }} off your next purchase","coupon_promo_intro_with_video_text":"Write a review and add a video to get a coupon for {{ amount }} off your next purchase","coupon_promo_intro_up_to_any_review_text":"Write a review and get a coupon for up to {{ amount }} off your next purchase","coupon_promo_intro_up_to_with_photo_text":"Write a review and add a photo or video to get a coupon for up to {{ amount }} off your next purchase","coupon_promo_intro_external_text":"Write a review and get a reward for your next purchase","coupon_promo_intro_external_with_photo_text":"Write a review and add a photo or video to get a reward for your next purchase","coupon_promo_intro_external_with_video_text":"Write a review and add a video to get a reward for your next purchase","coupon_promo_media_photo_text":"Add a photo or video and get a coupon for {{ amount }} off your next purchase","coupon_promo_media_photo_only_text":"Add a photo and get a coupon for {{ amount }} off your next purchase","coupon_promo_media_video_text":"Add a video and get a coupon for {{ amount }} off your next purchase","coupon_promo_media_external_photo_text":"Add a photo or video and get a reward for your next purchase","coupon_promo_media_external_photo_only_text":"Add a photo and get a reward for your next purchase","coupon_promo_media_external_video_text":"Add a video and get a reward for your next purchase","coupon_promo_success_text":"You've got a coupon for your next purchase at {{ shop_name }}!","coupon_promo_success_subtext":"You'll receive your coupon email within the hour.","preview_badge_collection_page_install_status":false,"widget_review_custom_css":"","preview_badge_custom_css":"","preview_badge_stars_count":"5-stars","featured_carousel_custom_css":"","floating_tab_custom_css":"","all_reviews_widget_custom_css":"","medals_widget_custom_css":"","verified_badge_custom_css":"","all_reviews_text_custom_css":"","transparency_badges_collected_via_store_invite":false,"transparency_badges_from_another_provider":false,"transparency_badges_collected_from_store_visitor":false,"transparency_badges_collected_by_verified_review_provider":true,"transparency_badges_earned_reward":false,"transparency_badges_collected_via_store_invite_text":"Review collected via store invitation","transparency_badges_from_another_provider_text":"Review collected from another provider","transparency_badges_collected_from_store_visitor_text":"Review collected from a store visitor","transparency_badges_written_in_google_text":"Review written in Google","transparency_badges_written_in_etsy_text":"Review written in Etsy","transparency_badges_written_in_shop_app_text":"Review written in Shop App","transparency_badges_earned_reward_text":"Review earned a reward for future purchase","product_review_widget_per_page":10,"widget_other_languages_reviews_per_page":3,"widget_store_review_label_text":"Review about the store","widget_cart_mode_aggregate_heading_text":"Customers rate this store","checkout_comment_extension_title_on_product_page":"Customer Comments","checkout_comment_extension_num_latest_comment_show":5,"checkout_comment_extension_format":"name_and_timestamp","checkout_comment_customer_name":"last_initial","checkout_comment_comment_notification":true,"preview_badge_collection_page_install_preference":false,"preview_badge_home_page_install_preference":false,"preview_badge_product_page_install_preference":false,"review_widget_install_preference":"","review_carousel_install_preference":false,"floating_reviews_tab_install_preference":"none","verified_reviews_count_badge_install_preference":false,"all_reviews_text_install_preference":false,"review_widget_best_location":false,"judgeme_medals_install_preference":false,"review_widget_revamp_enabled":true,"review_widget_qna_enabled":false,"review_widget_revamp_dual_publish_end_date":"2026-08-10T23:14:20.000+00:00","review_widget_header_theme":"minimal","review_widget_widget_title_enabled":true,"review_widget_header_text_size":"medium","review_widget_header_text_weight":"regular","review_widget_average_rating_style":"compact","review_widget_bar_chart_enabled":true,"review_widget_bar_chart_type":"numbers","review_widget_bar_chart_style":"standard","review_widget_expanded_media_gallery_enabled":false,"review_widget_show_review_highlights":false,"review_widget_show_review_keywords_in_gray":false,"review_widget_reviews_section_theme":"standard","review_widget_image_style":"thumbnails","review_widget_review_image_ratio":"square","review_widget_stars_size":"medium","review_widget_verified_badge":"standard_text","review_widget_review_title_text_size":"medium","review_widget_review_text_size":"medium","review_widget_review_text_length":"medium","review_widget_number_of_columns_desktop":3,"review_widget_carousel_transition_speed":5,"review_widget_custom_questions_answers_display":"always","review_widget_card_section_size":"small","review_widget_button_text_color":"#FFFFFF","review_widget_text_color":"#161819","review_widget_lighter_text_color":"#444646","review_widget_corner_styling":"soft","review_widget_review_word_singular":"review","review_widget_review_word_plural":"reviews","review_widget_voting_label":"Helpful?","review_widget_shop_reply_label":"Reply from {{ shop_name }}:","review_widget_filters_title":"Filters","review_widget_filter_rating_title":"Rating","review_widget_filter_keyword_title":"Keyword","review_widget_clear_filters_text":"Clear filters","review_widget_expand_more_text":"More","review_widget_review_highlights_title":"Review highlights","qna_widget_question_word_singular":"Question","qna_widget_question_word_plural":"Questions","qna_widget_answer_reply_label":"Answer from {{ answerer_name }}:","qna_content_screen_title_text":"Ask a question about this product","qna_widget_question_required_field_error_text":"Please enter your question.","qna_widget_flow_gdpr_statement":"We'll only contact you about your question if necessary. By submitting your question, you agree to our \u003ca href='https://judge.me/terms' target='_blank' rel='nofollow noopener'\u003eterms and conditions\u003c/a\u003e and \u003ca href='https://judge.me/privacy' target='_blank' rel='nofollow noopener'\u003eprivacy policy\u003c/a\u003e.","qna_widget_question_submitted_text":"Thanks for your question!","qna_widget_close_form_text_question":"Close","qna_widget_question_submit_success_text":"We’ll notify you by email when your question is answered.","all_reviews_widget_v2025_enabled":false,"all_reviews_widget_v2025_header_theme":"default","all_reviews_widget_v2025_widget_title_enabled":true,"all_reviews_widget_v2025_header_text_size":"medium","all_reviews_widget_v2025_header_text_weight":"regular","all_reviews_widget_v2025_average_rating_style":"compact","all_reviews_widget_v2025_bar_chart_enabled":true,"all_reviews_widget_v2025_bar_chart_type":"numbers","all_reviews_widget_v2025_bar_chart_style":"standard","all_reviews_widget_v2025_expanded_media_gallery_enabled":false,"all_reviews_widget_v2025_show_store_medals":true,"all_reviews_widget_v2025_show_photo_gallery":true,"all_reviews_widget_v2025_show_review_keywords":false,"all_reviews_widget_v2025_show_ai_summary":false,"all_reviews_widget_v2025_show_ai_summary_bg":false,"all_reviews_widget_v2025_show_review_highlights":false,"all_reviews_widget_v2025_show_review_keywords_in_gray":false,"all_reviews_widget_v2025_add_search_bar":false,"all_reviews_widget_v2025_default_sort_method":"most-recent","all_reviews_widget_v2025_reviews_per_page":10,"all_reviews_widget_v2025_reviews_section_theme":"default","all_reviews_widget_v2025_image_style":"thumbnails","all_reviews_widget_v2025_review_image_ratio":"square","all_reviews_widget_v2025_stars_size":"medium","all_reviews_widget_v2025_verified_badge":"standard_text","all_reviews_widget_v2025_review_title_text_size":"medium","all_reviews_widget_v2025_review_text_size":"medium","all_reviews_widget_v2025_review_text_length":"medium","all_reviews_widget_v2025_number_of_columns_desktop":3,"all_reviews_widget_v2025_carousel_transition_speed":5,"all_reviews_widget_v2025_custom_questions_answers_display":"always","all_reviews_widget_v2025_review_dates":false,"all_reviews_widget_v2025_card_section_size":"small","all_reviews_widget_v2025_show_product_variant":false,"all_reviews_widget_v2025_show_reviewer_avatar":true,"all_reviews_widget_v2025_reviewer_name_as_initial":"","all_reviews_widget_v2025_review_location_show":false,"all_reviews_widget_v2025_location_format":"","all_reviews_widget_v2025_show_country_flag":false,"all_reviews_widget_v2025_widget_thumb":false,"all_reviews_widget_v2025_verified_by_shop_badge_style":"light","all_reviews_widget_v2025_social_share":false,"all_reviews_widget_v2025_social_share_options_order":"Facebook,Twitter,LinkedIn,Pinterest","all_reviews_widget_v2025_pagination_type":"standard","all_reviews_widget_v2025_button_text_color":"#FFFFFF","all_reviews_widget_v2025_text_color":"#000000","all_reviews_widget_v2025_lighter_text_color":"#7B7B7B","all_reviews_widget_v2025_corner_styling":"soft","all_reviews_widget_v2025_title":"Customer reviews","all_reviews_widget_v2025_ai_summary_title":"Customers say about this store","all_reviews_widget_v2025_no_review_text":"Be the first to write a review","all_reviews_widget_v2025_review_highlights_title":"Review highlights","reviews_grid_widget_show_sample_reviews":false,"reviews_grid_widget_review_selection":"all","reviews_grid_widget_select_products":[],"reviews_grid_widget_show_media_only":false,"reviews_grid_widget_display_order":"media_first","reviews_grid_widget_card_grouping":"per_media","reviews_grid_widget_columns_desktop":3,"reviews_grid_widget_rows_desktop":3,"reviews_grid_widget_columns_mobile":2,"reviews_grid_widget_rows_mobile":6,"reviews_grid_widget_show_stars":true,"reviews_grid_widget_show_reviewer_name":true,"reviews_grid_widget_show_review_title_on_hover_desktop":true,"reviews_grid_widget_corner_styling":"soft","reviews_grid_widget_card_spacing":"medium","reviews_grid_widget_header_text_color":"#000000","reviews_grid_widget_star_and_reviewer_name_color":"#F9F9F9","reviews_grid_widget_overlay_and_background_color":"#000000","reviews_grid_widget_content_color":"#F9F9F9","reviews_grid_widget_header_text":"From our customers","reviews_grid_widget_show_average_rating":true,"trust_badge_enabled":false,"trust_badge_structure":"outline","trust_badge_color":"black","trust_badge_star":"black","trust_badge_rating_display_default":"show_avg_text","platform":"shopify","branding_url":"https://app.judge.me/reviews","branding_text":"Powered by Judge.me","locale":"en","reply_name":"BODi","shop_currency":"USD","widget_version":"3.0","footer":true,"autopublish":false,"review_dates":false,"enable_custom_form":false,"shop_locale":"en","enable_multi_locales_translations":true,"show_review_title_input":false,"autofill_review_title":true,"review_verification_email_status":"always","require_verification_before_submit":false,"sign_in_with_shop_enabled":false,"customer_account_validation_enabled":true,"most_relevant_sort_enabled":false,"coupon_promo_invited_eligible":true,"coupon_promo_web_eligible":false,"uses_coupon_integration":false,"uses_external_coupon":false,"can_be_branded":true,"rtl_stars_enabled_ar":true,"rtl_stars_enabled_he":true,"reply_name_text":"BODi"};</script> <style class='jdgm-settings-style'>.jdgm-xx{left:0}:root{--jdgm-primary-color: #208468;--jdgm-secondary-color: rgba(32,132,104,0.1);--jdgm-star-color: #26262C;--jdgm-write-review-text-color: white;--jdgm-write-review-bg-color: #208468;--jdgm-paginate-color: #208468;--jdgm-border-radius: 0;--jdgm-reviewer-name-color: #208468}.jdgm-histogram__bar-content{background-color:#208468}.jdgm-rev[data-verified-buyer=true] .jdgm-rev__icon.jdgm-rev__icon:after,.jdgm-rev__buyer-badge.jdgm-rev__buyer-badge{color:white;background-color:#208468}.jdgm-review-widget--small .jdgm-gallery.jdgm-gallery .jdgm-gallery__thumbnail-link:nth-child(8) .jdgm-gallery__thumbnail-wrapper.jdgm-gallery__thumbnail-wrapper:before{content:"See more"}@media only screen and (min-width: 768px){.jdgm-gallery.jdgm-gallery .jdgm-gallery__thumbnail-link:nth-child(8) .jdgm-gallery__thumbnail-wrapper.jdgm-gallery__thumbnail-wrapper:before{content:"See more"}}.jdgm-preview-badge .jdgm-star.jdgm-star{color:#26262C}.jdgm-widget .jdgm-write-rev-link{display:none}.jdgm-widget .jdgm-rev-widg[data-number-of-reviews='0']{display:none}.jdgm-prev-badge[data-average-rating='0.00']{display:none !important}.jdgm-rev .jdgm-rev__timestamp,.jdgm-quest .jdgm-rev__timestamp,.jdgm-carousel-item__timestamp{display:none !important}.jdgm-author-all-initials{display:none !important}.jdgm-author-last-initial{display:none !important}.jdgm-rev-widg__title{visibility:hidden}.jdgm-rev-widg__summary-text{visibility:hidden}.jdgm-prev-badge__text{visibility:hidden}.jdgm-rev__prod-link-prefix:before{content:'about'}.jdgm-rev__variant-label:before{content:'Variant: '}.jdgm-rev__out-of-store-text:before{content:'(out of store)'}@media only screen and (min-width: 768px){.jdgm-rev__pics .jdgm-rev_all-rev-page-picture-separator,.jdgm-rev__pics .jdgm-rev__product-picture{display:none}}@media only screen and (max-width: 768px){.jdgm-rev__pics .jdgm-rev_all-rev-page-picture-separator,.jdgm-rev__pics .jdgm-rev__product-picture{display:none}}.jdgm-preview-badge[data-template="product"]{display:none !important}.jdgm-preview-badge[data-template="collection"]{display:none !important}.jdgm-preview-badge[data-template="index"]{display:none !important}.jdgm-review-widget[data-from-snippet="true"]{display:none !important}.jdgm-verified-count-badget[data-from-snippet="true"]{display:none !important}.jdgm-carousel-wrapper[data-from-snippet="true"]{display:none !important}.jdgm-all-reviews-text[data-from-snippet="true"]{display:none !important}.jdgm-medals-section[data-from-snippet="true"]{display:none !important}.jdgm-ugc-media-wrapper[data-from-snippet="true"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_collected_via_store_invitation"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_collected_from_another_provider"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_collected_from_store_visitor"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_earned_for_future_purchase"]{display:none !important}.jdgm-review-snippet-widget{--jdgm-snippet-card-color: #fff;--jdgm-snippet-text-color: #000;--jdgm-snippet-lighter-text-color: #7B7B7B;--jdgm-snippet-star-color: #208468;--jdgm-snippet-border-radius: 8px;--jdgm-snippet-arrows-bg-color: #fff;--jdgm-snippet-arrows-color: #000}.jdgm-review-snippet-widget .jdgm-rev-snippet-widget__cards-container .jdgm-rev-snippet-card{border-radius:8px;background:#fff}.jdgm-review-snippet-widget .jdgm-rev-snippet-widget__cards-container .jdgm-rev-snippet-card__rev-rating .jdgm-star{color:#208468}.jdgm-review-snippet-widget .jdgm-rev-snippet-widget__prev-btn,.jdgm-review-snippet-widget .jdgm-rev-snippet-widget__next-btn{border-radius:50%;background:#fff}.jdgm-review-snippet-widget .jdgm-rev-snippet-widget__prev-btn>svg,.jdgm-review-snippet-widget .jdgm-rev-snippet-widget__next-btn>svg{fill:#000}.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jm-mfp-content,.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jdgm-full-rev__icon,.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jdgm-full-rev__pic-img,.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jdgm-full-rev__reply{border-radius:8px}.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jdgm-full-rev[data-verified-buyer="true"] .jdgm-full-rev__icon::after{border-radius:8px}.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jdgm-full-rev .jdgm-rev__buyer-badge{border-radius:calc( 8px / 2 )}.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jdgm-full-rev .jdgm-full-rev__replier::before{content:'BODi'}.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jdgm-full-rev .jdgm-full-rev__product-button{border-radius:calc( 8px * 6 )}
</style> <style class='jdgm-settings-style'></style>
<style class='jdgm-miracle-styles'>
@-webkit-keyframes jdgm-spin{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);-ms-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes jdgm-spin{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);-ms-transform:rotate(359deg);transform:rotate(359deg)}}@font-face{font-family:'JudgemeStar';src:url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAScAA0AAAAABrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAEgAAAABoAAAAcbyQ+3kdERUYAAARgAAAAHgAAACAAMwAGT1MvMgAAAZgAAABGAAAAVi+vS9xjbWFwAAAB8AAAAEAAAAFKwBMjvmdhc3AAAARYAAAACAAAAAj//wADZ2x5ZgAAAkAAAAEJAAABdH33LXtoZWFkAAABMAAAAC0AAAA2BroQKWhoZWEAAAFgAAAAHAAAACQD5QHQaG10eAAAAeAAAAAPAAAAFAYAAABsb2NhAAACMAAAAA4AAAAOAO4AeG1heHAAAAF8AAAAHAAAACAASgAvbmFtZQAAA0wAAADeAAABkorWfVZwb3N0AAAELAAAACkAAABEp3ubLXgBY2BkYADhPPP4OfH8Nl8ZuJkYQODS2fRrCPr/aSYGxq1ALgcDWBoAO60LkwAAAHgBY2BkYGDc+v80gx4TAwgASaAICmABAFB+Arl4AWNgZGBgYGPQYWBiAAIwyQgWc2AAAwAHVQB6eAFjYGRiYJzAwMrAwejDmMbAwOAOpb8ySDK0MDAwMbByMsCBAAMCBKS5pjA4PGB4wMR44P8BBj3GrQymQGFGkBwAjtgK/gAAeAFjYoAAEA1jAwAAZAAHAHgB3crBCcAwDEPRZydkih567CDdf4ZskmLwFBV8xBfCaC4BXkOUmx4sU0h2ngNb9V0vQCxaRKIAevT7fGWuBrEAAAAAAAAAAAA0AHgAugAAeAF9z79Kw1AUx/FzTm7un6QmJtwmQ5Bg1abgEGr/BAqlU6Gju+Cgg1MkQ/sA7Vj7BOnmO/gUvo2Lo14NqIO6/IazfD8HEODtmQCfoANwNsyp2/GJt3WKQrd1NLiYYWx2PBqOsmJMEOznPOTzfSCrhAtbbLdmeFLJV9eKd63WLrZcIcuaEVdssWCKM6pLCfTVOYbz/0pNSMSZKLIZpvh78sAUH6PlMrreTCabP9r+Z/puPZ2ur/RqpQHgh+MIegCnXeM4MRAPjYN//5tj4ZtTjkFqEdmeMShlEJ7tVAly2TAkx6R68Fl4E/aVvn8JqHFQ4JS1434gXKcuL31dDhzs3YbsEOAd/IU88gAAAHgBfY4xTgMxEEVfkk0AgRCioKFxQYd2ZRtpixxgRU2RfhU5q5VWseQ4JdfgAJyBlmNwAM7ABRhZQ0ORwp7nr+eZAa54YwYg9zm3ynPOeFRe8MCrciXOh/KSS76UV5L/iDmrLiS5AeU519wrL3jmSbkS5115yR2fyivJv9kx0ZMZ2RLZw27q87iNQi8EBo5FSPIMw3HqBboi5lKTGAGDp8FKXWP+t9TU01Lj5His1Ba6uM9dTEMwvrFmbf5GC/q2drW3ruXUhhsCiQOjznFlCzYhHUZp4xp76vsvQh89CQAAeAFjYGJABowM6IANLMrEyMTIzMjCXpyRWJBqZshWXJJYBKOMAFHFBucAAAAAAAAB//8AAngBY2BkYGDgA2IJBhBgAvKZGViBJAuYxwAABJsAOgAAeAFjYGBgZACCk535hiD60tn0azAaAEqpB6wAAA==") format("woff");font-weight:normal;font-style:normal}.jdgm-star{font-family:'JudgemeStar';display:inline !important;text-decoration:none !important;padding:0 4px 0 0 !important;margin:0 !important;font-weight:bold;opacity:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.jdgm-star:hover{opacity:1}.jdgm-star:last-of-type{padding:0 !important}.jdgm-star.jdgm--on:before{content:"\e000"}.jdgm-star.jdgm--off:before{content:"\e001"}.jdgm-star.jdgm--half:before{content:"\e002"}.jdgm-widget *{margin:0;line-height:1.4;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-overflow-scrolling:touch}.jdgm-hidden{display:none !important;visibility:hidden !important}.jdgm-temp-hidden{display:none}.jdgm-spinner{width:40px;height:40px;margin:auto;border-radius:50%;border-top:2px solid #eee;border-right:2px solid #eee;border-bottom:2px solid #eee;border-left:2px solid #ccc;-webkit-animation:jdgm-spin 0.8s infinite linear;animation:jdgm-spin 0.8s infinite linear}.jdgm-spinner:empty{display:block}.jdgm-prev-badge{display:block !important}
</style>
<script data-cfasync='false' class='jdgm-script'>
!function(e){window.jdgm=window.jdgm||{},jdgm.CDN_HOST="https://cdnwidget.judge.me/",jdgm.CDN_HOST_ALT="https://cdn2.judge.me/cdn/widget_frontend/",jdgm.API_HOST="https://api.judge.me/",jdgm.CDN_BASE_URL="https://cdn.shopify.com/extensions/01a02574-6390-715b-9622-33ef4acfdaa1/judgeme-719/assets/",jdgm.CDN_API_HOST="https://cdn.judge.me/",
jdgm.docReady=function(d){(e.attachEvent?"complete"===e.readyState:"loading"!==e.readyState)?
setTimeout(d,0):e.addEventListener("DOMContentLoaded",d)},jdgm.loadCSS=function(d,t,o,a){
!o&&jdgm.loadCSS.requestedUrls.indexOf(d)>=0||(jdgm.loadCSS.requestedUrls.push(d),
(a=e.createElement("link")).rel="stylesheet",a.class="jdgm-stylesheet",a.media="nope!",
a.href=d,a.onload=function(){this.media="all",t&&setTimeout(t)},e.body.appendChild(a))},
jdgm.loadCSS.requestedUrls=[],jdgm.loadJS=function(e,d){var t=new XMLHttpRequest;
t.onreadystatechange=function(){4===t.readyState&&t.status>=200&&t.status<300&&(Function(t.response)(),d&&d(t.response))},
t.open("GET",e),t.onerror=function(){if(e.indexOf(jdgm.CDN_HOST)===0&&jdgm.CDN_HOST_ALT!==jdgm.CDN_HOST){var f=e.replace(jdgm.CDN_HOST,jdgm.CDN_HOST_ALT);jdgm.loadJS(f,d)}},t.send()},jdgm.docReady((function(){(window.jdgmLoadCSS||e.querySelectorAll(
".jdgm-widget, .jdgm-all-reviews-page").length>0)&&(jdgmSettings.widget_load_with_code_splitting?
parseFloat(jdgmSettings.widget_version)>=3?jdgm.loadCSS(jdgm.CDN_BASE_URL+"widget_v3_base.css"):
jdgm.loadCSS(jdgm.CDN_BASE_URL+"widget_base.css"):jdgm.loadCSS(jdgm.CDN_BASE_URL+"shopify_v2.css")
)}))}(document);
</script>
<noscript><link rel="stylesheet" type="text/css" media="all" href="https://cdn.shopify.com/extensions/01a02574-6390-715b-9622-33ef4acfdaa1/judgeme-719/assets/shopify_v2.css"></noscript>
<!-- BEGIN app snippet: theme_fix_tags --><script>
(function() {
var jdgmThemeFixes = null;
if (!jdgmThemeFixes) return;
// "All themes" fix: CSS and JS applied on every theme. CSS is injected
// before the per-theme fix so the theme-specific CSS wins the cascade.
// HTML is never applied globally (too risky).
var allThemesFix = jdgmThemeFixes['all'];
if (allThemesFix && allThemesFix.css) {
var allStyleTag = document.createElement('style');
allStyleTag.classList.add('jdgm-theme-fix-style-all');
allStyleTag.innerHTML = allThemesFix.css;
document.head.append(allStyleTag);
};
if (allThemesFix && allThemesFix.js) {
var allScriptTag = document.createElement('script');
allScriptTag.classList.add('jdgm-theme-fix-script-all');
allScriptTag.innerHTML = allThemesFix.js;
document.head.append(allScriptTag);
};
var thisThemeFix = jdgmThemeFixes[Shopify.theme.id];
if (!thisThemeFix) return;
if (thisThemeFix.html) {
document.addEventListener("DOMContentLoaded", function() {
var htmlDiv = document.createElement('div');
htmlDiv.classList.add('jdgm-theme-fix-html');
htmlDiv.innerHTML = thisThemeFix.html;
document.body.append(htmlDiv);
});
};
if (thisThemeFix.css) {
var styleTag = document.createElement('style');
styleTag.classList.add('jdgm-theme-fix-style');
styleTag.innerHTML = thisThemeFix.css;
document.head.append(styleTag);
};
if (thisThemeFix.js) {
var scriptTag = document.createElement('script');
scriptTag.classList.add('jdgm-theme-fix-script');
scriptTag.innerHTML = thisThemeFix.js;
document.head.append(scriptTag);
};
})();
</script>
<!-- END app snippet -->
<!-- End of Judge.me Core -->
<!-- END app block --><script src="https://cdn.shopify.com/extensions/01a0248f-54b2-7a40-a9aa-95df5b5813a4/rebuy-personalization-engine-399/assets/rebuy-extensions.js" type="text/javascript" defer="defer"></script>
<script src="https://cdn.shopify.com/extensions/01a02574-6390-715b-9622-33ef4acfdaa1/judgeme-719/assets/loader.js" type="text/javascript" defer="defer"></script>
<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
<script>(function(){if ("sendBeacon" in navigator && "performance" in window) {try {var session_token_from_headers = performance.getEntriesByType('navigation')[0].serverTiming.find(x => x.name == '_s').description;} catch {var session_token_from_headers = undefined;}var session_cookie_matches = document.cookie.match(/_shopify_s=([^;]*)/);var session_token_from_cookie = session_cookie_matches && session_cookie_matches.length === 2 ? session_cookie_matches[1] : "";var session_token = session_token_from_headers || session_token_from_cookie || "";function handle_abandonment_event(e) {var entries = performance.getEntries().filter(function(entry) {return /monorail-edge.shopifysvc.com/.test(entry.name);});if (!window.abandonment_tracked && entries.length === 0) {window.abandonment_tracked = true;var currentMs = Date.now();var navigation_start = performance.timing.navigationStart;var payload = {shop_id: 75560616153,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "product"};window.navigator.sendBeacon("https://monorail-edge.shopifysvc.com/v1/produce", JSON.stringify({schema_id: "online_store_buyer_site_abandonment/1.1",payload: payload,metadata: {event_created_at_ms: currentMs,event_sent_at_ms: currentMs}}));}}window.addEventListener('pagehide', handle_abandonment_event);}}());</script>
<script>
window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || [];
</script>
<script>(function(){var wpmLoader=function(){"use strict";var e=/Googlebot|Storebot-Google|bingbot|Baiduspider|YandexBot|DuckDuckBot|Slurp|facebookexternalhit|Twitterbot|LinkedInBot|Applebot|AdsBot-Google|Mediapartners-Google|APIs-Google|PetalBot|SemrushBot|AhrefsBot|MJ12bot|DotBot|Acunetix|PerplexityBot|Perplexity-User/i,r=/bytedance/i;function o(){try{var e=document.cookie;if(!e||"string"!=typeof e)return;for(var r=0,o=e.split(";");r<o.length;r++){var d=o[r],t=d.indexOf("=");if(-1!==t){var n=d.slice(0,t).trim();if(n){var i=void 0;try{i=decodeURIComponent(n)}catch(e){i=n}if("_shopify_s"===i){var a=d.slice(t+1).trim();try{return decodeURIComponent(a)}catch(e){return a}}}}}return}catch(e){return}}function d(e){try{"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn(e)}catch(e){}}return function(t,n,i,a){var s,c,u,l,f=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},p=(c=(s={modern:/Edge?\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(9{2}|\d{3,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(15\.\d+|(1[6-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(9{2}|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(15[._]\d+|(1[6-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|SamsungBrowser\/([2-9]\d|\d{3,})\.\d+/,legacy:/Edge?\/(1[6-9]|[2-9]\d|\d{3,})\.\d+(\.\d+|)|Firefox\/(5[4-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)|Chrom(ium|e)\/(5[1-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)([\d.]+$|.*Safari\/(?![\d.]+ Edge\/[\d.]+$))|(Maci|X1{2}).+ Version\/(10\.\d+|(1[1-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(3[89]|[4-9]\d|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(10[._]\d+|(1[1-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+(UC? ?Browser|UCWEB|U3)[ /]?(15\.([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)\.\d+|SamsungBrowser\/(5\.\d+|([6-9]|\d{2,})\.\d+)|Android.+MQ{2}Browser\/(14(\.(9|\d{2,})|)|(1[5-9]|[2-9]\d|\d{3,})(\.\d+|))(\.\d+|)|K[Aa][Ii]OS\/(3\.\d+|([4-9]|\d{2,})\.\d+)(\.\d+|)/}).modern,u=s.legacy,(l=navigator.userAgent).match(e)?"bot":l.match(c)?"modern":l.match(u)?"legacy":l.match(r)?"bot":"unknown"),h=function(e){var r=e.version,t=e.browserTarget,n=e.surface,i=e.shopId,a=e.monorailEndpoint,s=window.location.href;return{emit:function(e){var c,u=e.status,l=e.errorMsg;if(!a)return d("[Web Pixels Manager] No Monorail endpoint provided, skipping logging."),!1;try{var f=(new Date).getTime();c=JSON.stringify({metadata:{event_sent_at_ms:f},events:[{schema_id:"web_pixels_manager_load/3.2",payload:{version:r,bundle_target:t,page_url:s,status:u,surface:n,error_msg:l,shop_id:i,visit_token:o()},metadata:{event_created_at_ms:f}}]})}catch(e){return!1}var p,h=!1;try{"function"==typeof window.navigator.sendBeacon&&-1===(p=window.navigator.userAgent).indexOf("iPhone; CPU iPhone OS 12_")&&-1===p.indexOf("iPad; CPU OS 12_")&&-1===p.indexOf("iPod touch; CPU iPhone OS 12_")&&(h=window.navigator.sendBeacon.bind(window.navigator)(a,c))}catch(e){h=!1}if(h)return!0;try{var m=new XMLHttpRequest;return m.open("POST",a,!0),m.setRequestHeader("Content-Type","text/plain"),m.send(c),!0}catch(e){return d("[Web Pixels Manager] Got an unhandled error while logging to Monorail."),!1}}}}({version:i,browserTarget:p,surface:t.surface,shopId:t.shopId,monorailEndpoint:t.monorailEndpoint});if(Boolean(null==(y=null==(m=window.Shopify)?void 0:m.analytics)?void 0:y.replayQueue))h.emit({status:"setup-skipped",errorMsg:"replay queue already initialized."});else{var m,y;h.emit({status:"setup-started"}),window.Shopify=window.Shopify||{};var g=window.Shopify;g.analytics=g.analytics||{};var v=g.analytics;v.replayQueue=[],v.publish=function(e,r,o){return v.replayQueue.push([e,r,o]),!0};try{self.performance.mark("wpm:start")}catch(e){}var w,b="modern"===p?"modern":"legacy",P=(null!=a?a:{modern:"",legacy:""})[b],S=[(w={baseUrl:n,hashVersion:i,buildTarget:b}).baseUrl,"/wpm","/b",w.hashVersion,"modern"===w.buildTarget?"m":"l",".js"].join("");try{f.browserTarget=p,O(function(){try{O(_)}catch(e){h.emit({status:"failed",errorMsg:U(e)})}}),h.emit({status:"loading"})}catch(e){h.emit({status:"failed",errorMsg:U(e)})}}function C(){if(!function(){var e,r;return Boolean(null==(r=null==(e=window.Shopify)?void 0:e.analytics)?void 0:r.initialized)}()){var e=window.webPixelsManager.init(t)||void 0;if(e){var r=window.Shopify.analytics;r.replayQueue.forEach(function(r){var o=r[0],d=r[1],t=r[2];e.publishCustomEvent(o,d,t)}),r.replayQueue=[],r.publish=e.publishCustomEvent,r.visitor=e.visitor,r.initialized=!0}}}function _(){return h.emit({status:"failed",errorMsg:"".concat(S," has failed to load")})}function O(e){var r;!function(e){var r=e.src,o=e.async,d=void 0===o||o,t=e.onload,n=e.onerror,i=e.sri,a=e.scriptDataAttributes,s=void 0===a?{}:a,c=document.createElement("script"),u=document.querySelector("head"),l=document.querySelector("body");if(c.async=d,c.src=r,i&&(c.integrity=i,c.crossOrigin="anonymous"),s)for(var f in s)if(Object.prototype.hasOwnProperty.call(s,f))try{c.dataset[f]=s[f]}catch(e){}if(t&&c.addEventListener("load",t),n&&c.addEventListener("error",n),u)u.appendChild(c);else{if(!l)throw new Error("Did not find a head or body element to append the script");l.appendChild(c)}}({src:S,async:!0,onload:C,onerror:e,sri:(r=P,"string"==typeof r&&/^sha384-[A-Za-z0-9+/=]+$/.test(r)?P:""),scriptDataAttributes:f})}function U(e){return e instanceof Error?e.message:"Unknown error"}}}();wpmLoader({shopId: 75560616153,storefrontBaseUrl: "https://shop.bodi.com",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://shop.bodi.com/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["d5bdd5d0","656605ce"],webPixelsConfigList: [{"id":"2388656345","configuration":"{\"webPixelName\":\"Judge.me\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"34ad157958823915625854214640f0bf","type":"APP","apiClientId":683015,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"2310439129","configuration":"{\"pixel_id\":\"359057984243714\",\"pixel_type\":\"facebook_pixel\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"abff2a8add143ccb04deb20f0ebd74a9","type":"APP","apiClientId":2329312,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"2291695833","configuration":"{\"target\":\"https:\/\/us3-api.eng.bloomreach.com\", \"token\":\"95636c68-6bec-11f1-9fad-e6ff97c4c273\", \"search_tracking\":\"true\", \"checkout_tracking\":\"true\", \"view_category_tracking\":\"true\", \"view_item_tracking\":\"true\", \"page_viewed_tracking\":\"false\", \"quick_view_tracking\":\"true\", \"suggest_tracking\":\"false\", \"cart_update_tracking\":\"false\", \"view_homepage_tracking\":\"true\", \"view_search_results_tracking\":\"true\", \"purchase_tracking\":\"false\", \"widget_view_tracking\":\"false\", \"widget_click_tracking\":\"false\", \"integration_id\":\"0c74017f-db1d-4df7-82e5-c030f80287ed\", \"gateway_url\":\"https:\/\/us3-api.eng.bloomreach.com\", \"domain\":\"xragki-mv.myshopify.com\", \"stream_id\":\"f9028d13-b0b2-4507-aec0-0fe71ad180a1\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"9c9a883ba8b95da163d9ff5cc6447868","type":"APP","apiClientId":35679600641,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"2228879577","configuration":"{\"campaignID\":\"27336\",\"externalExecutionURL\":\"https:\/\/engine.saasler.com\/api\/v1\/webhook_executions\/ffabc6660687cc707bb361bf386337d9\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"7a47b06116c806e4367c27d301f4f458","type":"APP","apiClientId":3546795,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"2206826713","configuration":"{\"shopId\":\"xragki-mv.myshopify.com\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"31536d5a2ef62c1887054e49fd58dba0","type":"APP","apiClientId":4845829,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"2079359193","configuration":"{\"env\":\"prod\"}","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"8a9a175b11d15038a70fe78d09c59720","type":"APP","apiClientId":3977633,"privacyPurposes":["ANALYTICS","MARKETING"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"1838383321","configuration":"{\"accountID\":\"7370993\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"2e1a1d82f4aeb8c27a62aa29326895f1","type":"APP","apiClientId":2603379,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"1773175001","configuration":"{\"store_id\":\"216182\",\"environment\":\"prod\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"f410f217a6c9053d19f6141896da8610","type":"APP","apiClientId":294517,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"131432665","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"3","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"name":"checkout-clear-tracking-codes"},{"id":"131465433","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"7","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"name":"checkout-analytics"},{"id":"133300441","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"4","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"name":"google-tag-manager"},{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0510","apiClientId":"shopify-pixel","type":"APP","privacyPurposes":["ANALYTICS","MARKETING"]},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0510","apiClientId":"shopify-pixel","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING"]}],isMerchantRequest: false,initData: {"shop":{"name":"BODi","paymentSettings":{"currencyCode":"USD"},"myshopifyDomain":"xragki-mv.myshopify.com","countryCode":"US","storefrontUrl":"https:\/\/shop.bodi.com"},"customer":null,"cart":null,"checkout":null,"productVariants":[{"price":{"amount":149.96,"currencyCode":"USD"},"product":{"title":"Ultimate Reset","vendor":"bodi-us-prod","id":"9413928616153","untranslatedTitle":"Ultimate Reset","url":"\/products\/ultimate-reset-cleanse","type":"Nutrition"},"id":"47683217391833","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-ultimate-reset-en-us.png?v=1772479737"},"sku":"MDSUCLN2101","title":"Default Title","untranslatedTitle":"Default Title"}],"products":[{"id":"9413928616153","handle":"ultimate-reset-cleanse","isCollective":null,"title":"Ultimate Reset","type":"Nutrition","untranslatedTitle":"Ultimate Reset","url":"\/products\/ultimate-reset-cleanse","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683217391833","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-ultimate-reset-en-us.png?v=1772479737"},"price":{"amount":149.96,"currencyCode":"USD"},"sku":"MDSUCLN2101","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9634275950809","handle":"free-bodi-subscription","isCollective":null,"title":"The BODi Subscription Monthly","type":"Digital","untranslatedTitle":"The BODi Subscription Monthly","url":"\/products\/free-bodi-subscription","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"48040135983321","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-membership-programs_42f8e467-b168-4f85-ad90-dde751f6a7b6.png?v=1772479840"},"price":{"amount":19.0,"currencyCode":"USD"},"sku":"BBSHBODI1000","title":"Monthly","untranslatedTitle":"Monthly"}]},{"id":"9413928288473","handle":"shakeology-0g-added-sugar","isCollective":null,"title":"Shakeology 0g Added Sugar","type":"Nutrition","untranslatedTitle":"Shakeology 0g Added Sugar","url":"\/products\/shakeology-0g-added-sugar","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683216081113","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-pdp-shakeology-0g-chocolate-vegan-30-serving-en-us-1x1.png?v=1784923289"},"price":{"amount":97.46,"currencyCode":"USD"},"sku":"MDUSENSHKBAG208","title":"Vegan Protein \/ 30 Serving Bag \/ Chocolate","untranslatedTitle":"Vegan Protein \/ 30 Serving Bag \/ Chocolate"}]},{"id":"9413924192473","handle":"energize-pre-workout","isCollective":null,"title":"Energize Pre-Workout","type":"Nutrition","untranslatedTitle":"Energize Pre-Workout","url":"\/products\/energize-pre-workout","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683208642777","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-energize-pre-workout-lemon-40-single-servings-en-us.png?v=1772478625"},"price":{"amount":41.21,"currencyCode":"USD"},"sku":"BBUSBBP1004","title":"Lemon \/ 40 Serving Tub","untranslatedTitle":"Lemon \/ 40 Serving Tub"}]},{"id":"9413924421849","handle":"hormone-health-supplements","isCollective":null,"title":"Belle Vitale Supplements","type":"Nutrition","untranslatedTitle":"Belle Vitale Supplements","url":"\/products\/hormone-health-supplements","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683209527513","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-belle-vitale-hormone-health-supplements-duo-en-us.png?v=1772478625"},"price":{"amount":90.75,"currencyCode":"USD"},"sku":"BBUSBVTSUPP102","title":"Supplement Duo","untranslatedTitle":"Supplement Duo"}]},{"id":"9665481605337","handle":"p90x-creatine-monohydrate-powder","isCollective":null,"title":"P90X Creatine","type":"Nutrition","untranslatedTitle":"P90X Creatine","url":"\/products\/p90x-creatine-monohydrate-powder","vendor":"BODi","remoteShopId":null,"variants":[{"id":"48369731895513","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-p90x-creatine-main-unflavored-20-serving-en-us_4b707d67-fb87-4875-ae2f-b06489de29c3.png?v=1773779584"},"price":{"amount":22.49,"currencyCode":"USD"},"sku":"BBUSP90XCRE01","title":"Unflavored \/ 40 Servings","untranslatedTitle":"Unflavored \/ 40 Servings"}]},{"id":"9413924880601","handle":"recover-post-workout-protein-powder","isCollective":null,"title":"Recover Post-Workout Protein Powder","type":"Nutrition","untranslatedTitle":"Recover Post-Workout Protein Powder","url":"\/products\/recover-post-workout-protein-powder","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683210379481","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-recover-chocolate-whey-tub-20-serving-en-us.png?v=1772478652"},"price":{"amount":52.46,"currencyCode":"USD"},"sku":"MDSUBBP2112","title":"Chocolate \/ Whey Protein \/ 20 Serving Tub","untranslatedTitle":"Chocolate \/ Whey Protein \/ 20 Serving Tub"}]},{"id":"9413924094169","handle":"collagen-peptides","isCollective":null,"title":"Bioactive Collagen Peptides","type":"Nutrition","untranslatedTitle":"Bioactive Collagen Peptides","url":"\/products\/collagen-peptides","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683208380633","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-bioactive-collagen-peptides.png?v=1772478598"},"price":{"amount":26.21,"currencyCode":"USD"},"sku":"MDSUCB2101","title":"28 Serving Jar","untranslatedTitle":"28 Serving Jar"}]},{"id":"9413924946137","handle":"shakeology","isCollective":null,"title":"Shakeology","type":"Nutrition","untranslatedTitle":"Shakeology","url":"\/products\/shakeology","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683210641625","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-shakeology-chocolate-vegan-30-serving-en-us.png?v=1772478656"},"price":{"amount":97.46,"currencyCode":"USD"},"sku":"MDSUSH32112","title":"Chocolate \/ Vegan Protein \/ 30 Serving Bag","untranslatedTitle":"Chocolate \/ Vegan Protein \/ 30 Serving Bag"}]},{"id":"9413924487385","handle":"hydrate-electrolyte-powder","isCollective":null,"title":"Hydrate Electrolyte Powder","type":"Nutrition","untranslatedTitle":"Hydrate Electrolyte Powder","url":"\/products\/hydrate-electrolyte-powder","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683209691353","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-hydrate-citrus-40-serving-en-us.png?v=1772478610"},"price":{"amount":27.71,"currencyCode":"USD"},"sku":"MDSUBBP2110","title":"Citrus \/ 40 Serving Tub","untranslatedTitle":"Citrus \/ 40 Serving Tub"}]},{"id":"9665481539801","handle":"p90x-hydration-electrolytes-drink-powder","isCollective":null,"title":"P90X Hydration","type":"Nutrition","untranslatedTitle":"P90X Hydration","url":"\/products\/p90x-hydration-electrolytes-drink-powder","vendor":"BODi","remoteShopId":null,"variants":[{"id":"48369731698905","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-p90x-hydration-main-lemon-lime-10-count-en-us_23459cb6-4ffa-4330-be2a-f64bf73dc476.png?v=1773779586"},"price":{"amount":11.99,"currencyCode":"USD"},"sku":"BBUSP90XHYD01","title":"Lemon Lime \/ 10 Servings","untranslatedTitle":"Lemon Lime \/ 10 Servings"}]},{"id":"9665481572569","handle":"p90x-pre-workout-powder","isCollective":null,"title":"P90X Pre-Workout","type":"Nutrition","untranslatedTitle":"P90X Pre-Workout","url":"\/products\/p90x-pre-workout-powder","vendor":"BODi","remoteShopId":null,"variants":[{"id":"48369731961049","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-p90x-pre-workout-main-watermelon-20-serving-en-us_f3d1e81a-3125-4982-b137-4a1da9249f26.png?v=1773779585"},"price":{"amount":26.24,"currencyCode":"USD"},"sku":"BBUSP90XPRE03","title":"Watermelon \/ 20 Servings","untranslatedTitle":"Watermelon \/ 20 Servings"}]},{"id":"9413928386777","handle":"shakeology-sampler","isCollective":null,"title":"Shakeology Sampler","type":"Nutrition","untranslatedTitle":"Shakeology Sampler","url":"\/products\/shakeology-sampler","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683216507097","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-pdp-shakeology-0g-vegan-sample-packs-en-us-1x1.png?v=1783983320"},"price":{"amount":22.46,"currencyCode":"USD"},"sku":"BBSHKSMPUS01","title":"Variety \/ Vegan Protein","untranslatedTitle":"Variety \/ Vegan Protein"}]},{"id":"9413924749529","handle":"power-greens-veggies","isCollective":null,"title":"Power Greens Boost","type":"Nutrition","untranslatedTitle":"Power Greens Boost","url":"\/products\/power-greens-veggies","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683210051801","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-boost-power-greens-en-us.png?v=1772478640"},"price":{"amount":26.21,"currencyCode":"USD"},"sku":"MDSUSH2103","title":"21 Serving Tub","untranslatedTitle":"21 Serving Tub"}]},{"id":"9413923963097","handle":"3-day-refresh-cleanse","isCollective":null,"title":"3-Day Refresh Complete Kit with Shakeology","type":"Nutrition","untranslatedTitle":"3-Day Refresh Complete Kit with Shakeology","url":"\/products\/3-day-refresh-cleanse","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683208184025","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-3-day-refresh-vegan-chocolate-en-us.png?v=1772478593"},"price":{"amount":52.46,"currencyCode":"USD"},"sku":"MD3DKIT2168","title":"Chocolate \/ Vegan Protein","untranslatedTitle":"Chocolate \/ Vegan Protein"}]},{"id":"9413924159705","handle":"digestive-health-fiber","isCollective":null,"title":"Digestive Health Boost","type":"Nutrition","untranslatedTitle":"Digestive Health Boost","url":"\/products\/digestive-health-fiber","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683208446169","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-boost-digestive-health-en-us.png?v=1772478602"},"price":{"amount":33.71,"currencyCode":"USD"},"sku":"MDSUSH2102","title":"20 Serving Tub","untranslatedTitle":"20 Serving Tub"}]},{"id":"9665481638105","handle":"p90x-whey-protein-powder","isCollective":null,"title":"P90X 100% Whey Protein","type":"Nutrition","untranslatedTitle":"P90X 100% Whey Protein","url":"\/products\/p90x-whey-protein-powder","vendor":"BODi","remoteShopId":null,"variants":[{"id":"48369732124889","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-p90x-whey-protein-main-chocolate-15-serving-en-us_0403bc0b-6cdb-4297-9eba-289a9a21f64f.png?v=1773779585"},"price":{"amount":29.99,"currencyCode":"USD"},"sku":"BBUSP90XPRO01","title":"Chocolate \/ 15 Servings","untranslatedTitle":"Chocolate \/ 15 Servings"}]},{"id":"9413924520153","handle":"last-thing-sleep-aid","isCollective":null,"title":"LAST THING","type":"Nutrition","untranslatedTitle":"LAST THING","url":"\/products\/last-thing-sleep-aid","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683209756889","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-last-thing-sleep-aid-pdp-en-us.png?v=1772478619"},"price":{"amount":37.46,"currencyCode":"USD"},"sku":"MDUSENBLTBTL201","title":"30 Serving Jar","untranslatedTitle":"30 Serving Jar"}]},{"id":"9665481507033","handle":"p90x-energy-drink-powder","isCollective":null,"title":"P90X Energy","type":"Nutrition","untranslatedTitle":"P90X Energy","url":"\/products\/p90x-energy-drink-powder","vendor":"BODi","remoteShopId":null,"variants":[{"id":"48369731797209","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-p90x-energy-main-blue-raspberry-10-count-en-us_cf6773be-7031-493b-a351-337ef0ca17f7.png?v=1773779585"},"price":{"amount":11.99,"currencyCode":"USD"},"sku":"BBUSP90XENE02","title":"Blue Raspberry \/ 10 Servings","untranslatedTitle":"Blue Raspberry \/ 10 Servings"}]},{"id":"9413924585689","handle":"optimize-revitalize-probiotics-enzymes","isCollective":null,"title":"Optimize \u0026 Revitalize Gut Health Supplements","type":"Nutrition","untranslatedTitle":"Optimize \u0026 Revitalize Gut Health Supplements","url":"\/products\/optimize-revitalize-probiotics-enzymes","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683209822425","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-the-4-week-gut-protocol-revitalize-optimize-supplement-duo-en-us.png?v=1772478638"},"price":{"amount":74.96,"currencyCode":"USD"},"sku":"MDSUGUT2101","title":"Optimize \u0026 Revitalize Bundle","untranslatedTitle":"Optimize \u0026 Revitalize Bundle"}]},{"id":"9413924061401","handle":"beachbar","isCollective":null,"title":"BEACHBAR","type":"Nutrition","untranslatedTitle":"BEACHBAR","url":"\/products\/beachbar","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683208347865","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-beachbar-chocolate-almond-crunch.png?v=1772478601"},"price":{"amount":39.8,"currencyCode":"USD"},"sku":"MDBAR2111","title":"Chocolate Almond Crunch \/ Vegan Protein \/ 15 Bar Box","untranslatedTitle":"Chocolate Almond Crunch \/ Vegan Protein \/ 15 Bar Box"}]},{"id":"9413928779993","handle":"bodi-subscription","isCollective":null,"title":"The BODi Subscription","type":"Digital","untranslatedTitle":"The BODi Subscription","url":"\/products\/bodi-subscription","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683217817817","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-membership-programs.png?v=1772479745"},"price":{"amount":179.0,"currencyCode":"USD"},"sku":"BBSHBODI1003","title":"ANNUAL","untranslatedTitle":"ANNUAL"}]},{"id":"9413928648921","handle":"you-can-drop-it-book","isCollective":null,"title":"\"You Can Drop It!\" 2B Mindset Book","type":"Nutrition","untranslatedTitle":"\"You Can Drop It!\" 2B Mindset Book","url":"\/products\/you-can-drop-it-book","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683217424601","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-you-can-drop-it-ilana-mulstein-diet-book.png?v=1772479730"},"price":{"amount":28.0,"currencyCode":"USD"},"sku":"MD2BINS2103","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413927764185","handle":"mbf-muscle-burns-fat","isCollective":null,"title":"#mbf + #mbfa","type":"Digital","untranslatedTitle":"#mbf + #mbfa","url":"\/products\/mbf-muscle-burns-fat","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683215032537","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-mbf-mbfa-digital-program-box-art-1x1.png?v=1772479396"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926027481","handle":"21-day-fix","isCollective":null,"title":"21 Day Fix","type":"Digital","untranslatedTitle":"21 Day Fix","url":"\/products\/21-day-fix","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683212869849","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-21-day-fix-digital-program-box-art-1x1.png?v=1772478696"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926093017","handle":"25-minute-speed-train","isCollective":null,"title":"25 Minute Speed Train","type":"Digital","untranslatedTitle":"25 Minute Speed Train","url":"\/products\/25-minute-speed-train","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683212935385","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-25-min-speed-train-digital-program-box-art-1x1.png?v=1772478699"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926125785","handle":"2b-mindset","isCollective":null,"title":"2B Mindset","type":"Digital","untranslatedTitle":"2B Mindset","url":"\/products\/2b-mindset","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683212968153","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-2b-mindset-nutrition-plan-1x1.png?v=1772478699"},"price":{"amount":59.95,"currencyCode":"USD"},"sku":"BBUS2BSTREAM102","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413923930329","handle":"2b-water-bottle","isCollective":null,"title":"2B Mindset Water Bottle","type":"Nutrition","untranslatedTitle":"2B Mindset Water Bottle","url":"\/products\/2b-water-bottle","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683208151257","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-2b-mindset-water-bottle.png?v=1772478591"},"price":{"amount":5.0,"currencyCode":"USD"},"sku":"MD2BACCBTL2101","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413923897561","handle":"2b-mindset-tracker","isCollective":null,"title":"2B Mindset® Tracker","type":"Nutrition","untranslatedTitle":"2B Mindset® Tracker","url":"\/products\/2b-mindset-tracker","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683208118489","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-2b-mindset-tracker-food-journal-en-us.png?v=1772478590"},"price":{"amount":5.0,"currencyCode":"USD"},"sku":"BBUS2BMS1001","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926158553","handle":"3-day-split","isCollective":null,"title":"3 Day Split","type":"Digital","untranslatedTitle":"3 Day Split","url":"\/products\/3-day-split","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683213000921","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-3-day-split-digital-program-box-art-1x1.png?v=1772478706"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9761342783705","handle":"30-day-booty-boost","isCollective":null,"title":"30 Day Booty Boost","type":"Digital","untranslatedTitle":"30 Day Booty Boost","url":"\/products\/30-day-booty-boost","vendor":"BODi","remoteShopId":null,"variants":[{"id":"48773657395417","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-30-day-booty-boost-digital-program-box-art.png?v=1778702727"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926289625","handle":"4-weeks-for-every-body","isCollective":null,"title":"4 Weeks for Every Body","type":"Digital","untranslatedTitle":"4 Weeks for Every Body","url":"\/products\/4-weeks-for-every-body","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683213131993","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-4-weeks-for-every-body-digital-program-box-art-1x1.png?v=1772478756"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926322393","handle":"4-weeks-of-focus","isCollective":null,"title":"4 Weeks of Focus","type":"Digital","untranslatedTitle":"4 Weeks of Focus","url":"\/products\/4-weeks-of-focus","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683213164761","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-4-weeks-of-focus-digital-program-box-art-1x1.png?v=1772478728"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926355161","handle":"645","isCollective":null,"title":"645","type":"Digital","untranslatedTitle":"645","url":"\/products\/645","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683213197529","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-645-program-digital-program-box-art-1x1.png?v=1772478816"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926387929","handle":"80-day-obsession","isCollective":null,"title":"80 Day Obsession","type":"Digital","untranslatedTitle":"80 Day Obsession","url":"\/products\/80-day-obsession","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683213230297","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-80-day-obsession-digital-program-box-art-1x1.png?v=1772478818"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926486233","handle":"9-week-control-freak","isCollective":null,"title":"9 Week Control Freak","type":"Digital","untranslatedTitle":"9 Week Control Freak","url":"\/products\/9-week-control-freak","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683213328601","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-9-week-control-freak-digital-program-box-art-1x1.png?v=1772478893"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413925109977","handle":"b-lines-resistance-bands-soft-handles","isCollective":null,"title":"B-LINES Resistance Band Soft Handles","type":"Fitness","untranslatedTitle":"B-LINES Resistance Band Soft Handles","url":"\/products\/b-lines-resistance-bands-soft-handles","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683211133145","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-b-lines-resistance-band-soft-handles.png?v=1772478647"},"price":{"amount":4.95,"currencyCode":"USD"},"sku":"MDACCBHNDL2101","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413925044441","handle":"b-lines-resistance-bands","isCollective":null,"title":"B-LINES Resistance Bands","type":"Fitness","untranslatedTitle":"B-LINES Resistance Bands","url":"\/products\/b-lines-resistance-bands","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683211002073","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-b-lines-resistance-bands-15-lbs.png?v=1772478640"},"price":{"amount":5.0,"currencyCode":"USD"},"sku":"MDACCBANDPINKH","title":"15 Pounds","untranslatedTitle":"15 Pounds"}]},{"id":"9413926584537","handle":"barre-blend","isCollective":null,"title":"Barre Blend","type":"Digital","untranslatedTitle":"Barre Blend","url":"\/products\/barre-blend","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683213426905","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-barre-blend-digital-program-box-art-1x1.png?v=1772478934"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413924651225","handle":"performance-supplement-shaker-bottle","isCollective":null,"title":"Beachbody Performance Premium Shaker Bottle","type":"Nutrition","untranslatedTitle":"Beachbody Performance Premium Shaker Bottle","url":"\/products\/performance-supplement-shaker-bottle","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683209953497","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-beachbody-performance-shaker-bottle.png?v=1772478632"},"price":{"amount":14.95,"currencyCode":"USD"},"sku":"MDACBBPCUP2101","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413925699801","handle":"strength-resistance-bands","isCollective":null,"title":"Beachbody Strength Band (Power Loop)","type":"Fitness","untranslatedTitle":"Beachbody Strength Band (Power Loop)","url":"\/products\/strength-resistance-bands","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683212083417","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-power-loop-strength-resistance-bands-light.png?v=1772478685"},"price":{"amount":5.0,"currencyCode":"USD"},"sku":"MDACCBAND2118","title":"Light","untranslatedTitle":"Light"}]},{"id":"9413925306585","handle":"core-ball","isCollective":null,"title":"Beachbody® Core Ball","type":"Fitness","untranslatedTitle":"Beachbody® Core Ball","url":"\/products\/core-ball","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683211493593","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-beachbody-core-ball.png?v=1772478667"},"price":{"amount":5.0,"currencyCode":"USD"},"sku":"MDACCBALL2125","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926617305","handle":"belle-vitale-kit","isCollective":null,"title":"Belle Vitale All-In Kit","type":"Digital","untranslatedTitle":"Belle Vitale All-In Kit","url":"\/products\/belle-vitale-kit","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683213459673","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-belle-vitale-all-in-kit-autumn.png?v=1773247160"},"price":{"amount":299.0,"currencyCode":"USD"},"sku":"BBUSBVSNS092","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9634276049113","handle":"belle-vitale","isCollective":null,"title":"Belle Vitale by Autumn Calabrese","type":"Digital","untranslatedTitle":"Belle Vitale by Autumn Calabrese","url":"\/products\/belle-vitale","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"48040136081625","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-belle-vitale-digital-program-box-art-1x1.png?v=1772479852"},"price":{"amount":299.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926650073","handle":"belle-vitale-recipes","isCollective":null,"title":"Belle Vitale Digital Recipe Book","type":"Digital","untranslatedTitle":"Belle Vitale Digital Recipe Book","url":"\/products\/belle-vitale-recipes","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683213492441","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-belle-vitale-recipe-collection.png?v=1772478912"},"price":{"amount":19.95,"currencyCode":"USD"},"sku":"BBUSBVTREC101","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926715609","handle":"bodi-lava","isCollective":null,"title":"BODi Lava","type":"Digital","untranslatedTitle":"BODi Lava","url":"\/products\/bodi-lava","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683213557977","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-bodi-lava-digital-program-box-art-1x1.png?v=1772478935"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413924716761","handle":"portion-control-containers","isCollective":null,"title":"BODi® Portion-Control 7-Piece Container Kit","type":"Nutrition","untranslatedTitle":"BODi® Portion-Control 7-Piece Container Kit","url":"\/products\/portion-control-containers","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683210019033","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-portion-control-containers.png?v=1772478633"},"price":{"amount":5.0,"currencyCode":"USD"},"sku":"MDBBCONT2105","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926748377","handle":"body-beast","isCollective":null,"title":"Body Beast","type":"Digital","untranslatedTitle":"Body Beast","url":"\/products\/body-beast","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683213590745","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-body-beast-digital-program-box-art-1x1.png?v=1772479013"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413925273817","handle":"cordless-jump-rope","isCollective":null,"title":"BOD® Rope, the Cordless Indoor Jump Rope","type":"Fitness","untranslatedTitle":"BOD® Rope, the Cordless Indoor Jump Rope","url":"\/products\/cordless-jump-rope","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683211428057","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-bod-rope.png?v=1772478664"},"price":{"amount":29.95,"currencyCode":"USD"},"sku":"MDMBFROPE2101","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413925404889","handle":"exercise-ball-buddy-ball","isCollective":null,"title":"Buddy Ball","type":"Fitness","untranslatedTitle":"Buddy Ball","url":"\/products\/exercise-ball-buddy-ball","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683211722969","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-exercise-buddy-ball.png?v=1772478671"},"price":{"amount":5.0,"currencyCode":"USD"},"sku":"MDACCBALL2124","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926813913","handle":"chop-wood-carry-water","isCollective":null,"title":"CHOP WOOD CARRY WATER","type":"Digital","untranslatedTitle":"CHOP WOOD CARRY WATER","url":"\/products\/chop-wood-carry-water","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683213656281","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-chop-wood-carry-water-digital-program-box-art-1x1.png?v=1772479019"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413925208281","handle":"control-track-resistance-bands","isCollective":null,"title":"Control Track","type":"Fitness","untranslatedTitle":"Control Track","url":"\/products\/control-track-resistance-bands","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683211329753","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-control-track.png?v=1772478661"},"price":{"amount":27.99,"currencyCode":"USD"},"sku":"MDACCTRACK2101","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413925142745","handle":"control-track-door-extender","isCollective":null,"title":"Control Track Door Extender","type":"Fitness","untranslatedTitle":"Control Track Door Extender","url":"\/products\/control-track-door-extender","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683211165913","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-control-track-door-extender-for-oversized-doors.png?v=1772478654"},"price":{"amount":10.0,"currencyCode":"USD"},"sku":"MDACCTRACK101","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926846681","handle":"dig-deeper","isCollective":null,"title":"DIG DEEPER","type":"Digital","untranslatedTitle":"DIG DEEPER","url":"\/products\/dig-deeper","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683213689049","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-dig-deeper-digital-program-box-art-1x1.png?v=1772479105"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9634276114649","handle":"dig-in","isCollective":null,"title":"DIG IN","type":"Digital","untranslatedTitle":"DIG IN","url":"\/products\/dig-in","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"48040136147161","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-dig-in-digital-program-box-art-1x1.png?v=1772479849"},"price":{"amount":9.99,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413924258009","handle":"fixate-cookbook","isCollective":null,"title":"FIXATE Cookbook","type":"Nutrition","untranslatedTitle":"FIXATE Cookbook","url":"\/products\/fixate-cookbook","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683209101529","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-fixate-cookbook-volume-1-autumn-calabrese-en-us.png?v=1772478610"},"price":{"amount":19.95,"currencyCode":"USD"},"sku":"MDBBINS2104","title":"FIXATE Cookbook Volume 1","untranslatedTitle":"FIXATE Cookbook Volume 1"}]},{"id":"9413925437657","handle":"foam-roller","isCollective":null,"title":"Foam Roller","type":"Fitness","untranslatedTitle":"Foam Roller","url":"\/products\/foam-roller","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683211755737","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-foam-roller.png?v=1772478673"},"price":{"amount":13.97,"currencyCode":"USD"},"sku":"MDACCROLL2101","title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926944985","handle":"focus-t25","isCollective":null,"title":"FOCUS T25","type":"Digital","untranslatedTitle":"FOCUS T25","url":"\/products\/focus-t25","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683214213337","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-focus-t25-digital-program-box-art-1x1.png?v=1772479112"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413926977753","handle":"for-beginners-only","isCollective":null,"title":"For Beginners Only","type":"Digital","untranslatedTitle":"For Beginners Only","url":"\/products\/for-beginners-only","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683214246105","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-for-beginners-only-digital-program-box-art-1x1.png?v=1772479122"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413927043289","handle":"glp-1-fitness-formula","isCollective":null,"title":"GLP-1 Fitness Formula","type":"Digital","untranslatedTitle":"GLP-1 Fitness Formula","url":"\/products\/glp-1-fitness-formula","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683214311641","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-glp-1-fitness-formula-digital-program-box-art-1x1.png?v=1772479126"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413927239897","handle":"insanity","isCollective":null,"title":"INSANITY","type":"Digital","untranslatedTitle":"INSANITY","url":"\/products\/insanity","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683214508249","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-insanity-digital-program-box-art-1x1.png?v=1772479238"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413927338201","handle":"insanity-max-30","isCollective":null,"title":"INSANITY MAX:30","type":"Digital","untranslatedTitle":"INSANITY MAX:30","url":"\/products\/insanity-max-30","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683214606553","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-insanity-max-30-digital-program-box-art-1x1.png?v=1772479240"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413927108825","handle":"insanity-asylum","isCollective":null,"title":"INSANITY: THE ASYLUM","type":"Digital","untranslatedTitle":"INSANITY: THE ASYLUM","url":"\/products\/insanity-asylum","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683214377177","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-insanity-the-asylum-digital-program-box-art-1x1.png?v=1772479205"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]},{"id":"9413927469273","handle":"job1","isCollective":null,"title":"Job 1","type":"Digital","untranslatedTitle":"Job 1","url":"\/products\/job1","vendor":"bodi-us-prod","remoteShopId":null,"variants":[{"id":"47683214737625","image":{"src":"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-job-1-digital-program-box-art-1x1.png?v=1772479286"},"price":{"amount":0.0,"currencyCode":"USD"},"sku":null,"title":"Default Title","untranslatedTitle":"Default Title"}]}],"purchasingCompany":null},},"https://shop.bodi.com/cdn","2d9dfbe8w1156b718pbb247b16m64115e31",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"true","themeId":"157605626073","themePublished":"true","eventMetadataId":"722eee78-5065-4f95-bacf-2aa499b01f7f","pageType":"product","resourceId":"9413928616153","shopId":"75560616153","storefrontBaseUrl":"https:\/\/shop.bodi.com","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"d5bdd5d0\", \"656605ce\"]","isMerchantRequest":"false","hashVersion":"2d9dfbe8w1156b718pbb247b16m64115e31","publish":"custom","events":"[[\"page_viewed\",{}],[\"product_viewed\",{\"productVariant\":{\"price\":{\"amount\":149.96,\"currencyCode\":\"USD\"},\"product\":{\"title\":\"Ultimate Reset\",\"vendor\":\"bodi-us-prod\",\"id\":\"9413928616153\",\"untranslatedTitle\":\"Ultimate Reset\",\"url\":\"\/products\/ultimate-reset-cleanse\",\"type\":\"Nutrition\"},\"id\":\"47683217391833\",\"image\":{\"src\":\"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-ultimate-reset-en-us.png?v=1772479737\"},\"sku\":\"MDSUCLN2101\",\"title\":\"Default Title\",\"untranslatedTitle\":\"Default Title\"}}]]"});})();</script><script>
window.ShopifyAnalytics = window.ShopifyAnalytics || {};
window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {};
window.ShopifyAnalytics.meta.currency = 'USD';
var meta = {"product":{"id":9413928616153,"gid":"gid:\/\/shopify\/Product\/9413928616153","vendor":"bodi-us-prod","type":"Nutrition","handle":"ultimate-reset-cleanse","variants":[{"id":47683217391833,"price":14996,"name":"Ultimate Reset","public_title":null,"sku":"MDSUCLN2101"}],"remote":false},"page":{"pageType":"product","resourceType":"product","resourceId":9413928616153,"requestId":"6e085e28-4b65-4495-98ab-0c6166bbbadf-1787436220"}};
for (var attr in meta) {
window.ShopifyAnalytics.meta[attr] = meta[attr];
}
</script>
<script class="analytics">
(function () {
var customDocumentWrite = function(content) {
var jquery = null;
if (window.jQuery) {
jquery = window.jQuery;
} else if (window.Checkout && window.Checkout.$) {
jquery = window.Checkout.$;
}
if (jquery) {
jquery('body').append(content);
}
};
var hasLoggedConversion = function(token) {
if (token) {
return document.cookie.indexOf('loggedConversion=' + token) !== -1;
}
return false;
}
var setCookieIfConversion = function(token) {
if (token) {
var twoMonthsFromNow = new Date(Date.now());
twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2);
document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow;
}
}
var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || [];
window.ShopifyAnalytics.lib.trekkie = window.trekkie;
if (trekkie.integrations) {
return;
}
trekkie.methods = [
'identify',
'page',
'ready',
'track',
'trackForm',
'trackLink'
];
trekkie.factory = function(method) {
return function() {
var args = Array.prototype.slice.call(arguments);
args.unshift(method);
trekkie.push(args);
if (window.__TREKKIE_SHIM_QUEUE && (method == 'track' || method == 'page')) {
try {
window.__TREKKIE_SHIM_QUEUE.push({
from: 'trekkie-stub',
method: method,
args: args.slice(1)
});
} catch (e) {
// no-op
}
}
return trekkie;
};
};
for (var i = 0; i < trekkie.methods.length; i++) {
var key = trekkie.methods[i];
trekkie[key] = trekkie.factory(key);
}
trekkie.load = function(config) {
trekkie.config = config || {};
trekkie.config.initialDocumentCookie = document.cookie;
var first = document.getElementsByTagName('script')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.onerror = function(e) {
var scriptFallback = document.createElement('script');
scriptFallback.type = 'text/javascript';
scriptFallback.onerror = function(error) {
var Monorail = {
produce: function produce(monorailDomain, schemaId, payload) {
var currentMs = new Date().getTime();
var event = {
schema_id: schemaId,
payload: payload,
metadata: {
event_created_at_ms: currentMs,
event_sent_at_ms: currentMs
}
};
return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event));
},
sendRequest: function sendRequest(endpointUrl, payload) {
// Try the sendBeacon API
if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) {
var blobData = new window.Blob([payload], {
type: 'text/plain'
});
if (window.navigator.sendBeacon(endpointUrl, blobData)) {
return true;
} // sendBeacon was not successful
} // XHR beacon
var xhr = new XMLHttpRequest();
try {
xhr.open('POST', endpointUrl);
xhr.setRequestHeader('Content-Type', 'text/plain');
xhr.send(payload);
} catch (e) {
console.log(e);
}
return false;
},
isIos12: function isIos12() {
return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1;
}
};
Monorail.produce('monorail-edge.shopifysvc.com',
'trekkie_storefront_load_errors/1.1',
{shop_id: 75560616153,
theme_id: 157605626073,
app_name: "storefront",
context_url: window.location.href,
source_url: "//shop.bodi.com/cdn/s/trekkie.storefront.7bcd7bb8195e24c65a61d69d69eb32392ed0d53f.min.js"});
};
scriptFallback.async = true;
scriptFallback.src = '//shop.bodi.com/cdn/s/trekkie.storefront.7bcd7bb8195e24c65a61d69d69eb32392ed0d53f.min.js';
first.parentNode.insertBefore(scriptFallback, first);
};
script.async = true;
script.src = '//shop.bodi.com/cdn/s/trekkie.storefront.7bcd7bb8195e24c65a61d69d69eb32392ed0d53f.min.js';
first.parentNode.insertBefore(script, first);
};
trekkie.load(
{"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":75560616153,"isMerchantRequest":null,"themeId":157605626073,"themeCityHash":"2621470347139862018","contentLanguage":"en","currency":"USD","eventMetadataId":"722eee78-5065-4f95-bacf-2aa499b01f7f"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["f43e7f5e","b5387b81","d5bdd5d0"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":true,"source":"trekkie-storefront-renderer","apiClientId":580111}}
);
var loaded = false;
trekkie.ready(function() {
if (loaded) return;
loaded = true;
window.ShopifyAnalytics.lib = window.trekkie;
var originalDocumentWrite = document.write;
document.write = customDocumentWrite;
try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {};
document.write = originalDocumentWrite;
var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/)
var token = match? match[1]: undefined;
if (!hasLoggedConversion(token)) {
setCookieIfConversion(token);
window.ShopifyAnalytics.lib.track("Viewed Product",{"currency":"USD","variantId":47683217391833,"productId":9413928616153,"productGid":"gid:\/\/shopify\/Product\/9413928616153","name":"Ultimate Reset","price":"149.96","sku":"MDSUCLN2101","brand":"bodi-us-prod","variant":null,"category":"Nutrition","nonInteraction":true,"remote":false},undefined,undefined,{"shopifyEmitted":true});
window.ShopifyAnalytics.lib.track("monorail:\/\/trekkie_storefront_viewed_product\/1.1",{"currency":"USD","variantId":47683217391833,"productId":9413928616153,"productGid":"gid:\/\/shopify\/Product\/9413928616153","name":"Ultimate Reset","price":"149.96","sku":"MDSUCLN2101","brand":"bodi-us-prod","variant":null,"category":"Nutrition","nonInteraction":true,"remote":false,"referer":"https:\/\/shop.bodi.com\/products\/ultimate-reset-cleanse"});
}
});
window.ShopifyAnalytics.lib.page(null,{"pageType":"product","resourceType":"product","resourceId":9413928616153,"requestId":"6e085e28-4b65-4495-98ab-0c6166bbbadf-1787436220","shopifyEmitted":true});
var eventsListenerScript = document.createElement('script');
eventsListenerScript.async = true;
eventsListenerScript.src = "//shop.bodi.com/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js";
document.getElementsByTagName('head')[0].appendChild(eventsListenerScript);
})();</script>
<script
defer
src="https://shop.bodi.com/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.8.4.min.js"
data-application="storefront-renderer"
data-shop-id="75560616153"
data-render-region="gcp-europe-west1"
data-page-type="product"
data-theme-instance-id="157605626073"
data-theme-name="Horizon"
data-theme-version="1.11.0"
data-monorail-region="shop_domain"
data-resource-timing-sampling-rate="10"
data-shs="true"
data-shs-beacon="true"
data-shs-export-with-fetch="true"
data-shs-logs-sample-rate="1"
data-shs-beacon-endpoint="https://shop.bodi.com/api/collect"
></script>
<meta name="shopify-y" content="30724885-5f8b-43aa-bcb9-85f71da18e64"><meta name="shopify-s" content="475c1e8b-0ed1-4858-aae0-d5941af89da1"><meta name="new-cookie-storage-activated" content="f">
</head>
<body class="page-width-narrow card-hover-effect-lift">
<a
class="skip-to-content-link button-secondary"
href="#MainContent"
>
Skip to content
</a>
<div id="header-group">
<!-- BEGIN sections: header-group -->
<div id="shopify-section-sections--21336457412825__top_banner_yKWCxN" class="shopify-section shopify-section-group-header-group"><section
class="top-banner top-banner--sticky"
style="
--top-banner-height: 40px;
--top-banner-text-color: ;
--top-banner-bg-color: #99f646;
"
>
<a href="/collections/supplements" class="top-banner__link-wrapper">
<div class="top-banner__inner">
<div
class="
group-block
group-block--height-fit
group-block--width-fill
border-style
spacing-style
size-style
"
style="
--border-width: 1px; --border-style: none;
--border-color: rgb(var(--color-border-rgb) / 1.0);
--border-radius: 0px;
--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;
--size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem;
"
data-testid="group-block"
><div class="group-block__media-wrapper">
</div>
<div
class="
group-block-content
layout-panel-flex
layout-panel-flex--row
mobile-column
"
style="--flex-direction: row; --flex-wrap: nowrap;
--gap: 12px;
--horizontal-alignment: center; --vertical-alignment: center;
--vertical-alignment-mobile: center;
"
>
<rte-formatter
class=" spacing-style text-block text-block--Ad1VsekFGUWJkbjB0U__text_m3YJJQ paragraph
rte
"
style="
--padding-block-start: 0px; --padding-block-end:0px;
--padding-inline-start:0px; --padding-inline-end:0px;
--color: var(--color-foreground);--font-weight: 500;
--width: fit-content;
--max-width: var(--max-width--body-none);
"
>
<p>Summer BODi Savings: 25% Off Supplements** <span style="text-decoration:underline"><strong>Shop Now</strong></span></p>
</rte-formatter>
<style>
</style>
</div>
</div>
<style>
</style>
</div>
</a>
</section>
<script>
(function() {
const currentScript = document.currentScript;
const sectionWrapper = currentScript?.closest('.shopify-section');
const banner =
sectionWrapper?.querySelector('.top-banner--sticky') ??
document.querySelector('.top-banner--sticky');
if (!banner) return;
const measuredElement = banner.closest('.shopify-section') ?? banner;
const rootStyle = document.documentElement.style;
const mq = window.matchMedia('(max-width: 1023px)');
const updateBannerHeights = () => {
const height = measuredElement.getBoundingClientRect().height;
rootStyle.setProperty('--top-banner-sticky-offset', `${height}px`);
rootStyle.setProperty('--mobile-banner-actual-height', mq.matches ? `${height}px` : '0px');
};
const ro = new ResizeObserver(updateBannerHeights);
ro.observe(measuredElement);
const handleViewportChange = () => {
updateBannerHeights();
};
if (typeof mq.addEventListener === 'function') {
mq.addEventListener('change', handleViewportChange);
} else {
mq.addListener(handleViewportChange);
}
updateBannerHeights();
requestAnimationFrame(updateBannerHeights);
})();
</script>
<script>
(function() {
const topBanner = document.querySelector('.top-banner');
if (!topBanner) return;
topBanner.addEventListener('click', (e) => {
const link = e.target.closest('a');
if (link && link.href && window.BODi?.trackSelectCta) {
window.BODi.trackSelectCta('select pencil banner cta', link.href);
}
});
})();
</script>
</div><div id="shopify-section-sections--21336457412825__top_banner_dWamqq" class="shopify-section shopify-section-group-header-group"></div><div id="shopify-section-sections--21336457412825__subscriptions_navigation_9KarKP" class="shopify-section shopify-section-group-header-group section-subscriptions-navigation">
</div><div id="shopify-section-sections--21336457412825__bodi_navigation_v2_CNXXwt" class="shopify-section shopify-section-group-header-group section-bodi-navigation">
<link href="//shop.bodi.com/cdn/shop/t/2/assets/bodi-navigation-v2.css?v=159511681351450557791787249607" rel="stylesheet" type="text/css" media="all" />
<!-- Desktop Navigation -->
<div class="bodi-nav-desktop">
<div class="bodi-nav__container">
<nav class="bodi-nav__bar">
<div class="bodi-nav__bar-wrapper">
<!-- Logo -->
<a
href="/"
class="bodi-nav__logo-container"
aria-label="BODI Home"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/desktop-bodi-logo.svg?v=59811868436140331341776873392"
alt="BODI Logo"
class="bodi-nav__logo"
width="120"
height="40"
>
</a>
<!-- Left Navigation Links -->
<div class="bodi-nav__links"><a
href="/collections"
class="bodi-nav__link"
data-menu-id="shop"
data-is-active="false"
>
Shop
</a><a
href="/products/bodi-subscription"
class="bodi-nav__link"
data-menu-id="view-plans"
data-is-active="false"
>
Fitness Plans
</a><a
href="https://bodi.com/app/us/en "
class="bodi-nav__link"
data-menu-id="stream"
data-is-active="false"
>
Stream
</a><a
href="https://bodi.com/us/en/experience"
class="bodi-nav__link"
data-menu-id="experience"
data-is-active="false"
>
The BODi Experience
</a></div>
<!-- Right Side Actions -->
<div class="bodi-nav__actions">
<button
class="bodi-nav__cart-container bodi-nav__cart-button"
aria-label="Open cart Total items in cart: 0"
>
<div class="bodi-nav__cart-icon">
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/desktop-cart-icon.svg?v=79287340280660578521771353645"
alt=""
class="bodi-nav__cart-img"
width="23"
height="18.4"
>
<div class="bodi-nav__badge bodi-nav__badge--hidden">
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/desktop-badge-circle.svg?v=86924748565645409331771353644"
alt=""
class="bodi-nav__badge-circle"
width="20"
height="20"
>
<span class="bodi-nav__badge-count">0</span>
</div>
</div>
</button>
<div class="bodi-nav__button-group"><a
href="https://www.bodi.com/login?authLocale=en-US"
class="bodi-nav__btn bodi-nav__btn--login"
data-bodi-auth-link
>
Login
</a>
</div>
</div>
</div>
</nav>
<!-- Categories Subnav --><div class="bodi-nav__submenu-wrapper bodi-nav__submenu-wrapper--active">
<div>
<div class="bodi-nav__category-nav">
<div class="bodi-nav__category-tabs"><div
class="bodi-nav__category-tab"
data-category="protein-supplements"
data-menu-type="mini"
>
<span class="bodi-nav__category-tab-label">
<span>Protein & Supplements</span>
</span>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/desktop-chevron-icon.svg?v=143108315141970138861771353645"
alt=""
class="bodi-nav__chevron-icon"
width="12"
height="12"
><div class="bodi-nav__mini-menu" data-mini-menu="protein-supplements">
<div class="bodi-nav__mini-menu-content"><a
href="/collections/supplements"
class="bodi-nav__mini-menu-item bodi-nav__mini-menu-item--cta"
>Shop All Supplements</a><a
href="/pages/about-p90x-sport-performance-supplements"
class="bodi-nav__mini-menu-item"
>The P90X Supplement System - <span class="violator">NEW!</span></a><a
href="/pages/about-shakeology"
class="bodi-nav__mini-menu-item"
>Shakeology</a><a
href="/collections/supplements/targetedsupplements"
class="bodi-nav__mini-menu-item"
>Targeted Supplements</a><a
href="/collections/supplements/performancesupplements"
class="bodi-nav__mini-menu-item"
>Performance Supplements</a><a
href="/collections/supplements/cleanses"
class="bodi-nav__mini-menu-item"
>Cleanses</a></div>
</div></div><a
href="/collections/nutrition-plans"
class="bodi-nav__category-tab bodi-nav__category-tab--link"
>
<span>Nutrition Plans</span>
</a><a
href="/collections/exercise-equipment"
class="bodi-nav__category-tab bodi-nav__category-tab--link"
>
<span>Equipment</span>
</a><a
href="/collections/sale"
class="bodi-nav__category-tab bodi-nav__category-tab--link"
>
<span><span class="navhighlight">Sales</span></span>
</a></div>
</div>
<!-- Mega Menu -->
<div class="bodi-nav__mega-menu">
<div class="bodi-nav__mega-menu-content"></div>
</div>
</div>
</div></div>
</div>
<!-- Mobile Navigation -->
<div class="bodi-nav-mobile">
<!-- Top Navigation -->
<div class="bodi-nav-mobile__top">
<div class="bodi-nav-mobile__left" id="bodiNavMobileHamburgerBtnV2">
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/mobile-hamburger-icon.svg?v=49414807911316717841771353646"
alt="Menu"
class="bodi-nav-mobile__hamburger"
width="24"
height="24"
></div>
<a
href="/"
class="bodi-nav-mobile__logo-container"
aria-label="BODI Home"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/bodi-mobile-logo.svg?v=56909822702469700581776873390"
alt="BODI Logo"
class="bodi-nav-mobile__logo"
width="100"
height="30"
>
</a>
<div class="bodi-nav-mobile__right">
<button
class="bodi-nav-mobile__cart-button"
aria-label="Open cart Total items in cart: 0"
>
<div class="bodi-nav-mobile__cart-icon">
<img src="//shop.bodi.com/cdn/shop/t/2/assets/mobile-cart-icon.svg?v=79287340280660578521771353644" alt="" class="bodi-nav-mobile__cart-img" width="24" height="24">
<div class="bodi-nav-mobile__cart-badge bodi-nav-mobile__cart-badge--hidden">
<img src="//shop.bodi.com/cdn/shop/t/2/assets/mobile-badge-circle.svg?v=86924748565645409331771353644" alt="" class="bodi-nav-mobile__badge-circle" width="18" height="18">
<span class="bodi-nav-mobile__badge-count">0</span>
</div>
</div>
</button>
<a
href="https://www.bodi.com/login?authLocale=en-US"
class="bodi-nav-mobile__user-button"
data-bodi-auth-link
aria-label="Login or Join BODi"
>
<div class="bodi-nav-mobile__user-avatar-container">
<img src="//shop.bodi.com/cdn/shop/t/2/assets/mobile-user-avatar.svg?v=127170688596119413491771353644" alt="" class="bodi-nav-mobile__user-avatar" width="32" height="32">
</div>
</a>
</div>
</div>
<!-- Menu Overlay -->
<div class="bodi-nav-mobile__menu-overlay" id="bodiNavMobileMenuOverlayV2">
<div class="bodi-nav-mobile__menu-container">
<!-- ════════════════════════════════════════════════════════
MAIN MENU — flat list of all tabs
════════════════════════════════════════════════════════ -->
<div class="bodi-nav-mobile__main-menu" id="bodiNavMobileMainMenuV2">
<div class="bodi-nav-mobile__close-bar">
<button class="bodi-nav-mobile__close-btn" id="bodiNavMobileCloseBtnV2" aria-label="Close menu">
<img src="//shop.bodi.com/cdn/shop/t/2/assets/mobile-close-icon.svg?v=38000291282619383831771353645" alt="" class="bodi-nav-mobile__close-icon" width="24" height="24">
</button>
</div>
<div class="bodi-nav-mobile__menu-content">
<div class="bodi-nav-mobile__tabs-section">
<div class="bodi-nav-mobile__accordion-items"><!-- Dropdown tab: opens the submenu panel -->
<button
class="bodi-nav-mobile__accordion-item bodi-nav-mobile__accordion-item--dropdown-trigger"
data-mobile-dropdown-trigger="menu_item_FDUdiT"
aria-haspopup="true"
>
<p class="bodi-nav-mobile__accordion-title">Shop</p>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/chevron-forward-green.svg?v=115281400437306312711776268628"
alt=""
class="bodi-nav-mobile__subitem-chevron"
width="12"
height="12"
>
</button><!-- Regular tab: direct link -->
<a href="/products/bodi-subscription" class="bodi-nav-mobile__accordion-item bodi-nav-mobile__accordion-item--link">
<p class="bodi-nav-mobile__accordion-title">Fitness Plans</p>
</a><!-- Regular tab: direct link -->
<a href="https://bodi.com/app/us/en " class="bodi-nav-mobile__accordion-item bodi-nav-mobile__accordion-item--link">
<p class="bodi-nav-mobile__accordion-title">Stream</p>
</a><!-- Regular tab: direct link -->
<a href="https://bodi.com/us/en/experience" class="bodi-nav-mobile__accordion-item bodi-nav-mobile__accordion-item--link">
<p class="bodi-nav-mobile__accordion-title">The BODi Experience</p>
</a></div>
</div>
<!-- Footer -->
<div class="bodi-nav-mobile__footer-section">
<div class="bodi-nav-mobile__footer-content">
<div class="bodi-nav-mobile__footer-links"><a href="/" class="bodi-nav-mobile__footer-link-item">
<span class="bodi-nav-mobile__footer-link-text">Home</span>
</a><a href="https://www.bodi.com/us/en/about" class="bodi-nav-mobile__footer-link-item">
<span class="bodi-nav-mobile__footer-link-text">About Us</span>
</a><a href="https://faq.bodi.com/?_gl=1*3mrztx*_gcl_au*NTUxOTY1MjEyLjE3NzU3NjA2NTg.*FPAU*NDMzODUzMjIwLjE3NzE1MjMwMTg." class="bodi-nav-mobile__footer-link-item">
<span class="bodi-nav-mobile__footer-link-text">BODi Support</span>
</a><a href="#chat" class="bodi-nav-mobile__footer-link-item">
<span class="bodi-nav-mobile__footer-link-text">Live Chat</span>
</a></div>
<div class="bodi-nav-mobile__bottom-content">
<div class="bodi-nav-mobile__app-badges"><a href="https://apps.apple.com/us/app/bodi-by-beachbody-home-fitness/id1031660123" aria-label="Download on the App Store">
<img src="//shop.bodi.com/cdn/shop/t/2/assets/app-store-badge.svg?v=120792209405859649841771353645" alt="Download on the App Store" class="bodi-nav-mobile__app-badge" width="120" height="40">
</a><a href="https://play.google.com/store/apps/details?id=com.beachbody.bod" aria-label="Get it on Google Play">
<img src="//shop.bodi.com/cdn/shop/t/2/assets/google-play-badge.svg?v=177291720263664549321771353646" alt="Get it on Google Play" class="bodi-nav-mobile__app-badge" width="135" height="40">
</a></div>
<div class="bodi-nav-mobile__social-media"><a href="https://instagram.com/bodi" aria-label="Follow us on Instagram" class="bodi-nav-mobile__social-link"><svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M18 0C27.941 0 36 8.059 36 18C36 27.941 27.941 36 18 36C8.059 36 0 27.941 0 18C0 8.059 8.059 0 18 0ZM19.344 7.2H16.654C15.491 7.202 14.918 7.21 14.384 7.228L14.118 7.238L13.546 7.263C12.396 7.316 11.611 7.498 10.924 7.765C10.214 8.041 9.611 8.41 9.011 9.011C8.411 9.611 8.041 10.214 7.765 10.924C7.498 11.611 7.315 12.396 7.263 13.546L7.238 14.118L7.228 14.384C7.211 14.918 7.202 15.491 7.199 16.654V19.344C7.204 21.088 7.22 21.505 7.263 22.452C7.316 23.602 7.498 24.386 7.765 25.073C8.041 25.783 8.41 26.386 9.011 26.986C9.611 27.586 10.214 27.956 10.924 28.232C11.611 28.499 12.396 28.682 13.546 28.734C13.779 28.744 13.981 28.754 14.178 28.761L14.414 28.77C15.009 28.79 15.666 28.797 17.14 28.799H19.141C20.328 28.796 20.938 28.789 21.463 28.774L21.701 28.766C21.937 28.757 22.171 28.747 22.451 28.734C23.601 28.682 24.386 28.499 25.073 28.232C25.783 27.956 26.386 27.587 26.986 26.986C27.586 26.386 27.956 25.784 28.232 25.073C28.499 24.386 28.682 23.601 28.734 22.452C28.747 22.172 28.757 21.937 28.766 21.702L28.774 21.463C28.79 20.897 28.797 20.233 28.799 18.857V16.856C28.796 15.578 28.789 14.969 28.769 14.414L28.761 14.178C28.754 13.981 28.745 13.779 28.734 13.546C28.682 12.396 28.499 11.611 28.232 10.924C27.956 10.214 27.587 9.611 26.986 9.011C26.386 8.411 25.784 8.041 25.073 7.765C24.386 7.498 23.601 7.315 22.452 7.263C21.505 7.22 21.088 7.204 19.344 7.2ZM19.118 9.145C20.448 9.147 21.034 9.155 21.606 9.175L21.81 9.183L22.363 9.207C23.416 9.255 23.988 9.431 24.369 9.579C24.873 9.775 25.232 10.009 25.61 10.387C25.988 10.765 26.222 11.125 26.418 11.629C26.566 12.009 26.742 12.581 26.79 13.634C26.8 13.838 26.807 14.016 26.814 14.187L26.822 14.391C26.843 15.001 26.851 15.627 26.852 17.155V19.118C26.85 20.448 26.842 21.034 26.822 21.606L26.814 21.81L26.79 22.363C26.742 23.416 26.566 23.988 26.418 24.369C26.222 24.873 25.988 25.232 25.61 25.61C25.232 25.988 24.873 26.222 24.369 26.418C23.988 26.566 23.416 26.742 22.363 26.79C22.16 26.8 21.982 26.807 21.81 26.814L21.606 26.822C20.996 26.843 20.371 26.851 18.842 26.852H16.88C15.55 26.85 14.964 26.842 14.392 26.822L14.188 26.814L13.635 26.79C12.582 26.742 12.01 26.566 11.63 26.418C11.126 26.222 10.766 25.988 10.388 25.61C10.01 25.232 9.776 24.873 9.58 24.369C9.432 23.988 9.256 23.416 9.208 22.363C9.198 22.16 9.191 21.982 9.184 21.81L9.176 21.606C9.155 20.996 9.147 20.371 9.146 18.842V16.88C9.148 15.55 9.156 14.964 9.176 14.392L9.184 14.188L9.208 13.635C9.256 12.582 9.432 12.01 9.58 11.63C9.776 11.126 10.01 10.766 10.388 10.388C10.766 10.01 11.126 9.776 11.63 9.58C12.01 9.432 12.582 9.256 13.635 9.208C13.839 9.198 14.017 9.191 14.188 9.184L14.392 9.176C15.002 9.155 15.628 9.147 17.156 9.146L19.118 9.145ZM17.998 12.452C14.936 12.452 12.452 14.936 12.452 17.999C12.452 21.062 14.936 23.545 17.999 23.545C21.062 23.545 23.545 21.062 23.545 17.999C23.545 14.936 21.062 12.452 17.999 12.452H17.998ZM17.998 14.398C19.987 14.398 21.598 16.01 21.598 17.998C21.598 19.987 19.987 21.598 17.998 21.598C16.01 21.598 14.398 19.987 14.398 17.998C14.398 16.01 16.01 14.398 17.998 14.398ZM23.764 10.938C23.048 10.938 22.468 11.518 22.468 12.233C22.468 12.949 23.048 13.529 23.764 13.529C24.48 13.529 25.06 12.949 25.06 12.233C25.06 11.518 24.48 10.938 23.764 10.938Z" fill="#161819"/>
</svg>
</a><a href="https://facebook.com/bodi" aria-label="Follow us on Facebook" class="bodi-nav-mobile__social-link"><svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M36 18.1097C36 8.10709 27.941 0 18 0C8.059 0 0 8.10709 0 18.1097C0 27.1484 6.582 34.6398 15.188 35.998V23.3444H10.618V18.1097H15.188V14.1205C15.188 9.58102 17.875 7.07484 21.986 7.07484C23.956 7.07484 26.016 7.42798 26.016 7.42798V11.885H23.746C21.51 11.885 20.813 13.2804 20.813 14.7121V18.1097H25.805L25.007 23.3444H20.812V36C29.419 34.6398 36 27.1484 36 18.1087" fill="#161819"/>
</svg>
</a><a href="https://youtube.com/@bodi" aria-label="Follow us on YouTube" class="bodi-nav-mobile__social-link"><svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M18 0C27.941 0 36 8.059 36 18C36 27.941 27.941 36 18 36C8.059 36 0 27.941 0 18C0 8.059 8.059 0 18 0ZM18.35 9.922H17.65C17.015 9.926 15.6 9.938 14.079 9.985L13.539 10.003C11.729 10.069 9.882 10.188 9.092 10.401C8.111 10.665 7.338 11.442 7.076 12.43C6.672 13.948 6.61 16.867 6.601 17.716V18.191C6.611 19.041 6.671 21.959 7.076 23.477C7.338 24.465 8.111 25.242 9.092 25.507C10.632 25.922 16.194 25.977 17.649 25.985H18.35C19.023 25.981 20.569 25.968 22.19 25.913L22.733 25.893C24.453 25.826 26.158 25.709 26.908 25.506C27.889 25.242 28.662 24.465 28.924 23.477C29.357 21.85 29.397 18.617 29.4 18.042V17.865C29.397 17.291 29.357 14.057 28.924 12.43C28.662 11.442 27.889 10.665 26.908 10.4C25.368 9.985 19.805 9.93 18.35 9.922ZM15.668 14.563L21.628 17.953L15.668 21.343V14.563Z" fill="#161819"/>
</svg>
</a></div>
<div class="bodi-nav-mobile__language-selector">
<div
class="locale-switcher locale-switcher--mobile "
data-current-locale-base-url="https://shop.bodi.com"
>
<button
class="locale-switcher__button"
type="button"
aria-expanded="false"
aria-haspopup="true"
data-locale-switcher-button
><img
src="//shop.bodi.com/cdn/shop/t/2/assets/us_flag.svg?v=146820449465311856841771353646"
alt="U.S. flag"
class="locale-switcher__flag"
width="20"
height="20"
>
<span class="locale-switcher__label-wrapper">
<span class="locale-switcher__label locale-switcher__label--normal">U.S. English</span>
<span class="locale-switcher__label locale-switcher__label--bold">U.S. English</span>
</span><span class="locale-switcher__chevron">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
aria-hidden="true"
>
<path
fill-rule="evenodd"
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
clip-rule="evenodd"
/>
</svg>
</span>
</button>
<div
class="locale-switcher__dropdown closed"
role="menu"
data-locale-switcher-dropdown
>
<div class="locale-switcher__dropdown-content"><a
href="https://shop-ca.bodi.com"
class="locale-switcher__option"
role="menuitem"
data-locale-code="en_CA"
data-locale-base-url="https://shop-ca.bodi.com"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/ca_flag.svg?v=140489053438850075871771353646"
alt="Canada flag"
class="locale-switcher__flag"
width="20"
height="20"
>
<span class="locale-switcher__label">CAN English</span>
</a><a
href="https://shop-ca.bodi.com/fr"
class="locale-switcher__option"
role="menuitem"
data-locale-code="fr_CA"
data-locale-base-url="https://shop-ca.bodi.com/fr"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/ca_flag.svg?v=140489053438850075871771353646"
alt="Canada flag"
class="locale-switcher__flag"
width="20"
height="20"
>
<span class="locale-switcher__label">CAN Français</span>
</a><a
href="https://shop-gb.bodi.com"
class="locale-switcher__option"
role="menuitem"
data-locale-code="en_GB"
data-locale-base-url="https://shop-gb.bodi.com"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/gb_flag.svg?v=184068840994614594711771353645"
alt="UK flag"
class="locale-switcher__flag"
width="20"
height="20"
>
<span class="locale-switcher__label">UK English</span>
</a></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ════════════════════════════════════════════════════════
SUBMENU PANEL — slides in over the main menu.
One hidden panel per dropdown tab; JS shows the right one.
Inside each panel: Shop All + accordion category list.
════════════════════════════════════════════════════════ -->
<div class="bodi-nav-mobile__submenu" id="bodiNavMobileSubmenuV2">
<div class="bodi-nav-mobile__submenu-header">
<div class="bodi-nav-mobile__submenu-header-content">
<button class="bodi-nav-mobile__back-btn" id="bodiNavMobileBackBtnV2" aria-label="Go back">
<img src="//shop.bodi.com/cdn/shop/t/2/assets/chevron-backward-green.svg?v=64003429246685634761776268627" alt="" class="bodi-nav-mobile__back-icon" width="24" height="24">
</button>
<div class="bodi-nav-mobile__submenu-title-container">
<p class="bodi-nav-mobile__submenu-title" id="bodiNavMobileSubmenuTitleV2"></p>
</div>
<button class="bodi-nav-mobile__close-btn" aria-label="Close menu">
<img src="//shop.bodi.com/cdn/shop/t/2/assets/mobile-close-white-icon.svg?v=107372894147262498891771353645" alt="" class="bodi-nav-mobile__close-icon" width="24" height="24">
</button>
</div>
</div>
<div class="bodi-nav-mobile__submenu-body" id="bodiNavMobileSubmenuBodyV2"><!-- Panel for dropdown tab: Shop -->
<div
class="bodi-nav-mobile__submenu-panel"
id="submenu-panel-menu_item_FDUdiT"
hidden
>
<div class="bodi-nav-mobile__shop-subitems"><a
href="/collections"
class="bodi-nav-mobile__shop-subitem bodi-nav-mobile__shop-subitem--link bodi-nav-mobile__shop-subitem--shop-all"
>
<span class="bodi-nav-mobile__shop-subitem-text">Shop All</span>
</a><button
class="bodi-nav-mobile__shop-subitem bodi-nav-mobile__shop-subitem--accordion"
data-mobile-accordion="protein-supplements"
aria-expanded="false"
aria-controls="accordion-panel-menu_item_FDUdiT-protein-supplements"
>
<span class="bodi-nav-mobile__shop-subitem-text">Protein & Supplements</span>
<span class="bodi-nav-mobile__accordion-toggle" aria-hidden="true">+</span>
</button>
<div
class="bodi-nav-mobile__accordion-panel"
id="accordion-panel-menu_item_FDUdiT-protein-supplements"
hidden
>
<!-- Content injected by JS from pre-rendered template -->
</div><a href="/collections/nutrition-plans" class="bodi-nav-mobile__shop-subitem bodi-nav-mobile__shop-subitem--link">
<span class="bodi-nav-mobile__shop-subitem-text">Nutrition Plans</span>
</a><a href="/collections/exercise-equipment" class="bodi-nav-mobile__shop-subitem bodi-nav-mobile__shop-subitem--link">
<span class="bodi-nav-mobile__shop-subitem-text">Equipment</span>
</a><a href="/collections/sale" class="bodi-nav-mobile__shop-subitem bodi-nav-mobile__shop-subitem--link">
<span class="bodi-nav-mobile__shop-subitem-text"><span class="navhighlight">Sales</span></span>
</a></div>
</div></div>
</div>
</div>
</div>
<!-- ════════════════════════════════════════════════════════
Pre-rendered accordion content templates (hidden, JS reads these)
════════════════════════════════════════════════════════ --><script
type="text/template"
data-category-content="protein-supplements"
data-cta-url=""
data-cta-text=""
><div class="bodi-nav-mobile__accordion-panel-items"><a href="/collections/supplements" class="bodi-nav-mobile__accordion-panel-link">
<span class="bodi-nav-mobile__accordion-panel-link-text">Shop All Supplements</span>
</a><a href="/pages/about-p90x-sport-performance-supplements" class="bodi-nav-mobile__accordion-panel-link">
<span class="bodi-nav-mobile__accordion-panel-link-text">The P90X Supplement System - <span class="violator">NEW!</span></span>
</a><a href="/pages/about-shakeology" class="bodi-nav-mobile__accordion-panel-link">
<span class="bodi-nav-mobile__accordion-panel-link-text">Shakeology</span>
</a><a href="/collections/supplements/targetedsupplements" class="bodi-nav-mobile__accordion-panel-link">
<span class="bodi-nav-mobile__accordion-panel-link-text">Targeted Supplements</span>
</a><a href="/collections/supplements/performancesupplements" class="bodi-nav-mobile__accordion-panel-link">
<span class="bodi-nav-mobile__accordion-panel-link-text">Performance Supplements</span>
</a><a href="/collections/supplements/cleanses" class="bodi-nav-mobile__accordion-panel-link">
<span class="bodi-nav-mobile__accordion-panel-link-text">Cleanses</span>
</a></div></script><script
type="text/template"
data-category-content="nutrition-plans"
data-cta-url=""
data-cta-text=""
><div class="bodi-nav-mobile__accordion-panel-items"></div></script><script
type="text/template"
data-category-content="equipment"
data-cta-url=""
data-cta-text=""
><div class="bodi-nav-mobile__accordion-panel-items"></div></script><script
type="text/template"
data-category-content="span-class-navhighlight-sales-span"
data-cta-url=""
data-cta-text=""
><div class="bodi-nav-mobile__accordion-panel-items"></div></script>
</div>
<!-- Pass navigation structure to JavaScript -->
<script>
window.bodiNavStructure = {
activeTabId: "",
categories: [{
id: "protein-supplements",
name: "Protein \u0026 Supplements",
menuType: "mini"
},
{
id: "nutrition-plans",
name: "Nutrition Plans",
menuType: "mini"
},
{
id: "equipment",
name: "Equipment",
menuType: "mini"
},
{
id: "span-class-navhighlight-sales-span",
name: "\u003cspan class=\"navhighlight\"\u003eSales\u003c\/span\u003e",
menuType: "mini"
}
]
};
</script>
<script src="//shop.bodi.com/cdn/shop/t/2/assets/bodi-navigation-v2.js?v=50864461246443612911776268627" defer></script>
</div><div id="shopify-section-sections--21336457412825__bodi_login_drawer" class="shopify-section shopify-section-group-header-group bodi-login-drawer-section"><div class="login-drawer__backdrop"></div>
<div class="login-drawer">
<div class="login-drawer__title text-heading-display-3">Login or Join BODi</div>
<div class="login-drawer__subtitle text-body-base text-bodi-gray-butters">
Workouts, nutrition, and much more.
</div>
<div class="login-drawer__buttons"><a
class="login-drawer__login-button button"
href="https://www.bodi.com/login?authLocale=en-US"
data-bodi-auth-link
>Login</a>
<a
href="https://bodi.com/offers"
class="login-drawer__join-button button button-primary"
>Join BODi</a>
</div>
<div
role="button"
class="login-drawer__close-button"
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
aria-hidden="true"
data-slot="icon"
class="size-6 stroke-[2px]"
>
<path
fill-rule="evenodd"
d="M5.47 5.47a.75.75 0 0 1 1.06 0L12 10.94l5.47-5.47a.75.75 0 1 1 1.06 1.06L13.06 12l5.47 5.47a.75.75 0 1 1-1.06 1.06L12 13.06l-5.47 5.47a.75.75 0 0 1-1.06-1.06L10.94 12 5.47 6.53a.75.75 0 0 1 0-1.06Z"
clip-rule="evenodd"
></path>
</svg>
</div>
</div>
</div><div id="shopify-section-sections--21336457412825__bodi_account_drawer" class="shopify-section shopify-section-group-header-group bodi-account-drawer-section"><div class="bodi-account-drawer__backdrop"></div>
<div class="bodi-account-drawer">
<div class="bodi-account-drawer__title text-heading-display-3">
Account & Support
</div>
<div class="bodi-account-drawer__subtitle text-body-base text-bodi-gray-butters">
Welcome back!
</div><div class="bodi-account-drawer__account-links text-body-base">
<a
class="bodi-account-drawer__account-link"
href="https://account.shop.bodi.com/profile"
>
My Account
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
>
<g clip-path="url(#clip0_4249_2907)">
<rect
opacity="0.01"
width="24"
height="24"
fill="#444646"
/>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M9.44214 5.55806C9.19806 5.31398 8.80233 5.31398 8.55825 5.55806C8.32479 5.79152 8.31464 6.16374 8.5278 6.40927L8.55825 6.44194L14.0664 11.95L8.55825 17.4581C8.32479 17.6915 8.31464 18.0637 8.5278 18.3093L8.55825 18.3419C8.79172 18.5754 9.16394 18.5856 9.40947 18.3724L9.44214 18.3419L15.3921 12.3919C15.6256 12.1585 15.6358 11.7863 15.4226 11.5407L15.3921 11.5081L9.44214 5.55806Z"
fill="#706F73"
/>
</g>
<defs>
<clipPath id="clip0_4249_2907">
<rect
width="24"
height="24"
fill="white"
/>
</clipPath>
</defs>
</svg>
</a>
<a
class="bodi-account-drawer__account-link"
href="https://account.shop.bodi.com/orders"
>
My Orders
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
>
<g clip-path="url(#clip0_4249_2907)">
<rect
opacity="0.01"
width="24"
height="24"
fill="#444646"
/>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M9.44214 5.55806C9.19806 5.31398 8.80233 5.31398 8.55825 5.55806C8.32479 5.79152 8.31464 6.16374 8.5278 6.40927L8.55825 6.44194L14.0664 11.95L8.55825 17.4581C8.32479 17.6915 8.31464 18.0637 8.5278 18.3093L8.55825 18.3419C8.79172 18.5754 9.16394 18.5856 9.40947 18.3724L9.44214 18.3419L15.3921 12.3919C15.6256 12.1585 15.6358 11.7863 15.4226 11.5407L15.3921 11.5081L9.44214 5.55806Z"
fill="#706F73"
/>
</g>
<defs>
<clipPath id="clip0_4249_2907">
<rect
width="24"
height="24"
fill="white"
/>
</clipPath>
</defs>
</svg>
</a>
<a
class="bodi-account-drawer__account-link"
href="https://shop.bodi.com/pages/subscriptions-redirect"
>
My Subscriptions
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
>
<g clip-path="url(#clip0_4249_2907)">
<rect
opacity="0.01"
width="24"
height="24"
fill="#444646"
/>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M9.44214 5.55806C9.19806 5.31398 8.80233 5.31398 8.55825 5.55806C8.32479 5.79152 8.31464 6.16374 8.5278 6.40927L8.55825 6.44194L14.0664 11.95L8.55825 17.4581C8.32479 17.6915 8.31464 18.0637 8.5278 18.3093L8.55825 18.3419C8.79172 18.5754 9.16394 18.5856 9.40947 18.3724L9.44214 18.3419L15.3921 12.3919C15.6256 12.1585 15.6358 11.7863 15.4226 11.5407L15.3921 11.5081L9.44214 5.55806Z"
fill="#706F73"
/>
</g>
<defs>
<clipPath id="clip0_4249_2907">
<rect
width="24"
height="24"
fill="white"
/>
</clipPath>
</defs>
</svg>
</a>
<a
class="bodi-account-drawer__account-link"
href="https://faq.bodi.com/"
>
BODi Support
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
>
<g clip-path="url(#clip0_4249_2907)">
<rect
opacity="0.01"
width="24"
height="24"
fill="#444646"
/>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M9.44214 5.55806C9.19806 5.31398 8.80233 5.31398 8.55825 5.55806C8.32479 5.79152 8.31464 6.16374 8.5278 6.40927L8.55825 6.44194L14.0664 11.95L8.55825 17.4581C8.32479 17.6915 8.31464 18.0637 8.5278 18.3093L8.55825 18.3419C8.79172 18.5754 9.16394 18.5856 9.40947 18.3724L9.44214 18.3419L15.3921 12.3919C15.6256 12.1585 15.6358 11.7863 15.4226 11.5407L15.3921 11.5081L9.44214 5.55806Z"
fill="#706F73"
/>
</g>
<defs>
<clipPath id="clip0_4249_2907">
<rect
width="24"
height="24"
fill="white"
/>
</clipPath>
</defs>
</svg>
</a>
</div><a
class="bodi-account-drawer__sign-out-link"
href="https://www.bodi.com/logout?authLocale=en-US"
data-bodi-auth-link
>
Sign out
</a>
<div
role="button"
class="bodi-account-drawer__close-button"
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
aria-hidden="true"
data-slot="icon"
class="size-6 stroke-[2px]"
>
<path
fill-rule="evenodd"
d="M5.47 5.47a.75.75 0 0 1 1.06 0L12 10.94l5.47-5.47a.75.75 0 1 1 1.06 1.06L13.06 12l5.47 5.47a.75.75 0 1 1-1.06 1.06L12 13.06l-5.47 5.47a.75.75 0 0 1-1.06-1.06L10.94 12 5.47 6.53a.75.75 0 0 1 0-1.06Z"
clip-rule="evenodd"
></path>
</svg>
</div>
</div>
</div>
<!-- END sections: header-group -->
</div>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/critical.js?v=174785851206309248281781245567"
type="module"
async
blocking="render"
></script>
<main
id="MainContent"
class="content-for-layout type-product"
role="main"
data-page-transition-enabled="false"
data-product-transition="false"
data-template="product.supplement"
>
<div id="shopify-section-template--21336520622297__main" class="shopify-section">
<div class="section-background color-scheme-1"></div>
<div
class=" product-information section section--page-width spacing-style color-scheme-1 relative"
style="--padding-block-start: max(20px, calc(var(--spacing-scale) * 40px));--padding-block-end: 0px; --gap: 40px;"
>
<a
class="skip-to-content-link button-secondary"
href="#ProductInformation-template--21336520622297__main"
>
Skip to product information
</a>
<div
class="product-information__grid product-information--media-left product-information__grid--half"
data-product-grid-content
>
<div
class="product-information__media"
data-testid="product-information-media"
>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/zoom-dialog.js?v=67809429400448230651771353646"
type="module"
></script><script
src="//shop.bodi.com/cdn/shop/t/2/assets/drag-zoom-wrapper.js?v=139025577638372858751771353646"
type="module"
></script><style data-shopify>
.media-fit-cover {
--product-media-fit: cover;
}
/* Media fit for all media elements */
.media-fit-cover :is(img, video, iframe, .deferred-media__poster-image) {
object-fit: cover;
width: 100%;
height: 100%;
}
/* 3D Models (no object-fit support, just sizing) */
.media-fit-cover model-viewer {
width: 100%;
height: 100%;
}
/* Add background color so carousel arrows' mix-blend-mode works correctly even on transparent areas. */
</style>
<media-gallery
class="
spacing-style
sticky-content
media-gallery--carousel
v1
"
style="--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; --thumbnail-width: 64px; --media-radius: 0px;--image-gap: 1px;"
data-presentation="carousel"
>
<!-- DEBUG:
selected_variant.id=47683217391833
selected_variant.title=Default Title
selected_variant_media.id=
sorted_media[0].id=38840057069785
extra_images.size=
-->
<slideshow-component
ref="slideshow"
style="--slideshow-timeline: --slide-1, --slide-2, --slide-3, --slide-4;"
initial-slide="0"
infinite
>
<slideshow-container ref="slideshowContainer">
<slideshow-slides
tabindex="-1"
ref="scroller"
style="scroll-snap-type: none"
>
<slideshow-slide
ref="slides[]"
aria-hidden="true"
style="view-timeline-name: --slide-1; --product-media-fit: cover;"
class="product-media-container constrain-height media-fit-cover product-media-container--image"
>
<div
class="product-media"
style="--ratio: 1.0"
data-media-id="38840057069785"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=3840" alt="Ultimate Reset cleanse" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=832 832w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=1200 1200w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=1600 1600w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=1920 1920w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=2560 2560w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=3840 3840w" width="3840" height="3840" sizes="(min-width: 95rem) 45rem, (min-width: 750px) calc(50vw - 40px - 20px - 40px), 100vw" class="product-media__image" transitionToProduct="false" data_max_resolution="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=3840" fetchpriority="high">
</div>
</slideshow-slide>
<slideshow-slide
ref="slides[]"
aria-hidden="true"
style="view-timeline-name: --slide-2; --product-media-fit: cover;"
class="product-media-container constrain-height media-fit-cover product-media-container--image"
>
<div
class="product-media"
style="--ratio: 1.0"
data-media-id="38840057102553"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=3840" alt="Ultimate Reset cleanse benefits" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=832 832w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=1200 1200w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=1600 1600w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=1920 1920w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=2560 2560w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=3840 3840w" width="3840" height="3840" sizes="(min-width: 95rem) 45rem, (min-width: 750px) calc(50vw - 40px - 20px - 40px), 100vw" class="product-media__image" transitionToProduct="false" data_max_resolution="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=3840" fetchpriority="auto">
</div>
</slideshow-slide>
<slideshow-slide
ref="slides[]"
aria-hidden="true"
style="view-timeline-name: --slide-3; --product-media-fit: cover;"
class="product-media-container constrain-height media-fit-cover product-media-container--image"
>
<div
class="product-media"
style="--ratio: 1.0"
data-media-id="38840057135321"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=3840" alt="Ultimate Reset cleanse benefits" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=832 832w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=1200 1200w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=1600 1600w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=1920 1920w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=2560 2560w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=3840 3840w" width="3840" height="3840" sizes="(min-width: 95rem) 45rem, (min-width: 750px) calc(50vw - 40px - 20px - 40px), 100vw" class="product-media__image" transitionToProduct="false" data_max_resolution="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=3840" fetchpriority="auto">
</div>
</slideshow-slide>
<slideshow-slide
ref="slides[]"
aria-hidden="true"
style="view-timeline-name: --slide-4; --product-media-fit: cover;"
class="product-media-container constrain-height media-fit-cover product-media-container--image"
>
<div
class="product-media"
style="--ratio: 1.0"
data-media-id="38840057168089"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=3840" alt="Ultimate Reset cleanse benefits" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=832 832w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=1200 1200w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=1600 1600w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=1920 1920w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=2560 2560w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=3840 3840w" width="3840" height="3840" sizes="(min-width: 95rem) 45rem, (min-width: 750px) calc(50vw - 40px - 20px - 40px), 100vw" class="product-media__image" transitionToProduct="false" data_max_resolution="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=3840" fetchpriority="auto">
</div>
</slideshow-slide>
</slideshow-slides>
</slideshow-container>
<slideshow-controls
ref="slideshowControls"
pagination-position="left"
scroll-mode="vertical"
thumbnails
class="mobile:hidden"
>
<scroll-hint
ref="thumbnailsContainer"
class="slideshow-controls__thumbnails-container"
>
<div class="slideshow-controls__thumbnails">
<button
class="slideshow-control button button-unstyled slideshow-controls__thumbnail"
aria-label="Slide 1 of 4"
on:click="/select/0"
ref="thumbnails[]"
style="--aspect-ratio:1.0;"
aria-selected="true"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=144" alt="Ultimate Reset cleanse" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=144 144w" width="144" height="144" loading="lazy">
</button>
<button
class="slideshow-control button button-unstyled slideshow-controls__thumbnail"
aria-label="Slide 2 of 4"
on:click="/select/1"
ref="thumbnails[]"
style="--aspect-ratio:1.0;"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=144" alt="Ultimate Reset cleanse benefits" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=144 144w" width="144" height="144" loading="lazy">
</button>
<button
class="slideshow-control button button-unstyled slideshow-controls__thumbnail"
aria-label="Slide 3 of 4"
on:click="/select/2"
ref="thumbnails[]"
style="--aspect-ratio:1.0;"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=144" alt="Ultimate Reset cleanse benefits" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=144 144w" width="144" height="144" loading="lazy">
</button>
<button
class="slideshow-control button button-unstyled slideshow-controls__thumbnail"
aria-label="Slide 4 of 4"
on:click="/select/3"
ref="thumbnails[]"
style="--aspect-ratio:1.0;"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=144" alt="Ultimate Reset cleanse benefits" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=144 144w" width="144" height="144" loading="lazy">
</button>
</div>
</scroll-hint>
</slideshow-controls>
<style>
.d-none{
display:none;
}
</style>
<slideshow-controls
ref="slideshowControls"
pagination-position="center"
scroll-mode="horizontal"
controls-on-media
class="desktop:hidden media-gallery__mobile-controls"
>
<ol class="slideshow-controls__dots">
<li>
<button
class="slideshow-control button button-unstyled"
style="animation-timeline: --slide-1"
aria-label="Slide 1 of 4"
on:click="/select/0"
ref="dots[]"
aria-selected="true"
>
1
</button>
</li>
<li>
<button
class="slideshow-control button button-unstyled"
style="animation-timeline: --slide-2"
aria-label="Slide 2 of 4"
on:click="/select/1"
ref="dots[]"
>
2
</button>
</li>
<li>
<button
class="slideshow-control button button-unstyled"
style="animation-timeline: --slide-3"
aria-label="Slide 3 of 4"
on:click="/select/2"
ref="dots[]"
>
3
</button>
</li>
<li>
<button
class="slideshow-control button button-unstyled"
style="animation-timeline: --slide-4"
aria-label="Slide 4 of 4"
on:click="/select/3"
ref="dots[]"
>
4
</button>
</li>
</ol>
</slideshow-controls>
<style>
.d-none{
display:none;
}
</style>
</slideshow-component>
<div class="product-media-hover-icon" aria-hidden="true">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" class="size-3">
<path stroke-linecap="round" stroke-linejoin="round" d="M4.5 10.5 12 3m0 0 7.5 7.5M12 3v18"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" class="size-3">
<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 13.5 12 21m0 0-7.5-7.5M12 21V3"></path>
</svg>
</div>
<div class="product-gallery-arrows-wrapper mobile:hidden">
<button
class="product-gallery-arrow product-gallery-arrow--previous button button-unstyled"
aria-label="Previous slide"
onclick="const slideshow = document.querySelector('slideshow-component[ref=slideshow]'); if(slideshow && slideshow.previous) slideshow.previous();"
>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" data-slot="icon" class="size-6">
<path fill-rule="evenodd" d="M11.78 5.22a.75.75 0 0 1 0 1.06L8.06 10l3.72 3.72a.75.75 0 1 1-1.06 1.06l-4.25-4.25a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Z" clip-rule="evenodd"></path>
</svg>
</button>
<button
class="product-gallery-arrow product-gallery-arrow--next button button-unstyled"
aria-label="Next slide"
onclick="const slideshow = document.querySelector('slideshow-component[ref=slideshow]'); if(slideshow && slideshow.next) slideshow.next();"
>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" data-slot="icon" class="size-6">
<path fill-rule="evenodd" d="M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z" clip-rule="evenodd"></path>
</svg>
</button>
</div>
<zoom-dialog
ref="zoomDialogComponent"
id="zoom-dialog-"
>
<dialog
ref="dialog"
on:keydown="/handleKeyDown"
scroll-lock
>
<button
type="button"
class="button button-unstyled close-button dialog-zoomed-gallery__close-button"
aria-label="Close"
on:click="/close"
>
<span class="visually-hidden">Close</span>
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<div class="dialog-thumbnails-list-container">
<scroll-hint
class="dialog-thumbnails-list list-unstyled"
ref="thumbnails"
>
<button
type="button"
class="button button-unstyled dialog-thumbnails-list__thumbnail"
aria-label="Scroll to Ultimate Reset cleanse"
on:click="/handleThumbnailClick/0"
on:pointerenter="/handleThumbnailPointerEnter/0"
style="--aspect-ratio: 1.0; --gallery-aspect-ratio: 1.0;"
aria-selected="true"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=1024" alt="Ultimate Reset cleanse" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=832 832w" width="1024" height="1024" loading="lazy" sizes="auto, 110, (min-width: 750px) 160">
</button>
<button
type="button"
class="button button-unstyled dialog-thumbnails-list__thumbnail"
aria-label="Scroll to Ultimate Reset cleanse benefits"
on:click="/handleThumbnailClick/1"
on:pointerenter="/handleThumbnailPointerEnter/1"
style="--aspect-ratio: 1.0; --gallery-aspect-ratio: 1.0;"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=1024" alt="Ultimate Reset cleanse benefits" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=832 832w" width="1024" height="1024" loading="lazy" sizes="auto, 110, (min-width: 750px) 160">
</button>
<button
type="button"
class="button button-unstyled dialog-thumbnails-list__thumbnail"
aria-label="Scroll to Ultimate Reset cleanse benefits"
on:click="/handleThumbnailClick/2"
on:pointerenter="/handleThumbnailPointerEnter/2"
style="--aspect-ratio: 1.0; --gallery-aspect-ratio: 1.0;"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=1024" alt="Ultimate Reset cleanse benefits" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=832 832w" width="1024" height="1024" loading="lazy" sizes="auto, 110, (min-width: 750px) 160">
</button>
<button
type="button"
class="button button-unstyled dialog-thumbnails-list__thumbnail"
aria-label="Scroll to Ultimate Reset cleanse benefits"
on:click="/handleThumbnailClick/3"
on:pointerenter="/handleThumbnailPointerEnter/3"
style="--aspect-ratio: 1.0; --gallery-aspect-ratio: 1.0;"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=1024" alt="Ultimate Reset cleanse benefits" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=832 832w" width="1024" height="1024" loading="lazy" sizes="auto, 110, (min-width: 750px) 160">
</button>
</scroll-hint>
</div>
<ul
class="dialog-zoomed-gallery list-unstyled"
><li
id="product-38840057069785-1"
class="product-media-container constrain-height media-fit-cover product-media-container--image product-media-container--zoomable"
style=" --media-preview-ratio: 1.0;"
ref="media[]"
on:click="/close"
>
<drag-zoom-wrapper class="product-media__drag-zoom-wrapper">
<div
class="product-media"
style="--ratio: 1.0"
data-media-id="38840057069785"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=3840" alt="Ultimate Reset cleanse" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=832 832w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=1200 1200w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=1600 1600w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=1920 1920w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=2560 2560w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=3840 3840w" width="3840" height="3840" loading="lazy" sizes="100vw" class="product-media__image" transitionToProduct="false" data_max_resolution="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=3840" fetchpriority="high">
</div>
</drag-zoom-wrapper>
</li><li
id="product-38840057102553-2"
class="product-media-container constrain-height media-fit-cover product-media-container--image product-media-container--zoomable"
style=" --media-preview-ratio: 1.0;"
ref="media[]"
on:click="/close"
>
<drag-zoom-wrapper class="product-media__drag-zoom-wrapper">
<div
class="product-media"
style="--ratio: 1.0"
data-media-id="38840057102553"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=3840" alt="Ultimate Reset cleanse benefits" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=832 832w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=1200 1200w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=1600 1600w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=1920 1920w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=2560 2560w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=3840 3840w" width="3840" height="3840" loading="lazy" sizes="100vw" class="product-media__image" transitionToProduct="false" data_max_resolution="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=3840" fetchpriority="auto">
</div>
</drag-zoom-wrapper>
</li><li
id="product-38840057135321-3"
class="product-media-container constrain-height media-fit-cover product-media-container--image product-media-container--zoomable"
style=" --media-preview-ratio: 1.0;"
ref="media[]"
on:click="/close"
>
<drag-zoom-wrapper class="product-media__drag-zoom-wrapper">
<div
class="product-media"
style="--ratio: 1.0"
data-media-id="38840057135321"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=3840" alt="Ultimate Reset cleanse benefits" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=832 832w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=1200 1200w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=1600 1600w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=1920 1920w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=2560 2560w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=3840 3840w" width="3840" height="3840" loading="lazy" sizes="100vw" class="product-media__image" transitionToProduct="false" data_max_resolution="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=3840" fetchpriority="auto">
</div>
</drag-zoom-wrapper>
</li><li
id="product-38840057168089-4"
class="product-media-container constrain-height media-fit-cover product-media-container--image product-media-container--zoomable"
style=" --media-preview-ratio: 1.0;"
ref="media[]"
on:click="/close"
>
<drag-zoom-wrapper class="product-media__drag-zoom-wrapper">
<div
class="product-media"
style="--ratio: 1.0"
data-media-id="38840057168089"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=3840" alt="Ultimate Reset cleanse benefits" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=832 832w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=1200 1200w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=1600 1600w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=1920 1920w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=2560 2560w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=3840 3840w" width="3840" height="3840" loading="lazy" sizes="100vw" class="product-media__image" transitionToProduct="false" data_max_resolution="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=3840" fetchpriority="auto">
</div>
</drag-zoom-wrapper>
</li></ul>
</dialog>
</zoom-dialog><div class="gallery-modal-wrapper">
<div class="gallery-modal-modal" id="galleryModal">
<div class="gallery-modal-content">
<button class="gallery-modal-close" id="galleryModalClose" type="button" aria-label="Close">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" class="size-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12"></path>
</svg>
</button>
<div class="gallery-modal-zoom-controls" id="galleryModalZoomControls">
<button id="galleryModalZoomIn" type="button" aria-label="Zoom in">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" class="size-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 4.5v15m7.5-7.5h-15"></path>
</svg>
</button>
<button id="galleryModalZoomOut" type="button" aria-label="Zoom out">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" class="size-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M5 12h14"></path>
</svg>
</button>
</div>
<div class="gallery-modal-pinch-overlay" id="galleryModalPinchOverlay">
<svg width="65" height="64" viewBox="0 0 65 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2008_17434)">
<path d="M2.07281 12.2709C2.66865 12.7178 3.52177 12.5959 3.96865 12.0001L5.59365 9.83341V17.9584C5.59365 18.7032 6.20302 19.3126 6.94781 19.3126C7.6926 19.3126 8.30198 18.7032 8.30198 17.9584V9.83341L9.92698 12.0001C10.3739 12.5959 11.227 12.7178 11.8228 12.2709C12.4186 11.824 12.5405 10.9709 12.0936 10.3751L8.03115 4.95841C7.77385 4.61987 7.3676 4.41675 6.94781 4.41675C6.52802 4.41675 6.12177 4.61987 5.86448 4.95841L1.80198 10.3751C1.3551 10.9709 1.47698 11.824 2.07281 12.2709Z" fill="#BDBDBD"/>
<path d="M1.8021 36.4022L5.8646 41.8189C6.37918 42.496 7.51669 42.496 8.03127 41.8189L12.0938 36.4022C12.5406 35.8064 12.4188 34.9533 11.8229 34.5064C11.2271 34.0595 10.374 34.1814 9.9271 34.7772L8.3021 36.9439V28.8189C8.3021 28.0741 7.69273 27.4647 6.94793 27.4647C6.20314 27.4647 5.59377 28.0741 5.59377 28.8189V36.9439L3.96877 34.7772C3.69793 34.4251 3.29168 34.2356 2.88543 34.2356C2.60106 34.2356 2.31668 34.3303 2.07293 34.5064C1.4771 34.9533 1.35523 35.8064 1.8021 36.4022Z" fill="#BDBDBD"/>
<path d="M40.802 24.7292C40.3009 24.7292 39.827 24.4583 39.5832 23.9844L36.9967 18.7979C36.2384 18.5542 33.8686 18.7167 32.6092 19.7458C32.0134 20.2333 31.8509 20.775 32.0811 21.5604C32.2978 22.2781 31.8915 23.0365 31.1738 23.2396C30.4561 23.4562 29.6978 23.05 29.4947 22.3323C28.7499 19.8542 29.9415 17.7281 32.6499 16.6448C34.803 15.7917 38.4051 15.5615 39.3124 17.349L42.0207 22.7656C42.3592 23.4292 42.0884 24.2417 41.4113 24.5802C41.2217 24.675 41.0051 24.7292 40.802 24.7292Z" fill="#BDBDBD"/>
<path d="M48.25 21.9802C47.7354 21.9802 47.2479 21.6959 47.0177 21.1948C47.0177 21.1813 46.3677 19.8 45.1084 17.4302C44.7021 17.2813 43.5104 17.2 42.3052 17.7552C41.2219 18.2427 40.5719 19.0552 40.3688 20.1521C40.2334 20.8833 39.5292 21.3709 38.7844 21.2354C38.0531 21.1 37.5656 20.3959 37.7011 19.6511C38.2834 16.5365 40.8969 15.0469 43.1448 14.7084C44.6615 14.4781 46.6927 14.6677 47.3834 15.9813C48.7375 18.5406 49.4281 20.0031 49.4552 20.0709C49.7667 20.7479 49.4688 21.5604 48.7917 21.8719C48.6021 21.9531 48.4125 21.9938 48.2229 21.9938L48.25 21.9802Z" fill="#BDBDBD"/>
<path d="M43.5103 58.5834C35.9812 58.5834 32.5958 55.9699 27.477 52.0157C26.7322 51.4334 25.9468 50.8241 25.0937 50.1876C18.4718 45.2178 13.3801 43.647 13.326 43.6334C12.7572 43.4574 12.3645 42.9293 12.3645 42.3334C12.3645 38.0949 15.9124 35.5626 21.8437 35.5626C24.9718 35.5626 29.3051 37.0386 30.9301 38.6636C31.4583 39.1918 31.4583 40.0449 30.9301 40.573C30.402 41.1011 29.5489 41.1011 29.0208 40.573C28.0051 39.5574 24.4166 38.2574 21.8572 38.2574C20.002 38.2574 15.926 38.5824 15.1947 41.3991C17.1312 42.1303 21.451 44.0397 26.7322 48.0074C27.5853 48.6574 28.3843 49.2668 29.1426 49.8491C33.9905 53.6001 36.9155 55.8616 43.5239 55.8616C52.976 55.8616 60.8843 47.6824 61.128 40.9116C61.128 35.9282 56.8624 23.7136 54.5603 20.0032C53.6395 18.5136 52.5833 17.6741 51.5135 17.5386C50.3218 17.4032 49.2385 18.1886 48.5478 18.8928C48.0197 19.4209 47.1666 19.4209 46.6385 18.8928C46.1103 18.3647 46.1103 17.5116 46.6385 16.9834C48.2364 15.3855 50.0374 14.6407 51.8385 14.8574C53.1791 15.0199 55.1426 15.7918 56.876 18.5814C59.1103 22.197 63.8499 35.1022 63.8499 40.9657C63.4978 50.7428 52.4614 58.5699 43.5374 58.5699L43.5103 58.5834Z" fill="#BDBDBD"/>
<path d="M29.9688 42.3334C29.6167 42.3334 29.2781 42.198 29.0073 41.9407C28.4927 41.4261 28.4792 40.5865 28.9802 40.0584C29.0344 39.9771 29.5896 39.1917 28.7636 37.5261L14.45 12.5417C12.974 9.95528 13.8 6.65111 16.2917 5.14798C17.4834 4.43028 18.9052 4.22715 20.2594 4.57923C21.6677 4.94486 22.8594 5.83861 23.6042 7.09798L35.1959 26.7469C35.575 27.3969 35.3584 28.223 34.7219 28.6022C34.0854 28.9813 33.2459 28.7647 32.8667 28.1282L21.275 8.47923C20.8959 7.84278 20.3 7.3959 19.5959 7.20632C18.9323 7.04382 18.2552 7.13861 17.6865 7.47715C16.4406 8.22194 16.0479 9.88757 16.7927 11.2011L31.1334 36.2397C32.5823 39.1376 31.675 41.1688 30.9167 41.9272C30.6459 42.198 30.3073 42.3199 29.9552 42.3199L29.9688 42.3334Z" fill="#BDBDBD"/>
</g>
<defs>
<clipPath id="clip0_2008_17434">
<rect width="62.2917" height="54.1667" fill="white" transform="translate(1.53125 4.41669)"/>
</clipPath>
</defs>
</svg>
<p class="gallery-modal-pinch-text">Pinch to zoom</p>
</div>
<div class="gallery-modal-carousel-wrapper">
<div class="gallery-modal-carousel" id="galleryModalCarousel">
<div class="gallery-modal-slide" data-index="0">
<div class="gallery-modal-zoom-container">
<img
src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=2048"
srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=640 640w,
//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=1024 1024w,
//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=1536 1536w,
//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=2048 2048w"
sizes="100vw"
alt="Ultimate Reset cleanse"
class="gallery-modal-image"
loading="lazy"
>
</div>
</div>
<div class="gallery-modal-slide" data-index="1">
<div class="gallery-modal-zoom-container">
<img
src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=2048"
srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=640 640w,
//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=1024 1024w,
//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=1536 1536w,
//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736&width=2048 2048w"
sizes="100vw"
alt="Ultimate Reset cleanse benefits"
class="gallery-modal-image"
loading="lazy"
>
</div>
</div>
<div class="gallery-modal-slide" data-index="2">
<div class="gallery-modal-zoom-container">
<img
src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=2048"
srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=640 640w,
//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=1024 1024w,
//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=1536 1536w,
//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736&width=2048 2048w"
sizes="100vw"
alt="Ultimate Reset cleanse benefits"
class="gallery-modal-image"
loading="lazy"
>
</div>
</div>
<div class="gallery-modal-slide" data-index="3">
<div class="gallery-modal-zoom-container">
<img
src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=2048"
srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=640 640w,
//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=1024 1024w,
//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=1536 1536w,
//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736&width=2048 2048w"
sizes="100vw"
alt="Ultimate Reset cleanse benefits"
class="gallery-modal-image"
loading="lazy"
>
</div>
</div>
</div>
</div>
<button class="gallery-modal-arrow gallery-modal-prev" id="galleryModalPrev" type="button" aria-label="Translation missing: en.actions.previous">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
<path fill-rule="evenodd" d="M11.78 5.22a.75.75 0 0 1 0 1.06L8.06 10l3.72 3.72a.75.75 0 1 1-1.06 1.06l-4.25-4.25a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Z" clip-rule="evenodd"></path>
</svg>
</button>
<button class="gallery-modal-arrow gallery-modal-next" id="galleryModalNext" type="button" aria-label="Translation missing: en.actions.next">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
<path fill-rule="evenodd" d="M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z" clip-rule="evenodd"></path>
</svg>
</button>
<div class="gallery-modal-dots" id="galleryModalDots"></div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/@panzoom/panzoom@4.6.1/dist/panzoom.min.js"></script>
<script>
(function() {
function initProductGalleryModal() {
const modal = document.getElementById("galleryModal");
const closeBtn = document.getElementById("galleryModalClose");
const carousel = document.getElementById("galleryModalCarousel");
const slides = document.querySelectorAll(".gallery-modal-slide:not(.gallery-modal-slide-clone)");
const dotsContainer = document.getElementById("galleryModalDots");
const prevBtn = document.getElementById("galleryModalPrev");
const nextBtn = document.getElementById("galleryModalNext");
const zoomInBtn = document.getElementById("galleryModalZoomIn");
const zoomOutBtn = document.getElementById("galleryModalZoomOut");
if (!modal || !carousel || slides.length === 0) return;
if (modal.parentElement && modal.parentElement.tagName !== 'BODY') {
document.body.appendChild(modal);
}
let currentSlide = 0;
let isTransitioning = false;
let index = 0;
const originalSlides = slides;
let cloneCount = 0;
const pzMap = new WeakMap();
function getAllSlides() {
return Array.from(carousel.querySelectorAll('.gallery-modal-slide'));
}
function getPZ(slideEl) {
const img = slideEl && slideEl.querySelector('img');
return img ? pzMap.get(img) : null;
}
function initZoomContainers() {
for (const slide of getAllSlides()) {
const container = slide.querySelector('.gallery-modal-zoom-container');
const img = slide.querySelector('img');
if (container && img && !pzMap.has(img)) {
const pz = Panzoom(img, {
maxScale: 4,
minScale: 1,
panOnlyWhenZoomed: true,
cursor: 'pointer',
handleStartEvent: (e) => {
if (pz.getScale() > 1) {
e.preventDefault();
e.stopPropagation();
}
}
});
img.addEventListener('panzoomchange', (e) => {
container.classList.toggle('gallery-modal-zoom-container--active', e.detail.scale > 1);
});
img.addEventListener('panzoomend', () => {
if (pz.getScale() <= 1.05) pz.reset({ animate: true });
});
container.addEventListener('wheel', (e) => {
e.preventDefault();
const direction = e.deltaY < 0 ? 1 : -1;
const newScale = pz.getScale() * Math.exp((direction * 0.3) / 3);
const clamped = Math.min(Math.max(newScale, 1), 4);
if (clamped <= 1.05) {
pz.reset({ animate: false });
} else {
pz.zoom(clamped, { animate: false });
}
}, { passive: false });
let lastTap = 0;
container.addEventListener('click', (e) => {
const now = Date.now();
const gap = now - lastTap;
lastTap = now;
if (gap <= 0 || gap > 350) return;
e.preventDefault();
e.stopPropagation();
if (pz.getScale() > 1) {
pz.reset({ animate: true });
} else {
pz.zoomToPoint(2.5, e, { animate: true });
}
});
pzMap.set(img, pz);
}
}
}
function resetAllZoomContainers() {
for (const slide of getAllSlides()) {
const pz = getPZ(slide);
if (pz) pz.reset();
}
}
function setupInfiniteLoop() {
carousel.querySelectorAll('.gallery-modal-slide[data-clone]').forEach(el => el.remove());
cloneCount = 1;
const lastClone = originalSlides[originalSlides.length - 1].cloneNode(true);
lastClone.classList.add('gallery-modal-slide-clone');
lastClone.setAttribute('data-clone', 'last');
lastClone.setAttribute('aria-hidden', 'true');
carousel.insertBefore(lastClone, carousel.firstChild);
const firstClone = originalSlides[0].cloneNode(true);
firstClone.classList.add('gallery-modal-slide-clone');
firstClone.setAttribute('data-clone', 'first');
firstClone.setAttribute('aria-hidden', 'true');
carousel.appendChild(firstClone);
index = cloneCount;
}
setupInfiniteLoop();
initZoomContainers();
function createDots() {
if (!dotsContainer) return;
dotsContainer.innerHTML = '';
for (let i = 0; i < originalSlides.length; i++) {
const dot = document.createElement('button');
dot.setAttribute('aria-label', `Go to slide ${i + 1}`);
dot.classList.toggle('active', i === 0);
dot.addEventListener('click', () => {
index = i + cloneCount;
currentSlide = i;
updatePosition();
});
dotsContainer.appendChild(dot);
}
}
createDots();
function syncGallerySlideshow(slideIndex) {
if (!modal.classList.contains('active')) return;
const slideshow = document.querySelector('slideshow-component[ref=slideshow]');
if (slideshow && typeof slideshow.select === 'function') {
slideshow.select(slideIndex, undefined, { animate: false });
}
}
function updateDots() {
if (!dotsContainer) return;
let di = currentSlide;
if (di < 0) di = originalSlides.length - 1;
if (di >= originalSlides.length) di = 0;
dotsContainer.querySelectorAll("button").forEach((d, i) => {
d.classList.toggle("active", i === di);
});
syncGallerySlideshow(di);
}
function updatePosition(withTransition = true) {
resetAllZoomContainers();
const all = getAllSlides();
if (all.length === 0) return;
const slideWidth = all[0].offsetWidth;
const tx = index * slideWidth;
if (!withTransition) carousel.style.transition = 'none';
carousel.style.transform = `translateX(-${tx}px)`;
if (!withTransition) {
carousel.offsetHeight; // force reflow
carousel.style.transition = '';
}
updateDots();
}
setTimeout(() => updatePosition(false), 0);
function handleInfiniteLoop() {
if (index >= originalSlides.length + cloneCount) {
const offset = index - (originalSlides.length + cloneCount);
index = cloneCount + offset;
currentSlide = offset;
updatePosition(false);
} else if (index < cloneCount) {
const offset = cloneCount - index;
index = originalSlides.length + cloneCount - offset;
currentSlide = originalSlides.length - offset;
updatePosition(false);
}
}
function movePrev() {
if (isTransitioning) return;
isTransitioning = true;
index--;
const ri = index - cloneCount;
if (ri >= 0 && ri < originalSlides.length) currentSlide = ri;
updatePosition();
setTimeout(() => { handleInfiniteLoop(); isTransitioning = false; }, 350);
}
function moveNext() {
if (isTransitioning) return;
isTransitioning = true;
index++;
const ri = index - cloneCount;
if (ri >= 0 && ri < originalSlides.length) currentSlide = ri;
updatePosition();
setTimeout(() => { handleInfiniteLoop(); isTransitioning = false; }, 350);
}
function closeModal() {
let di = currentSlide;
if (di < 0) di = originalSlides.length - 1;
if (di >= originalSlides.length) di = 0;
syncGallerySlideshow(di);
modal.classList.remove("active");
resetAllZoomContainers();
}
if (closeBtn) closeBtn.addEventListener("click", closeModal);
modal.addEventListener("click", (e) => { if (e.target === modal) closeModal(); });
document.addEventListener("keydown", (e) => {
if (e.key === "Escape" && modal.classList.contains("active")) closeModal();
});
if (nextBtn) nextBtn.addEventListener("click", moveNext);
if (prevBtn) prevBtn.addEventListener("click", movePrev);
window.addEventListener("keydown", (e) => {
if (!modal.classList.contains("active") || isTransitioning) return;
if (e.key === "ArrowRight") moveNext();
else if (e.key === "ArrowLeft") movePrev();
});
let swipeStartX = 0;
let swipeStartY = 0;
let swipeStartTime = 0;
let isSwiping = false;
let swipeAborted = false;
carousel.addEventListener('touchstart', (e) => {
if (e.touches.length !== 1) return;
const pz = getPZ(getAllSlides()[index]);
if (pz && pz.getScale() > 1) return;
swipeStartX = e.touches[0].clientX;
swipeStartY = e.touches[0].clientY;
swipeStartTime = Date.now();
isSwiping = true;
swipeAborted = false;
carousel.style.transition = 'none';
}, { passive: true });
carousel.addEventListener('touchmove', (e) => {
if (!isSwiping || swipeAborted) return;
const pz = getPZ(getAllSlides()[index]);
if (pz && pz.getScale() > 1) {
swipeAborted = true;
carousel.style.transition = '';
updatePosition(false);
return;
}
const dx = e.touches[0].clientX - swipeStartX;
const dy = e.touches[0].clientY - swipeStartY;
if (Math.abs(dy) > Math.abs(dx) && Math.abs(dy) > 8) {
swipeAborted = true;
carousel.style.transition = '';
updatePosition(false);
return;
}
const all = getAllSlides();
if (all.length === 0) return;
const slideWidth = all[0].offsetWidth;
const baseTx = index * slideWidth;
carousel.style.transform = `translateX(-${baseTx - dx}px)`;
}, { passive: true });
carousel.addEventListener('touchend', (e) => {
if (!isSwiping) return;
isSwiping = false;
carousel.style.transition = '';
if (swipeAborted) return;
const dx = e.changedTouches[0].clientX - swipeStartX;
const elapsed = Date.now() - swipeStartTime;
const velocity = Math.abs(dx) / elapsed;
const threshold = 50;
const velocityThreshold = 0.4;
if (dx < -threshold || (dx < -10 && velocity > velocityThreshold)) {
moveNext();
} else if (dx > threshold || (dx > 10 && velocity > velocityThreshold)) {
movePrev();
} else {
updatePosition();
}
}, { passive: true });
if (zoomInBtn) {
zoomInBtn.addEventListener("click", () => {
const pz = getPZ(getAllSlides()[index]);
if (pz) pz.zoomIn({ animate: true });
});
}
if (zoomOutBtn) {
zoomOutBtn.addEventListener("click", () => {
const pz = getPZ(getAllSlides()[index]);
if (!pz) return;
if (pz.getScale() <= 1.05) {
pz.reset({ animate: true });
} else {
pz.zoomOut({ animate: true });
setTimeout(() => {
if (pz.getScale() <= 1.05) pz.reset({ animate: true });
}, 200);
}
});
}
carousel.addEventListener('touchstart', (e) => {
if (e.touches.length === 2) {
const pinchOverlay = document.getElementById('galleryModalPinchOverlay');
if (pinchOverlay) pinchOverlay.classList.add('show');
}
}, { passive: true });
carousel.addEventListener('touchend', () => {
const pinchOverlay = document.getElementById('galleryModalPinchOverlay');
if (pinchOverlay) setTimeout(() => pinchOverlay.classList.remove('show'), 1000);
}, { passive: true });
window.galleryModalGoToSlide = function(slideIndex) {
index = slideIndex + cloneCount;
currentSlide = slideIndex;
updatePosition(false);
};
window.galleryModalShowPinchOverlay = function() {
if (window.innerWidth <= 749) {
const pinchOverlay = document.getElementById('galleryModalPinchOverlay');
if (pinchOverlay) {
pinchOverlay.classList.add('show');
setTimeout(() => pinchOverlay.classList.remove('show'), 1000);
}
}
};
}
window.initProductGalleryModal = initProductGalleryModal;
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initProductGalleryModal);
} else {
initProductGalleryModal();
}
})();
</script>
</media-gallery>
<script>
(function() {
function openProductMediaGallery(slideIndex = 0) {
const galleryModal = document.getElementById('galleryModal');
if (galleryModal) {
galleryModal.classList.add('active');
if (window.galleryModalGoToSlide && typeof window.galleryModalGoToSlide === 'function') {
window.galleryModalGoToSlide(slideIndex);
}
if (window.galleryModalShowPinchOverlay && typeof window.galleryModalShowPinchOverlay === 'function') {
window.galleryModalShowPinchOverlay();
}
return true;
}
return false;
}
function getCurrentSlideIndex() {
const slideshow = document.querySelector('slideshow-component[ref=slideshow]');
if (slideshow && typeof slideshow.current === 'number') return slideshow.current;
return 0;
}
// Use event delegation so handlers survive variant-driven DOM replacement.
if (!window._galleryDelegationAttached) {
window._galleryDelegationAttached = true;
document.addEventListener('click', function(e) {
// Hover icon click → open at current slide
if (e.target.closest('.product-media-hover-icon')) {
e.preventDefault();
e.stopPropagation();
openProductMediaGallery(getCurrentSlideIndex());
return;
}
// Image inside a media container click → open at that container's index
const img = e.target.closest('.product-media-container img, .media-gallery-slide img');
if (img) {
// Skip clicks that are inside the gallery modal itself
if (img.closest('#galleryModal')) return;
e.preventDefault();
e.stopPropagation();
const container = img.closest('.product-media-container, .media-gallery-slide');
const allContainers = Array.from(
document.querySelectorAll('.product-media-container:not(#galleryModal *), .media-gallery-slide:not(#galleryModal *)')
);
const index = allContainers.indexOf(container);
openProductMediaGallery(index >= 0 ? index : 0);
}
});
// Re-initialize the gallery modal after a variant update replaces the media-gallery element.
document.addEventListener('variant:update', function() {
// Allow the new <media-gallery> markup to be inserted into the DOM first.
requestAnimationFrame(function() {
// Remove the stale modal that initProductGalleryModal previously moved to <body>.
const staleModal = document.querySelector('body > #galleryModal');
if (staleModal) staleModal.remove();
if (typeof window.initProductGalleryModal === 'function') {
window.initProductGalleryModal();
}
});
});
}
window.openProductMediaGallery = openProductMediaGallery;
})();
</script>
</div>
<div
id="ProductInformation-template--21336520622297__main"
class="
product-details
sticky-content--desktop
"
style="--details-position: flex-start;"
data-testid="product-information-details"
>
<div
class="
group-block
group-block--height-fit
group-block--width-fill
border-style
spacing-style
size-style
"
style="
--border-width: 1px; --border-style: none;
--border-color: rgb(var(--color-border-rgb) / 1.0);
--border-radius: 0px;
--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;
--size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem;
"
data-testid="group-block"
><div class="group-block__media-wrapper">
</div>
<div
class="
group-block-content
layout-panel-flex
layout-panel-flex--column
"
style="--flex-direction: column; --flex-wrap: nowrap;
--gap: 16px;
--horizontal-alignment: ; --vertical-alignment: ;
--vertical-alignment-mobile: ;
"
>
<div
id="product-badge"
data-product-badge="Healthy 21-Day Cleanse"
>
<span
class="variant-badge-data"
data-variant-id="47683217391833"
data-variant-badge=""
hidden
></span>
<span class="badge-text">
Healthy 21-Day Cleanse
</span>
</div>
<script>
(function () {
const badgeEl = document.getElementById('product-badge');
if (!badgeEl) return;
const badgeTextEl = badgeEl.querySelector('.badge-text');
function getCurrentVariantId() {
const checked = document.querySelectorAll(
'variant-picker input[type="radio"]:checked'
);
let variantId = null;
checked.forEach((input) => {
if (input.dataset.variantId) {
variantId = input.dataset.variantId;
}
});
return variantId;
}
function updateBadge(variantId) {
if (!variantId) return;
const productBadge = badgeEl.dataset.productBadge;
const variantBadgeEl = badgeEl.querySelector(
`.variant-badge-data[data-variant-id="${variantId}"]`
);
const variantBadge = variantBadgeEl?.dataset.variantBadge || '';
if (productBadge) {
badgeTextEl.textContent = productBadge;
badgeEl.style.display = 'block';
} else if (variantBadge) {
badgeTextEl.textContent = variantBadge;
badgeEl.style.display = 'block';
} else {
badgeEl.style.display = 'none';
}
}
document.addEventListener('click', function (e) {
if (!e.target.closest('variant-picker')) return;
setTimeout(() => {
updateBadge(getCurrentVariantId());
}, 0);
});
updateBadge(getCurrentVariantId());
})();
</script>
<style>
#product-badge {
width: fit-content;
max-width: max-content;
text-align: left;
font-family: var(--font-body--family);
font-size: 1rem;
font-weight: 500;
line-height: normal;
letter-spacing: normal;
text-transform: none;
color: #FFF;
background: transparent;
border-radius: 0;
padding-block-start: 0;
padding-block-end: 0;
padding-inline-start: 0;
padding-inline-end: 0;
}
#product-badge .badge-text {
white-space: pretty;
padding: 5px 10px;
background-color: var(--bodi-pdp-accent);
border-radius: 4px;
font-weight: 600;
}
.product-information-header {
margin-top: -24px;
}
</style>
<div class="view-product-title">
<a
href="/products/ultimate-reset-cleanse?variant=47683217391833"
class="link"
>Ultimate Reset
</a>
</div>
<div
class="
group-block
group-block--height-fit
group-block--width-fill
border-style
spacing-style
size-style
"
style="
--border-width: 1px; --border-style: none;
--border-color: rgb(var(--color-border-rgb) / 1.0);
--border-radius: 0px;
--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;
--size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem;
"
data-testid="group-block"
><div class="group-block__media-wrapper">
</div>
<div
class="
group-block-content
layout-panel-flex
layout-panel-flex--column
mobile-column
"
style="--flex-direction: column; --flex-wrap: nowrap;
--gap: 12px;
--horizontal-alignment: flex-start; --vertical-alignment: center;
--vertical-alignment-mobile: center;
"
>
<div
class=" spacing-style text-block text-block--AUGdUUjlkWm55Y2QyR__text_xrnftG text-heading-display-2
text-block--align-left
"
style="
--padding-block-start: 20px; --padding-block-end:0px;
--padding-inline-start:0px; --padding-inline-end:0px;
--color: var(--color-foreground);--font-weight: 500;
--width: 100%;
--max-width: var(--max-width--body-normal);
--text-align: left;
"
>
<h1>Ultimate Reset</h1>
</div>
<style>
</style>
<div
class=" spacing-style text-block text-block--Aa0FrVXh6U0ZCVENUT__text_JkzTYf text-body-base
text-block--align-left
"
style="
--padding-block-start: 0px; --padding-block-end:0px;
--padding-inline-start:0px; --padding-inline-end:0px;
--color: var(--color-foreground);--font-weight: 400;
--width: 100%;
--max-width: var(--max-width--body-normal);
--text-align: left;
"
>
<div class="py-4" data-headlessui-state="open" data-open="">
<div class="prose pt-2" id="headlessui-disclosure-panel-_r_3l_" data-headlessui-state="open" data-open="">
<div class="pb-4">
<div>
<p>Feel invigorated, lose weight, and get on track to better health in just 21 days*</p>
</div>
</div>
<div class="flex items-center justify-between lg:justify-normal lg:gap-8">
<div class="flex gap-2 font-medium"><br></div>
</div>
</div>
</div>
</div>
<style>
</style>
<div
class="
group-block
group-block--height-fit
group-block--width-fill
border-style
spacing-style
size-style
"
style="
--border-width: 1px; --border-style: none;
--border-color: rgb(var(--color-border-rgb) / 1.0);
--border-radius: 0px;
--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;
--size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem;
"
data-testid="group-block"
><div class="group-block__media-wrapper">
</div>
<div
class="
group-block-content
layout-panel-flex
layout-panel-flex--row
mobile-column
"
style="--flex-direction: row; --flex-wrap: nowrap;
--gap: 24px;
--horizontal-alignment: flex-start; --vertical-alignment: center;
--vertical-alignment-mobile: center;
"
>
<product-price
class="text-block text-block--align-left rte text-left paragraph spacing-style"
data-block-id="AVnZLdklLaXkwRHR4U__price_97GqNF"
data-product-id="9413928616153"
style="
--color: var(--color-foreground);--font-weight: 500;
--padding-block-start: 4px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;
--width: 100%;
"
>
<div ref="priceContainer">
<span role="group" class="regular-price-container">
<span class="visually-hidden">Sale price </span>
<span class="price">$149.96</span>
</span>
<span role="group" class="compare-at-price-container">
<span class="visually-hidden">Regular price </span>
<span class="compare-at-price">$199.95</span>
</span>
</div>
<div id="shopify-block-AaHhkVGFPVnkxRjlrV__variant-marketing-copy" class="shopify-block"><div
id="marketing-copy"
data-marketing-copy=""
>
<span
class="variant-marketing-copy-data"
data-variant-id="47683217391833"
data-variant-marketing-copy=""
hidden
></span>
<span class="marketing-copy-text">
</span>
</div>
<script>
(function () {
const marketingCopyEl = document.getElementById('marketing-copy');
if (!marketingCopyEl) return;
const marketingCopyTextEl = marketingCopyEl.querySelector('.marketing-copy-text');
function getCurrentVariantId() {
const checked = document.querySelectorAll(
'variant-picker input[type="radio"]:checked'
);
let variantId = null;
checked.forEach((input) => {
if (input.dataset.variantId) {
variantId = input.dataset.variantId;
}
});
return variantId;
}
function updateMarketingCopy(variantId) {
if (!variantId) {
return;
};
const variantMarketingCopyEl = marketingCopyEl.querySelector(
`.variant-marketing-copy-data[data-variant-id="${variantId}"]`
);
const variantMarketingCopy = variantMarketingCopyEl?.dataset.variantMarketingCopy || '';
if (variantMarketingCopy) {
marketingCopyTextEl.textContent = variantMarketingCopy;
marketingCopyEl.style.display = 'block';
} else {
marketingCopyTextEl.textContent = '';
marketingCopyEl.style.display = 'none';
}
}
document.addEventListener('click', function (e) {
if (!e.target.closest('variant-picker')) return;
setTimeout(() => {
const selectedVariantId = e.target.dataset.variantId;
updateMarketingCopy(selectedVariantId);
}, 5);
});
updateMarketingCopy(getCurrentVariantId());
})();
</script>
</div>
<div class="tax-note"></div>
<div class="installments"><form method="post" action="/cart/add" id="product-form-installment-AVnZLdklLaXkwRHR4U__price_97GqNF" accept-charset="UTF-8" class="payment-terms" enctype="multipart/form-data"><input type="hidden" name="form_type" value="product" /><input type="hidden" name="utf8" value="✓" /><input
type="hidden"
name="id"
value="47683217391833"
>
<input type="hidden" name="product-id" value="9413928616153" /><input type="hidden" name="section-id" value="template--21336520622297__main" /></form></div></product-price>
<script type="application/json" data-price-sync-meta>
{
"currency": "USD",
"locale": "en"
}
</script>
<script>
(() => {
if (window.__rechargePriceSyncInitialized) return;
window.__rechargePriceSyncInitialized = true;
/** @type {Object} */
const meta = (() => {
const el = document.querySelector('[data-price-sync-meta]');
if (!el) return { currency: 'USD', locale: 'en' };
try {
return JSON.parse(el.textContent || '{}');
} catch {
return { currency: 'USD', locale: 'en' };
}
})();
// Cached product JSON so variant/plan switches don't re-fetch.
/** @type {Object|null} */
let productData = null;
/**
* @param {number} cents
* @returns {string}
*/
const formatCents = (cents) => {
const value = Number(cents || 0) / 100;
try {
return new Intl.NumberFormat(meta.locale || 'en', {
style: 'currency',
currency: meta.currency || 'USD',
currencyDisplay: 'narrowSymbol',
trailingZeroDisplay:"stripIfInteger"
}).format(value);
} catch {
return value.toFixed(2);
}
};
// Fetches /products/{handle}.js once and caches the full product payload.
/** @returns {Promise<Object|null>} */
const fetchProductData = async () => {
if (productData) return productData;
const pathname = window.location.pathname.replace(/\/$/, '');
try {
const response = await fetch(`${pathname}.js`);
if (!response.ok) return null;
productData = await response.json();
return productData;
} catch {
return null;
}
};
/**
* @param {string|number} variantId
* @param {Object} data
* @param {string} sellingPlanId - Active selling plan ID, empty string for one-time
* @returns {Object}
*/
const getVariantPricing = (variantId, data, sellingPlanId) => {
const id = Number(variantId);
const variant = data.variants?.find((v) => v.id === id);
if (!variant) return { price: data.price || 0, compareAtPrice: null };
// Subscription mode: match the active selling plan allocation,
// fall back to the first allocation if the exact plan isn't found.
if (sellingPlanId) {
const planId = Number(sellingPlanId);
const allocation =
variant.selling_plan_allocations?.find(
(a) => a.selling_plan_id === planId
) || variant.selling_plan_allocations?.[0];
if (allocation) {
return {
price: allocation.price,
compareAtPrice: (allocation.compare_at_price === 0 && variant.compare_at_price > 0) ? variant.compare_at_price :
(allocation.compare_at_price > allocation.price)
? allocation.compare_at_price
: null,
};
}
}
// One-time mode (no selling plan): use the regular variant price.
return {
price: variant.price,
compareAtPrice:
variant.compare_at_price > variant.price
? variant.compare_at_price
: null,
};
};
/**
* @param {number} price
* @param {number|null} compareAtPrice
* @returns {string}
*/
const buildPriceHTML = (price, compareAtPrice) => {
const formatted = formatCents(price);
if (!compareAtPrice) {
return `<span class="price">${formatted}</span>`;
}
return `<span role="group" class="regular-price-container">
<span class="visually-hidden">Sale price </span>
<span class="price">${formatted}</span>
</span>
<span role="group" class="compare-at-price-container">
<span class="visually-hidden">Regular price </span>
<span class="compare-at-price">${formatCents(compareAtPrice)}</span>
</span>`;
};
// Reads current variant + selling plan from the DOM, resolves pricing
// from cached JSON, and writes formatted HTML into [ref="priceContainer"].
const syncPrice = async () => {
const data = await fetchProductData();
if (!data) return;
const variantInput = document.querySelector('input[ref="variantId"]');
const variantId =
variantInput instanceof HTMLInputElement ? variantInput.value : null;
const sellingPlanInput = document.querySelector('input[name="selling_plan"]');
const sellingPlanId =
sellingPlanInput instanceof HTMLInputElement ? sellingPlanInput.value : '';
const scope =
variantInput?.closest('.shopify-section, dialog') || document;
const container = scope.querySelector('[ref="priceContainer"]');
if (!(container instanceof HTMLElement)) return;
const { price, compareAtPrice } = variantId
? getVariantPricing(variantId, data, sellingPlanId)
: { price: data.price || 0, compareAtPrice: null };
container.innerHTML = buildPriceHTML(price, compareAtPrice);
};
const init = async () => {
await syncPrice();
const variantInput = document.querySelector('input[ref="variantId"]');
// Re-sync when the selected variant changes (attribute set programmatically).
if (variantInput instanceof HTMLInputElement) {
const observer = new MutationObserver(() => syncPrice());
observer.observe(variantInput, {
attributes: true,
attributeFilter: ['value'],
});
}
// Re-sync when the selling plan toggles between subscription and one-time.
const sellingPlanInput = document.querySelector('input[name="selling_plan"]');
if (sellingPlanInput instanceof HTMLInputElement) {
const spObserver = new MutationObserver(() => syncPrice());
spObserver.observe(sellingPlanInput, {
attributes: true,
attributeFilter: ['value'],
});
sellingPlanInput.addEventListener('change', () => syncPrice());
}
// Re-sync after product-price.js replaces the container with
// server-rendered HTML on section re-render. setTimeout defers
// our update so it runs after the DOM replacement.
document.addEventListener('variant:update', () => {
setTimeout(syncPrice, 0);
});
};
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init, { once: true });
} else {
init();
}
})();
</script>
</div>
</div>
<style>
</style>
</div>
</div>
<style>
</style>
<div id="shopify-block-AVEJVYWFNSGd4U2orQ__recharge_subscriptions_subscription_widget_v2_T9Paax" class="shopify-block shopify-app-block recharge-subscription-widget">
<script>
window.Recharge = {};
</script>
</div><div id="shopify-block-AMW9EV3B6ZFVJY1JoT__recharge_widget_tmf6Xz" class="shopify-block">
<style>
body:has(input[name="selling_plan"][value=""]) .product-disclaimers-container,
body:has(input[name="selling_plan"][value=""]) .pdp-subscription-disclaimer {
display: none !important;
}
</style></div>
<span
class="buy-buttons-block buy-buttons-block--Ab2NZRE9JaDlFK2tDe__buy_buttons "
><product-form-component
data-section-id="template--21336520622297__main"
data-product-id="9413928616153"
data-product-url="/products/ultimate-reset-cleanse"
on:submit="/handleSubmit"
data-quantity-default="1"
>
<div class="quantity-text">Quantity</div>
<div
class="visually-hidden"
aria-live="assertive"
role="status"
aria-atomic="true"
ref="liveRegion"
></div><form method="post" action="/cart/add" id="BuyButtons-ProductForm-Ab2NZRE9JaDlFK2tDe__buy_buttons" accept-charset="UTF-8" class="shopify-product-form" enctype="multipart/form-data" novalidate="novalidate" data-type="add-to-cart-form"><input type="hidden" name="form_type" value="product" /><input type="hidden" name="utf8" value="✓" /><input
type="hidden"
name="id"
ref="variantId"
value="47683217391833"
>
<style>
recharge-custom-block {
}
</style>
<div
class="product-form-buttons spacing-style"
style="--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;"
>
<quantity-selector-dropdown-component
class="quantity-selector quantity-selector--dropdown"
ref="quantitySelectors[]"
>
<input
type="hidden"
name="quantity"
value="1"
min="1"
max="5"
ref="quantityInput"
>
<div class="quantity-dropdown">
<button
id="quantity-dropdown-trigger-product"
type="button"
class="quantity-dropdown__trigger"
ref="dropdownTrigger"
aria-haspopup="listbox"
aria-expanded="false"
aria-label="Quantity"
on:click="/toggleDropdown"
on:keydown="/handleTriggerKeydown"
>
<span class="quantity-dropdown__value" ref="dropdownValue">1</span>
<span class="quantity-dropdown__icon" aria-hidden="true">
<span class="quantity-dropdown__caret quantity-dropdown__caret--up"><svg width="11" height="7" viewBox="0 0 11 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.2925 0L5.5 4.19833L9.7075 0L11 1.2925L5.5 6.7925L0 1.2925L1.2925 0Z" fill="#161819"/>
</svg>
</span>
<span class="quantity-dropdown__caret quantity-dropdown__caret--down"><svg width="11" height="7" viewBox="0 0 11 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.2925 0L5.5 4.19833L9.7075 0L11 1.2925L5.5 6.7925L0 1.2925L1.2925 0Z" fill="#161819"/>
</svg>
</span>
</span>
</button>
<div
class="quantity-dropdown__list"
ref="dropdownList"
role="listbox"
aria-label="Quantity"
hidden
>
<div
class="quantity-dropdown__option quantity-dropdown__option--selected"
role="option"
data-value="1"
ref="dropdownOptions[]"
aria-selected="true"
tabindex="-1"
on:click="/selectOption"
on:keydown="/handleOptionKeydown"
>
<span class="quantity-dropdown__check-cell">
<span class="quantity-dropdown__check" aria-hidden="true"><svg width="14" height="11" viewBox="0 0 14 11" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.44912 8.42069L1.13019 5.10176L0 6.22399L4.44912 10.6731L14 1.12223L12.8778 0L4.44912 8.42069Z" fill="#208468"/>
</svg>
</span>
</span>
<span class="quantity-dropdown__option-value">1</span>
</div>
<div
class="quantity-dropdown__option"
role="option"
data-value="2"
ref="dropdownOptions[]"
aria-selected="false"
tabindex="-1"
on:click="/selectOption"
on:keydown="/handleOptionKeydown"
>
<span class="quantity-dropdown__check-cell">
<span class="quantity-dropdown__check" aria-hidden="true"><svg width="14" height="11" viewBox="0 0 14 11" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.44912 8.42069L1.13019 5.10176L0 6.22399L4.44912 10.6731L14 1.12223L12.8778 0L4.44912 8.42069Z" fill="#208468"/>
</svg>
</span>
</span>
<span class="quantity-dropdown__option-value">2</span>
</div>
<div
class="quantity-dropdown__option"
role="option"
data-value="3"
ref="dropdownOptions[]"
aria-selected="false"
tabindex="-1"
on:click="/selectOption"
on:keydown="/handleOptionKeydown"
>
<span class="quantity-dropdown__check-cell">
<span class="quantity-dropdown__check" aria-hidden="true"><svg width="14" height="11" viewBox="0 0 14 11" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.44912 8.42069L1.13019 5.10176L0 6.22399L4.44912 10.6731L14 1.12223L12.8778 0L4.44912 8.42069Z" fill="#208468"/>
</svg>
</span>
</span>
<span class="quantity-dropdown__option-value">3</span>
</div>
<div
class="quantity-dropdown__option"
role="option"
data-value="4"
ref="dropdownOptions[]"
aria-selected="false"
tabindex="-1"
on:click="/selectOption"
on:keydown="/handleOptionKeydown"
>
<span class="quantity-dropdown__check-cell">
<span class="quantity-dropdown__check" aria-hidden="true"><svg width="14" height="11" viewBox="0 0 14 11" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.44912 8.42069L1.13019 5.10176L0 6.22399L4.44912 10.6731L14 1.12223L12.8778 0L4.44912 8.42069Z" fill="#208468"/>
</svg>
</span>
</span>
<span class="quantity-dropdown__option-value">4</span>
</div>
<div
class="quantity-dropdown__option"
role="option"
data-value="5"
ref="dropdownOptions[]"
aria-selected="false"
tabindex="-1"
on:click="/selectOption"
on:keydown="/handleOptionKeydown"
>
<span class="quantity-dropdown__check-cell">
<span class="quantity-dropdown__check" aria-hidden="true"><svg width="14" height="11" viewBox="0 0 14 11" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.44912 8.42069L1.13019 5.10176L0 6.22399L4.44912 10.6731L14 1.12223L12.8778 0L4.44912 8.42069Z" fill="#208468"/>
</svg>
</span>
</span>
<span class="quantity-dropdown__option-value">5</span>
</div>
</div>
</div>
</quantity-selector-dropdown-component>
<span
style="--add-to-cart-font-case: ;"
>
<add-to-cart-component
ref="addToCartButtonContainer"
data-product-variant-media="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=100"
>
<button
id="BuyButtons-ProductSubmitButton-AMnFRR0pQUmpVYUJlU__add-to-cart"
type="submit"
name="add"
ref="addToCartButton"
on:click="/handleClick"
class="button add-to-cart-button button"
>
<span
class="add-to-cart-text"
>
<span class="add-to-cart-text__content">Add to cart</span>
</span>
<span
aria-hidden="true"
class="add-to-cart-text--added"
>
<span class="svg-wrapper add-to-cart-icon--added"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" class="icon-checkmark">
<path d="M4.75439 10.7485L7.68601 14.5888C7.79288 14.7288 7.84632 14.7988 7.91174 14.8242C7.96907 14.8466 8.03262 14.8469 8.09022 14.8253C8.15596 14.8007 8.21026 14.7314 8.31886 14.5927L15.2475 5.74658" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="">Added</span>
</span>
</button>
</add-to-cart-component>
</span>
<span
class="product-form-text__error hidden"
ref="addToCartTextError"
>
<span class="svg-wrapper product-form-icon--error"><svg class="icon icon-error" viewBox="0 0 13 13">
<circle cx="6.5" cy="6.5" r="5.5" stroke="#fff" stroke-width="var(--icon-stroke-width)"/>
<circle cx="6.5" cy="6.5" r="5.5" fill="#EB001B" stroke="#EB001B" stroke-width=".7"/>
<path fill="#fff" d="m5.874 3.528.1 4.044h1.053l.1-4.044zm.627 6.133c.38 0 .68-.288.68-.656s-.3-.656-.68-.656-.681.288-.681.656.3.656.68.656"/>
<path fill="#fff" stroke="#EB001B" stroke-width=".7" d="M5.874 3.178h-.359l.01.359.1 4.044.008.341h1.736l.008-.341.1-4.044.01-.359H5.873Zm.627 6.833c.56 0 1.03-.432 1.03-1.006s-.47-1.006-1.03-1.006-1.031.432-1.031 1.006.47 1.006 1.03 1.006Z"/>
</svg>
</span>
</span>
</div><input type="hidden" name="product-id" value="9413928616153" /><input type="hidden" name="section-id" value="template--21336520622297__main" /></form></product-form-component></span>
<style>
</style>
<div
class="
group-block
group-block--height-fit
group-block--width-fill
border-style
spacing-style
size-style
product-disclaimers-container
"
style="
--border-width: 1px; --border-style: none;
--border-color: rgb(var(--color-border-rgb) / 1.0);
--border-radius: 0px;
--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;
--size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem;
"
data-testid="group-block"
><div class="group-block__media-wrapper">
</div>
<div
class="
group-block-content
layout-panel-flex
layout-panel-flex--row
"
style="--flex-direction: row; --flex-wrap: nowrap;
--gap: 12px;
--horizontal-alignment: flex-start; --vertical-alignment: center;
--vertical-alignment-mobile: center;
"
>
<div>
<script>
window.variantMetafieldMap = {"47683217391833": ""};
document.addEventListener('change', () => {
setTimeout(() => {
const urlParams = new URLSearchParams(window.location.search);
const selectedVariantId = urlParams.get('variant');
if (selectedVariantId && window.variantMetafieldMap) {
const htmlContent = window.variantMetafieldMap[selectedVariantId];
const displayElement = document.getElementById('variantDisclaimerContainer');
if (displayElement) {
displayElement.innerHTML = htmlContent || '';
displayElement.style.display = htmlContent ? 'block' : 'none';
}
}
}, 100);
});
</script>
<div id="variantDisclaimerContainer" class="variant-disclaimer">
</div>
</div>
</div>
</div>
<style>
</style>
<div id="shopify-block-AS0hkVGZTMWNsK2dNN__pdp_subscription_disclaimer_fdfQAM" class="shopify-block">
<div
class="pdp-subscription-disclaimer"
id="subscription-disclaimer-AS0hkVGZTMWNsK2dNN__pdp_subscription_disclaimer_fdfQAM"
>
<p>Subscription automatically renews for the same applicable term and price, until you cancel. Cancel anytime to avoid future charges by visiting <a href="https://account.shop.bodi.com/">Memberships & Subscriptions</a>. Any changes to the subscription after the promotion period will reset your discount to the then current best offer. Excludes Beachbars, 4 Week Gut Protocol Complete Kit, and Belle Vitale All-In-One Kit.</p>
</div>
<script>
(function () {
const disclaimerElement = document.getElementById('subscription-disclaimer-AS0hkVGZTMWNsK2dNN__pdp_subscription_disclaimer_fdfQAM');
const rechargeWidget = document.querySelector('recharge-subscription-widget');
const maxCalls = 10;
if (!rechargeWidget || !disclaimerElement) return;
function updateVisibility(value) {
if (value === 'subscription') {
disclaimerElement.style.display = 'block';
} else {
disclaimerElement.style.display = 'none';
}
}
function initListener() {
const shadowRoot = rechargeWidget.shadowRoot;
if (!shadowRoot) {
if (maxCalls > 0) {
setTimeout(initListener, 100);
maxCalls--;
}
return;
}
shadowRoot.addEventListener('input', (e) => {
updateVisibility(e.target.value);
});
updateVisibility('subscription');
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initListener);
} else {
initListener();
}
})();
</script>
</div>
<div id="shopify-block-AcmgyZmYyQVd3dlgrZ__pdp_guarantees_MpPbTw" class="shopify-block">
<section class="product-guarantee-container">
<div class="product-guarantee">
<div class="product-guarantee__content">
<div class="product-guarantee__icon">
<img src="//shop.bodi.com/cdn/shop/files/bodi-31-day-money-back-guarantee-en-us.png?v=1772480185&width=200" alt="Guarantee icon" srcset="//shop.bodi.com/cdn/shop/files/bodi-31-day-money-back-guarantee-en-us.png?v=1772480185&width=200 200w" width="200" height="174">
</div>
<div class="product-guarantee__text text-body-base">
<div class="metafield-rich_text_field"><p><strong>Our products are backed by a 31-day Money Back Guarantee</strong><em><strong>, </strong></em><strong>less shipping & handling. Excludes final sale and subscriptions initiated by a free trial, additional terms and conditions </strong><a href="https://faq.bodi.com/answer?Id=259&_gl=1*8gmxhi*_gcl_au*NDg5NTM2ODMxLjE3NjgyMzY2ODE.*FPAU*NDg5NTM2ODMxLjE3NjgyMzY2ODE"><strong>apply</strong></a><strong>.</strong></p></div>
</div>
</div>
</div>
</section>
</div>
<div
class="accordion accordion--AM0dVSUc5OEdWNDUrM__accordion_3gmYab accordion--plus spacing-style "
style="
--accordion-gap: 16px;
--summary-font-family: var(--font-h6--family);
--summary-font-style: var(--font-h6--style);
--summary-font-weight: var(--font-h6--weight);
--summary-font-size: var(--font-h6--size);
--summary-font-line-height: var(--font-h6--line-height);
--summary-font-case: var(--font-h6--case);
--accordion-background-color: #ffffff;
--accordion-text-color: #111928;
--accordion-icon-color: #111928;
--accordion-border-color: #e8eaee;
--accordion-icon-size: 32px;
--accordion-show-borders: 1;
--accordion-show-dividers: 0;
--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;
"
>
<template data-accordion-faq-item>
{
"@type": "Question",
"name": "Description",
"acceptedAnswer": {
"@type": "Answer",
"text": "Helps you feel invigorated, lose weight, and get on track to better health in 21 days. In just 3 weeks, BODi Ultimate Reset will help gently cleanse your system. This gentle, no-starvation cleanse helps restore your body to its optimal \u0026quot;factory settings,\u0026quot; so you can feel and look healthier than before.*"
}
}
</template><accordion-custom
>
<details
class="details"
data-testid="accordion-details"
>
<summary class="details__header">
<h2>Description</h2>
<span class="svg-wrapper icon-caret icon-animated"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="svg-wrapper icon-plus"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="vertical" d="M2.75 7H11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
<path class="horizontal" d="M7 2.75L7 11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
</svg>
</span>
</summary>
<div class="details-content">
<div
class=" spacing-style text-block text-block--AUUE5YUJCSlBqajFTc__product_description_gYyCGX text-body-base
text-block--align-left text-block--full-width
"
style="
--padding-block-start: 0px; --padding-block-end:0px;
--padding-inline-start:0px; --padding-inline-end:0px;
--color: var(--color-foreground); --font-weight: var(--font-body--weight);
--width: 100%;
--max-width: var(--max-width--body-none);
--text-align: left;
"
>
<div class="metafield-rich_text_field"><p>Helps you feel invigorated, lose weight, and get on track to better health in 21 days. In just 3 weeks, BODi Ultimate Reset will help gently cleanse your system. This gentle, no-starvation cleanse helps restore your body to its optimal "factory settings," so you can feel and look healthier than before.*</p></div>
</div>
<style>
</style>
</div>
</details>
<div class="accordion-row-divider"></div>
</accordion-custom>
<template data-accordion-faq-item>
{
"@type": "Question",
"name": "How to Use",
"acceptedAnswer": {
"@type": "Answer",
"text": "Your Ultimate Reset is supported by 6 uniquely formulated supplements: • Power Greens: A combination of 6 powerful greens, including kale, matcha, cucumber, celery, spinach and chlorella.* • Optimize: A proprietary enzyme blend with added camu-camu to help support nutrient absorption and bioavailability.* • Soothe: Combines two incredible botanicals—aloe vera and turmeric, which have been traditionally used to support digestive health and the body’s response to oxidative stress.* • Mineralize: Formulated with pink Himalayan salt, which adds natural minerals needed by the body.* • Detox: Formulated with key ingredients including chia, flax, and turmeric, traditionally used to help support the body\u0026#39;s natural detoxification processes and healthy liver function.* • Revitalize: Probiotics and prebiotics which help support beneficial flora in the digestive tract.* • The Ultimate Reset Program and Nutrition Guide: Includes detailed step-by-step instructions for your 21-day Ultimate Reset journey, and a complete three-phase Ultimate Reset meal plan. FREE BONUS: “A Taste of The World” Cookbook Exclusively on the BODi app—Discover delicious recipes from around the world with Ultimate Reset’s “A Taste of The World” cookbook that contains over 60 unique recipes to give you even more options to help keep your meal prep simple, and your plate exciting and delicious."
}
}
</template><accordion-custom
>
<details
class="details"
data-testid="accordion-details"
>
<summary class="details__header">
<h2>How to Use</h2>
<span class="svg-wrapper icon-caret icon-animated"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="svg-wrapper icon-plus"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="vertical" d="M2.75 7H11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
<path class="horizontal" d="M7 2.75L7 11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
</svg>
</span>
</summary>
<div class="details-content">
<rte-formatter
class=" spacing-style text-block text-block--ASWZlN2NVb2IwcjRBO__text_DLBCjQ rte
text-block--align-left rte
"
style="
--padding-block-start: 0px; --padding-block-end:0px;
--padding-inline-start:0px; --padding-inline-end:0px;
--width: 100%;
--max-width: var(--max-width--body-normal);
--text-align: left;
"
>
<div class="metafield-rich_text_field"><p><strong>Your Ultimate Reset is supported by 6 uniquely formulated supplements:</strong></p><ul><li><strong>Power Greens: </strong>A combination of 6 powerful greens, including kale, matcha, cucumber, celery, spinach and chlorella.* </li><li><strong>Optimize:</strong> A proprietary enzyme blend with added camu-camu to help support nutrient absorption and bioavailability.* </li><li><strong>Soothe: </strong>Combines two incredible botanicals—aloe vera and turmeric, which have been traditionally used to support digestive health and the body’s response to oxidative stress.*</li><li><strong>Mineralize: </strong>Formulated with pink Himalayan salt, which adds natural minerals needed by the body.* </li><li><strong>Detox: </strong>Formulated with key ingredients including chia, flax, and turmeric, traditionally used to help support the body's natural detoxification processes and healthy liver function.* </li><li><strong>Revitalize: </strong>Probiotics and prebiotics which help support beneficial flora in the digestive tract.*</li><li><strong>The Ultimate Reset Program and Nutrition Guide:</strong> Includes detailed step-by-step instructions for your 21-day Ultimate Reset journey, and a complete three-phase Ultimate Reset meal plan.</li></ul><p><strong>FREE BONUS: “A Taste of The World” Cookbook</strong></p><p>Exclusively on the BODi app—Discover delicious recipes from around the world with Ultimate Reset’s “A Taste of The World” cookbook that contains over 60 unique recipes to give you even more options to help keep your meal prep simple, and your plate exciting and delicious.</p></div>
</rte-formatter>
<style>
</style>
</div>
</details>
<div class="accordion-row-divider"></div>
</accordion-custom>
<template data-accordion-faq-item>
{
"@type": "Question",
"name": "Key Ingredients",
"acceptedAnswer": {
"@type": "Answer",
"text": "• A prebiotic and probiotic blend that can help support beneficial flora in the digestive tract and help maintain gut health.* 3 billion CFUs Bacillus coagulans. • A proprietary blend of enzymes that help break down carbohydrates, protein, and fat.* • Formulated with key ingredients like chia, flax, and turmeric, traditionally used to help support the body’s natural detoxification processes and healthy liver function.*"
}
}
</template><accordion-custom
>
<details
class="details"
data-testid="accordion-details"
>
<summary class="details__header">
<h2>Key Ingredients</h2>
<span class="svg-wrapper icon-caret icon-animated"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="svg-wrapper icon-plus"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="vertical" d="M2.75 7H11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
<path class="horizontal" d="M7 2.75L7 11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
</svg>
</span>
</summary>
<div class="details-content">
<rte-formatter
class=" spacing-style text-block text-block--Acjc0c3dMQ2s0VmxUU__text_DFFRey rte
text-block--align-left rte
"
style="
--padding-block-start: 0px; --padding-block-end:0px;
--padding-inline-start:0px; --padding-inline-end:0px;
--width: 100%;
--max-width: var(--max-width--body-normal);
--text-align: left;
"
>
<div class="metafield-rich_text_field"><p></p><ul><li>A prebiotic and probiotic blend that can help support beneficial flora in the digestive tract and help maintain gut health.* 3 billion CFUs Bacillus coagulans.</li><li>A proprietary blend of enzymes that help break down carbohydrates, protein, and fat.*</li><li>Formulated with key ingredients like chia, flax, and turmeric, traditionally used to help support the body’s natural detoxification processes and healthy liver function.*</li></ul></div>
</rte-formatter>
<style>
</style>
</div>
</details>
<div class="accordion-row-divider"></div>
</accordion-custom>
</div><style>
</style>
<div
class="
group-block
group-block--height-fit
group-block--width-fill
border-style
spacing-style
size-style
rebuy-widget-add-on-pdp
"
style="
--border-width: 1px; --border-style: none;
--border-color: rgb(var(--color-border-rgb) / 1.0);
--border-radius: 0px;
--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;
--size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem;
"
data-testid="group-block"
><div class="group-block__media-wrapper">
</div>
<div
class="
group-block-content
layout-panel-flex
layout-panel-flex--column
mobile-column
"
style="--flex-direction: column; --flex-wrap: nowrap;
--gap: 16px;
--horizontal-alignment: flex-start; --vertical-alignment: center;
--vertical-alignment-mobile: center;
"
>
<div
style="
--width-desktop: 100%;
--width-mobile: 100%;
"
>
<div id="shopify-block-AQm84NFkrOFpJc1Y5c__rebuy_personalization_engine_rebuy_widget_pjDpfk" class="shopify-block shopify-app-block">
<div
data-rebuy-id="274636"
data-rebuy-shopify-product-ids="9413928616153"
data-rebuy-shopify-collection-ids="">
</div>
</div><div id="shopify-block-ATWxWZFUzQnVUL1M2b__rebuy_personalization_engine_rebuy_widget_Ybciyt" class="shopify-block shopify-app-block">
<div
data-rebuy-id="274642"
data-rebuy-shopify-product-ids="9413928616153"
data-rebuy-shopify-collection-ids="">
</div>
</div>
</div>
</div>
</div>
<style>
</style>
</div>
</div>
<style>
</style>
</div>
</div>
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"@id": "https:\/\/shop.bodi.com\/products\/ultimate-reset-cleanse#product",
"name": "Ultimate Reset",
"description": "Feel invigorated, lose weight, and get on track to better health in just 21 days*",
"brand": {
"@type": "Brand",
"name": "BODi"
},
"sku": "MDSUCLN2101",
"mpn": "MDSUCLN2101",
"url": "https:\/\/shop.bodi.com\/products\/ultimate-reset-cleanse",
"image": [
"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-ultimate-reset-en-us.png?v=1772479737\u0026width=1200",
"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg?v=1772479736\u0026width=1200",
"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg?v=1772479736\u0026width=1200",
"\/\/shop.bodi.com\/cdn\/shop\/files\/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg?v=1772479736\u0026width=1200"
],
"offers": [
{
"@type": "Offer",
"name": "Default Title",
"description": "Feel invigorated, lose weight, and get on track to better health in just 21 days*",
"price": "149.96",
"priceCurrency": "USD",
"sku": "MDSUCLN2101",
"mpn": "MDSUCLN2101",
"availability": "https://schema.org/InStock",
"url": "https:\/\/shop.bodi.com\/products\/ultimate-reset-cleanse?variant=47683217391833",
"priceSpecification": {
"@type": "UnitPriceSpecification",
"price": "149.96",
"priceCurrency": "USD",
"referenceQuantity": {
"@type": "QuantitativeValue",
"value": "1"
}
},
"priceValidUntil": "2027-08-22",
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": {
"@type": "MonetaryAmount",
"value": 0,
"currency": "USD"
},
"shippingDestination": {
"@type": "DefinedRegion",
"addressCountry": "US"
},
"eligibleTransactionVolume": {
"@type": "PriceSpecification",
"price": 150,
"priceCurrency": "USD"
}
},
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"applicableCountry": "US",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 31,
"returnMethod": "https://schema.org/ReturnByMail"
}
}
]
}</script>
</div>
</div><section id="shopify-section-template--21336520622297__anchor_section_A4MixM" class="shopify-section anchor-section-wrapper"><span
id="stacknsave"
class="anchor-section"
aria-hidden="true"
data-anchor-id="stacknsave"
></span>
<style>
.anchor-section-wrapper {
display: block;
height: 0;
margin: 0;
padding: 0;
border: none;
outline: none;
overflow: visible;
}
.anchor-section {
display: block;
position: relative;
top: calc(-1 * var(--header-height, 0px));
visibility: hidden;
pointer-events: none;
}
</style>
</section><div id="shopify-section-template--21336520622297__section_qh9Cz8" class="shopify-section section-wrapper">
<div class="section-wrapper pdp-section pdp-section-bundle rebuy-widget-bundle-page">
<div class="section-background color-scheme-1"></div>
<div
class="section section--page-width color-scheme-1"
style="
"
>
<div
class="border-style custom-section-content"
style="--border-width: 1px; --border-style: none;
--border-color: rgb(var(--color-border-rgb) / 1.0);
--border-radius: 0px;
"
>
<div class="custom-section-background">
</div>
<div
class="
spacing-style
layout-panel-flex
layout-panel-flex--column
section-content-wrapper
"
style="
--flex-direction: column; --flex-wrap: nowrap;
--gap: 0px;
--horizontal-alignment: center; --vertical-alignment: center;
--vertical-alignment-mobile: center;
--padding-block-start: 0px;--padding-block-end: 0px;
"
data-testid="section-content"
>
<div
class="
group-block
group-block--height-fit
group-block--width-fill
border-style
spacing-style
size-style
rebuy-widget-recommended-template
"
style="
--border-width: 1px; --border-style: none;
--border-color: rgb(var(--color-border-rgb) / 1.0);
--border-radius: 0px;
--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;
--size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem;
"
data-testid="group-block"
><div class="group-block__media-wrapper">
</div>
<div
class="
group-block-content
layout-panel-flex
layout-panel-flex--column
mobile-column
"
style="--flex-direction: column; --flex-wrap: nowrap;
--gap: 0px;
--horizontal-alignment: center; --vertical-alignment: center;
--vertical-alignment-mobile: center;
"
>
<div
style="
--width-desktop: 100%;
--width-mobile: 100%;
"
>
<div id="shopify-block-AMERXcWxrQVVJb1lOb__rebuy_personalization_engine_rebuy_widget_qHGEjb" class="shopify-block shopify-app-block">
<div
data-rebuy-id="293515"
data-rebuy-shopify-product-ids="9413928616153"
data-rebuy-shopify-collection-ids="">
</div>
</div>
</div>
</div>
</div>
<style>
</style>
</div>
</div>
</div>
</div>
</div><div id="shopify-section-template--21336520622297__section_dQ8fEt" class="shopify-section section-wrapper">
<div class="section-wrapper pdp-section pdp-section-recommended">
<div class="section-background color-scheme-1"></div>
<div
class="section section--page-width color-scheme-1"
style="
"
>
<div
class="border-style custom-section-content"
style="--border-width: 1px; --border-style: none;
--border-color: rgb(var(--color-border-rgb) / 1.0);
--border-radius: 0px;
"
>
<div class="custom-section-background">
</div>
<div
class="
spacing-style
layout-panel-flex
layout-panel-flex--column
section-content-wrapper
"
style="
--flex-direction: column; --flex-wrap: nowrap;
--gap: 0px;
--horizontal-alignment: center; --vertical-alignment: center;
--vertical-alignment-mobile: center;
--padding-block-start: 0px;--padding-block-end: 0px;
"
data-testid="section-content"
>
<div
class="
group-block
group-block--height-fit
group-block--width-fill
border-style
spacing-style
size-style
rebuy-widget-recommended-template
"
style="
--border-width: 1px; --border-style: none;
--border-color: rgb(var(--color-border-rgb) / 1.0);
--border-radius: 0px;
--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;
--size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem;
"
data-testid="group-block"
><div class="group-block__media-wrapper">
</div>
<div
class="
group-block-content
layout-panel-flex
layout-panel-flex--column
mobile-column
"
style="--flex-direction: column; --flex-wrap: nowrap;
--gap: 0px;
--horizontal-alignment: center; --vertical-alignment: center;
--vertical-alignment-mobile: center;
"
>
<div
style="
--width-desktop: 100%;
--width-mobile: 100%;
"
>
<div id="shopify-block-ARDh4YzloMHYxcGdrc__rebuy_personalization_engine_rebuy_widget_UciDJn" class="shopify-block shopify-app-block">
<div
data-rebuy-id="274646"
data-rebuy-shopify-product-ids="9413928616153"
data-rebuy-shopify-collection-ids="">
</div>
</div>
</div>
</div>
</div>
<style>
</style>
</div>
</div>
</div>
</div>
</div><div id="shopify-section-template--21336520622297__section_gpwLJQ" class="shopify-section section-wrapper">
</div><div id="shopify-section-template--21336520622297__section_GxHUQy" class="shopify-section section-wrapper">
</div><div id="shopify-section-template--21336520622297__supplement_facts_details_d47Lfw" class="shopify-section">
<section class="supp-card page-width">
<div class="supp-card__head">
<h3 class="supp-title">Supplement Facts</h3>
<!-- Variant selector (custom dropdown; native select kept for fallback/form) -->
<div class="supp-variant" data-option-size=6>
<div class="supp-select">
<select id="product-variant-select" class="product-variant-select" data-enhance-select>
<option value="162245574873">
Optimize Digestive Enzymes
</option>
<option value="162245705945">
Soothe Ultimate Reset
</option>
<option value="162245640409">
Mineralize Ultimate Reset
</option>
<option value="162245738713">
Detox Ultimate Reset
</option>
<option value="162245607641">
Revitalize Prebiotics & Probiotics
</option>
<option value="162245673177">
Power Greens Boost
</option>
</select>
</div>
</div>
</div>
<div class="supp-subhead">
<span>Serving Size: <a href="#" tabindex="-1"></a></span>
<span>Servings Per Container: <a href="#" tabindex="-1"></a></span>
</div>
<div class="supp-grid" id="product-detail-container">
<!-- LEFT: Table -->
<div class="supp-left" id="left-section">
<table class="supp-table product-nutrition-table">
<thead>
<tr>
<td class="th--left"></td>
<td class="th--mid header-mid"></td>
<td class="th--right"></td>
</tr>
</thead>
<tbody>
<tr>
<td class="td--third"></td>
</tr>
</tbody>
</table>
</div>
<!-- RIGHT: Details (all items conditional) -->
<aside class="supp-right" id="right-section">
<ul class="supp-right__list">
</ul>
</aside>
</div><script id="variant-supplement-data" type="application/json">
{
"162245574873": {
"tableCol1Name": "AMOUNT PER SERVING",
"tableCol2Name": null,
"tableCol3Name": "\u003cspan style=\"text-wrap: nowrap;\"\u003e% Daily Value\u003c\/span\u003e",
"col1Values": ["\u003cp\u003e \u003cstrong\u003ePROPRIETARY BLEND:\u003c\/strong\u003e\u003cbr\u003e \u003cspan style=\"display:block; margin-left:20px;\"\u003e Protease, Papain, Bromelain, Amylase, Lipase, Japanese sophora powder (flower bud), Amla powder (fruit), Methyl sulfonyl methane, Camu-camu powder (fruit) \u003c\/span\u003e \u003c\/p\u003e","*Daily Value not established."],
"col2Values": ["1 g"],
"col3Values": ["**"],
"colIndentations": null,
"lastCol1Value": null,
"lastCol2Value": null,
"lastCol3Value": null,
"thirdCol1Values": null,
"thirdCol2Values": null,
"thirdCol3Values": null,
"thirdTable": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eOPTIMIZE is a proprietary blend of digestive enzymes and premium ingredients to help:*\u003c\/p\u003e\u003cul\u003e\u003cli\u003eSupport nutrient absorption\u003c\/li\u003e\u003cli\u003eBreak down proteins, carbs, and fats\u003c\/li\u003e\u003c\/ul\u003e\u003c\/div\u003e",
"servingSize": "2 Capsules",
"servingsPerContainer": "90",
"otherIngredients": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eVegetable cellulose, Maltodextrin.\u003c\/p\u003e\u003c\/div\u003e",
"ingredients": "",
"allergenStatement": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eThis product is manufactured in a plant that also processes milk, egg, soy, fish, crustacean shellfish, tree nut, peanut, sesame, and wheat ingredients.\u003c\/p\u003e\u003c\/div\u003e",
"directions": "",
"direction": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eTake 2 capsules, 3 times a day, 30 minutes before meals.\u003c\/p\u003e\u003c\/div\u003e",
"recommendedUse": "",
"storage": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eStore in a cool, dry place.\u003c\/p\u003e\u003c\/div\u003e",
"warning": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eConsult with a healthcare professional before use if you are pregnant, breastfeeding, taking any medication, or if you have any medical condition.\u003c\/p\u003e\u003cp\u003eKeep out of reach of children.\u003c\/p\u003e\u003cp\u003e*These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.\u003c\/p\u003e\u003c\/div\u003e",
"notice": ""
},
"162245705945": {
"tableCol1Name": "AMOUNT PER SERVING",
"tableCol2Name": null,
"tableCol3Name": "% Daily Value",
"col1Values": ["Aloe vera juice (leaf)","\u003cp\u003e Turmeric extract(rhizome):\u003cbr\u003e \u003cspan style=\"display:block; margin-left:20px;\"\u003e (Standardized for 95% curcuminoids) \u003c\/span\u003e \u003c\/p\u003e"],
"col2Values": ["450 mg","210 mg"],
"col3Values": ["**","**"],
"colIndentations": null,
"lastCol1Value": null,
"lastCol2Value": null,
"lastCol3Value": null,
"thirdCol1Values": null,
"thirdCol2Values": null,
"thirdCol3Values": null,
"thirdTable": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003e**Daily Value (DV) not established.\u003c\/p\u003e\u003c\/div\u003e",
"servingSize": "2 Capsule",
"servingsPerContainer": "21",
"otherIngredients": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eMicrocrystalline cellulose, Vegetable cellulose, Silica. This product is manufactured in a plant that also processes milk, egg, soy, fish, crustacean shellfish, tree nut, peanut, sesame, and wheat ingredients.\u003c\/p\u003e\u003c\/div\u003e",
"ingredients": "",
"allergenStatement": "",
"directions": "",
"direction": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eFor Cleanse, take 2 capsules 30 minutes before the evening meal. For Maintenance, take 1 capsule 1 to 2 times per day, 30 minutes before meal(s).\u003c\/p\u003e\u003c\/div\u003e",
"recommendedUse": "",
"storage": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eStore in a cool, dry place.\u003c\/p\u003e\u003c\/div\u003e",
"warning": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eConsult with a healthcare professional before use if you are pregnant, breastfeeding, taking any medication, or if you have any medical condition.\u003c\/p\u003e\u003cp\u003eKeep out of reach of children.\u003c\/p\u003e\u003cp\u003e*These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.\u003c\/p\u003e\u003c\/div\u003e",
"notice": ""
},
"162245640409": {
"tableCol1Name": "AMOUNT PER SERVING",
"tableCol2Name": null,
"tableCol3Name": "% Daily Value",
"col1Values": ["Chloride","Sodium"],
"col2Values": [" 230 mg"," 145 mg"],
"col3Values": ["10%","6%"],
"colIndentations": null,
"lastCol1Value": null,
"lastCol2Value": null,
"lastCol3Value": null,
"thirdCol1Values": null,
"thirdCol2Values": null,
"thirdCol3Values": null,
"thirdTable": "",
"servingSize": "Approx 1\/16 tsp. (0.42 g)",
"servingsPerContainer": "84",
"otherIngredients": "",
"ingredients": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003ePink Himalayan Salt\u003c\/p\u003e\u003c\/div\u003e",
"allergenStatement": "",
"directions": "",
"direction": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eAdd approximately 1\/16 tsp. to 24 to 36 fl oz of distilled water or as directed in Ultimate Reset Program Guide.\u003c\/p\u003e\u003cp\u003eThis product is manufactured in a plant that also processes milk, egg, soy, fish, crustacean shellfish, tree nut, peanut, sesame, and wheat ingredients.\u003c\/p\u003e\u003c\/div\u003e",
"recommendedUse": "",
"storage": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eStore in a cool, dry place.\u003c\/p\u003e\u003c\/div\u003e",
"warning": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eConsult with a healthcare professional before use if you are pregnant, breastfeeding, taking any medication, or if you have any medical condition.\u003c\/p\u003e\u003cp\u003eKeep out of reach of children.\u003c\/p\u003e\u003cp\u003e*These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.\u003c\/p\u003e\u003c\/div\u003e",
"notice": ""
},
"162245738713": {
"tableCol1Name": "AMOUNT PER SERVING",
"tableCol2Name": null,
"tableCol3Name": "% Daily Value",
"col1Values": ["Calories","Total Fat","Total Carbohydrate","Dietary Fiber","Protein","Calcium","Iron","Potassium"],
"col2Values": [" 50"," 2 g"," 4 g","1 g","2 g"," 36 mg"," 0.5 mg"," 70 mg"],
"col3Values": ["N\/A","3%†","1%†","4%†","N\/A","3%","3%","1%"],
"colIndentations": ["0","0","0","1"],
"lastCol1Value": ["Milk Thistle (Seed) Extract","\u003cp\u003e \u003cstrong\u003ePROPRIETARY BLEND:\u003c\/strong\u003e\u003cbr\u003e \u003cspan style=\"display:block; margin-left:20px;\"\u003e Chia (seed), Flax (seed), Astragalus extract (root), Burdock extract (root), Turmeric extract (curcuma longa, rhizome), Schisandra extract (fruit and seed), Ginger extract (rhizome). \u003c\/span\u003e \u003c\/p\u003e"],
"lastCol2Value": ["280 mg","8.2 g"],
"lastCol3Value": ["**","**"],
"thirdCol1Values": null,
"thirdCol2Values": null,
"thirdCol3Values": null,
"thirdTable": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003e†Percent Daily Values are based on a 2,000 calorie diet.\u003c\/p\u003e\u003cp\u003e**Daily Value (DV) not established.\u003c\/p\u003e\u003c\/div\u003e",
"servingSize": "1 packet (9 g)",
"servingsPerContainer": null,
"otherIngredients": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eNatural flavors, Citric acid, Stevia leaf extract.\u003c\/p\u003e\u003c\/div\u003e",
"ingredients": "",
"allergenStatement": "",
"directions": "",
"direction": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eMix 1 packet (9 g) in 8 to 12 fl oz of distilled water, let stir for 1 to 2 minutes, mix again, then consume. For Cleanse, take 3 times a day. For maintenance, take once a day.\u003c\/p\u003e\u003c\/div\u003e",
"recommendedUse": "",
"storage": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eStore in a cool, dry place.\u003c\/p\u003e\u003c\/div\u003e",
"warning": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eConsult with a healthcare professional before use if you are pregnant, breastfeeding, taking any medication, or if you have any medical condition.\u003c\/p\u003e\u003cp\u003eKeep out of reach of children.\u003c\/p\u003e\u003cp\u003e*These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.\u003c\/p\u003e\u003c\/div\u003e",
"notice": ""
},
"162245607641": {
"tableCol1Name": "AMOUNT PER SERVING",
"tableCol2Name": null,
"tableCol3Name": "% Daily Value",
"col1Values": ["\u003cp\u003e \u003cstrong\u003ePROPRIETARY PREBIOTIC AND PROBIOTIC BLEND:\u003c\/strong\u003e\u003cbr\u003e \u003cem\u003eBacillus coagulans\u003c\/em\u003e, Inulin \u003c\/p\u003e","*Daily Value not established."],
"col2Values": ["604 mg"],
"col3Values": ["**"],
"colIndentations": null,
"lastCol1Value": null,
"lastCol2Value": null,
"lastCol3Value": null,
"thirdCol1Values": null,
"thirdCol2Values": null,
"thirdCol3Values": null,
"thirdTable": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eREVITALIZE is a proprietary blend of prebiotics and probiotics to help:*\u003c\/p\u003e\u003cul\u003e\u003cli\u003eSupport beneficial bacteria in the gut\u003c\/li\u003e\u003cli\u003eSupport a balanced environment in the Gl tract\u003c\/li\u003e\u003c\/ul\u003e\u003c\/div\u003e",
"servingSize": "1 Capsule",
"servingsPerContainer": "30",
"otherIngredients": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eVegetable cellulose, Microcrystalline cellulose.\u003c\/p\u003e\u003cp\u003eProbiotics (3 Billion CFUs \u003cem\u003eBacillus coagulans\u003c\/em\u003e)\u003c\/p\u003e\u003c\/div\u003e",
"ingredients": "",
"allergenStatement": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eThis product is manufactured in a plant that also processes milk, egg, soy, fish, crustacean shellfish, tree nut, peanut, sesame, and wheat ingredients.\u003c\/p\u003e\u003c\/div\u003e",
"directions": "",
"direction": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eTake 1 capsule, once a day, 30 minutes before a meal.\u003c\/p\u003e\u003c\/div\u003e",
"recommendedUse": "",
"storage": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eStore in a cool, dry place.\u003c\/p\u003e\u003c\/div\u003e",
"warning": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eConsult with a healthcare professional before use if you are pregnant, breastfeeding, taking any medication, or if you have any medical condition.\u003c\/p\u003e\u003cp\u003eKeep out of reach of children.\u003c\/p\u003e\u003cp\u003e*These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.\u003c\/p\u003e\u003c\/div\u003e",
"notice": ""
},
"162245673177": {
"tableCol1Name": "AMOUNT PER SERVING",
"tableCol2Name": null,
"tableCol3Name": "% Daily Value",
"col1Values": ["Calories","Total Carbohydrate","Dietary Fiber","Protein","Calcium","Iron","Sodium","Potassium"],
"col2Values": ["20","2.5 g","1 g","1 g","30 mg","0.9 mg","40 mg","100 mg"],
"col3Values": ["N\/A"," 1%†","4%†","N\/A","2%","2%","2%"," 2%"],
"colIndentations": ["0","0","1"],
"lastCol1Value": ["\u003cp\u003e \u003cstrong\u003ePROPRIETARY GREEN BLEND:\u003c\/strong\u003e\u003cbr\u003e \u003cspan style=\"display:block; margin-left:20px;\"\u003e Chlorella powder, Spinach powder (leaf), Cucumber powder (fruit), Celery powder (stalk), Kale (Brassica oleracea L. var. acephala) powder (leaf and stem), Matcha green tea powder (leaf) \u003c\/span\u003e \u003c\/p\u003e"],
"lastCol2Value": null,
"lastCol3Value": null,
"thirdCol1Values": null,
"thirdCol2Values": null,
"thirdCol3Values": null,
"thirdTable": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003e†Percent Daily Values are based on a 2,000 calorie diet.\u003c\/p\u003e\u003c\/div\u003e",
"servingSize": "1 scoop (5 g)",
"servingsPerContainer": "21",
"otherIngredients": "",
"ingredients": "",
"allergenStatement": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eThis product is manufactured in a plant that also processes milk, egg, soy, fish, crustacean shellfish, tree nut, peanut, sesame, and wheat ingredients.\u003c\/p\u003e\u003c\/div\u003e",
"directions": "",
"direction": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eGently shake the jar to loosen compressed posder than combine one level scoop (5 g) of Power Greens powder with Shakeology or the beverage of your choice. Consume within 30 minutes.\u003c\/p\u003e\u003c\/div\u003e",
"recommendedUse": "",
"storage": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eStore in a cool, dry place.\u003c\/p\u003e\u003c\/div\u003e",
"warning": "\u003cdiv class=\"metafield-rich_text_field\"\u003e\u003cp\u003eConsult with a healthcare professional before use if you are pregnant, breastfeeding, taking any medication, or if you have any medical condition.\u003c\/p\u003e\u003cp\u003eKeep out of reach of children.\u003c\/p\u003e\u003cp\u003e*These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.\u003c\/p\u003e\u003cp\u003e††Each scoop of concentrated powder has the equivalent of 1 serving (1 cup) of green vegetables (volume before drying).\u003c\/p\u003e\u003c\/div\u003e",
"notice": ""
}
}
</script>
<script>
document.addEventListener("DOMContentLoaded", () => {
/* -------- Data & render -------- */
const sourceEl = document.getElementById("variant-supplement-data");
if (!sourceEl) return;
let variantData = {};
try { variantData = JSON.parse(sourceEl.textContent || "{}"); } catch(e) {}
const nativeSelect = document.getElementById("product-variant-select");
const tableHeadCells = document.querySelectorAll(".supp-table thead td");
const tableBody = document.querySelector(".supp-table tbody");
const right = document.getElementById("right-section");
const subHead = document.querySelector(".supp-subhead span");
const sanitize = (v) => (v === null || v === undefined) ? "" : String(v).trim();
function renderVariant(id){
const v = variantData[id]; if(!v) return;
// headers
tableHeadCells[0].innerHTML = sanitize(v.tableCol1Name);
tableHeadCells[1].innerHTML = sanitize(v.tableCol2Name);
tableHeadCells[2].innerHTML = sanitize(v.tableCol3Name);
// body
tableBody.innerHTML = "";
(v.col1Values || []).forEach((_, i) => {
let c1 = sanitize(v.col1Values?.[i]);
const c2 = sanitize(v.col2Values?.[i]);
const c3 = sanitize(v.col3Values?.[i]);
const indent = v.colIndentations?.[i] || 0;
if (c1 && c1.includes('(') && c1.includes(')')) {
c1 = c1.replace(/\(([^)]+)\)/g, '<span class="light-text">($1)</span>');
}
// replace "N/A" or blank with empty string
const cell1 = (c1 === "N/A" || c1 === "") ? "" : c1;
const cell2 = (c2 === "N/A" || c2 === "") ? "" : c2;
const cell3 = (c3 === "N/A" || c3 === "") ? "" : c3;
if (cell1 || cell2 || cell3) {
tableBody.insertAdjacentHTML("beforeend", `
<tr>
<td class="td--name indent-${indent}">${cell1}</td>
<td class="td--amt">${cell2}</td>
<td class="td--dv">${cell3}</td>
</tr>
`);
}
});
(v.lastCol1Value || []).forEach((_, i) => {
const l1 = sanitize(v.lastCol1Value?.[i]);
const l2 = sanitize(v.lastCol2Value?.[i]);
const l3 = sanitize(v.lastCol3Value?.[i]);
const cell1 = (l1 === "N/A" || l1 === "") ? "" : l1;
const cell2 = (l2 === "N/A" || l2 === "") ? "" : l2;
const cell3 = (l3 === "N/A" || l3 === "") ? "" : l3;
if (cell1 || cell2 || cell3) {
tableBody.insertAdjacentHTML("beforeend", `
<tr class="${ i == 0 ? 'first--row' : ''} ${i}--richtext">
<td class="td--name">${cell1}</td>
<td class="td--amt">${cell2}</td>
<td class="td--dv">${cell3}</td>
</tr>
`);
}
});
(v.thirdCol1Values || []).forEach((_, i) => {
const t1 = sanitize(v.thirdCol1Values?.[i]);
const t2 = sanitize(v.thirdCol2Values?.[i]);
const t3 = sanitize(v.thirdCol3Values?.[i]);
const cell1 = (t1 === "N/A" || t1 === "") ? "" : t1;
const cell2 = (t2 === "N/A" || t2 === "") ? "" : t2;
const cell3 = (t3 === "N/A" || t3 === "") ? "" : t3;
if (cell1 || cell2 || cell3) {
tableBody.insertAdjacentHTML("beforeend", `
<tr class="table-row-3 ${i === 0 ? 'table-row-3--first' : ''}">
<td class="td--name">${cell1}</td>
<td class="td--amt">${cell2}</td>
<td class="td--dv">${cell3}</td>
</tr>
`);
}
});
// ✅ thirdTable row
const thirdHTML = v.thirdTable || '';
if (thirdHTML) {
tableBody.insertAdjacentHTML("beforeend", `
<tr>
<td class="td--third" colspan="3">${thirdHTML}</td>
</tr>
`);
}
// right column (only render non-empty items)
const items = [];
if (sanitize(v.ingredients)) {
items.push(`<li><span class="supp-right__heading">Ingredients:</span>
<div class="supp-right__body">${sanitize(v.ingredients)}</div></li>`);
}
if (sanitize(v.otherIngredients)) {
items.push(`<li><span class="supp-right__heading">Other Ingredients:</span>
<div class="supp-right__body">${sanitize(v.otherIngredients)}</div></li>`);
}
if (sanitize(v.recommendedUse)) {
items.push(`<li><span class="supp-right__heading">Recommended Use:</span>
<div class="supp-right__body">${sanitize(v.recommendedUse)}</div></li>`);
}
if (sanitize(v.directions)) {
items.push(`<li><span class="supp-right__heading">DIRECTIONS FOR USE::</span>
<div class="supp-right__body">${sanitize(v.directions)}</div></li>`);
}
if (sanitize(v.direction)) {
items.push(`<li><span class="supp-right__heading">Directions:</span>
<div class="supp-right__body">${sanitize(v.direction)}</div></li>`);
}
if (sanitize(v.storage)) {
items.push(`<li><span class="supp-right__heading">Storage:</span>
<div class="supp-right__body">${sanitize(v.storage)}</div></li>`);
}
if (sanitize(v.allergenStatement)) {
items.push(`<li><span class="supp-right__heading">Allergen Information:</span>
<div class="supp-right__body">${sanitize(v.allergenStatement)}</div></li>`);
}
if (sanitize(v.warning)) {
items.push(`<li><span class="supp-right__heading">Warning:</span>
<div class="supp-right__body">${sanitize(v.warning)}</div></li>`);
}
if (sanitize(v.notice)) {
items.push(`<li><p class="supp-right__heading supp-right__text">Notice:</p><div class="supp-right__body">${sanitize(v.notice)}</div></li>`);
}
right.innerHTML = `<ul class="supp-right__list">${items.join("")}</ul>`;
// subhead serving size
const sizeText = sanitize(v.servingSize);
console.log(sizeText, 'size test')
const subheadWrap = document.querySelector(".supp-subhead");
if (subheadWrap) {
const servingSize = sanitize(v.servingSize);
const servingsPerContainer = sanitize(v.servingsPerContainer);
let html = "";
if (servingSize) {
html += `<span>Serving Size: <a>${servingSize}</a></span>`;
}
if (servingsPerContainer) {
html += `<span class="serving_per">Servings Per Container: <a>${servingsPerContainer}</a></span>`;
}
subheadWrap.innerHTML = html;
subheadWrap.style.display = html ? "" : "none";
}
}
if (nativeSelect?.value) renderVariant(nativeSelect.value);
nativeSelect?.addEventListener("change", e => renderVariant(e.target.value));
/* -------- Custom dropdown enhancer (matches screenshot) -------- */
(function enhanceSelect(){
const native = document.querySelector('#product-variant-select[data-enhance-select]');
if (!native) return;
// Build UI
native.setAttribute('aria-hidden', 'true'); // hide from AT once enhanced
const wrap = native.parentElement;
// Trigger button
const btn = document.createElement('button');
btn.type = 'button';
btn.className = 'selx';
btn.setAttribute('aria-haspopup','listbox');
btn.setAttribute('aria-expanded','false');
const labelSpan = document.createElement('span');
labelSpan.textContent = native.selectedOptions[0]?.text || 'Choose';
btn.appendChild(labelSpan);
const chev = document.createElementNS('http://www.w3.org/2000/svg','svg');
chev.setAttribute('viewBox','0 0 24 24'); chev.classList.add('chev');
const p = document.createElementNS('http://www.w3.org/2000/svg','path');
p.setAttribute('d','M6 9l6 6 6-6'); p.setAttribute('fill','none'); p.setAttribute('stroke','currentColor'); p.setAttribute('stroke-width','2');
chev.appendChild(p); btn.appendChild(chev);
// Menu
const menu = document.createElement('div');
menu.className = 'selx-menu'; menu.setAttribute('role','listbox'); menu.setAttribute('tabindex','-1');
const opts = [];
[...native.options].forEach((o, idx) => {
const row = document.createElement('div');
row.className = 'selx-opt';
row.setAttribute('role','option');
row.dataset.value = o.value;
row.setAttribute('aria-selected', o.selected ? 'true' : 'false');
row.tabIndex = -1;
const check = document.createElement('span'); check.className = 'selx-check';
check.innerHTML = '<svg viewBox="0 0 24 24" width="16" height="16" aria-hidden="true"><path d="M20 6L9 17l-5-5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>';
row.appendChild(check);
const txt = document.createElement('span'); txt.textContent = o.text; row.appendChild(txt);
row.addEventListener('click', () => selectValue(o.value, true));
menu.appendChild(row);
opts.push(row);
});
wrap.appendChild(btn);
wrap.appendChild(menu);
// Behavior
let open = false, activeIndex = native.selectedIndex;
function openMenu(){
if (open) return;
open = true; btn.setAttribute('aria-expanded','true');
menu.dataset.open = 'true';
requestAnimationFrame(() => {
const t = opts[activeIndex] || opts[0];
t?.focus({preventScroll:true});
if (t) menu.scrollTop = t.offsetTop - 10;
});
document.addEventListener('click', onDocClick);
document.addEventListener('keydown', onKeydown);
}
function closeMenu(){
if (!open) return;
open = false; btn.setAttribute('aria-expanded','false');
menu.dataset.open = 'false';
document.removeEventListener('click', onDocClick);
document.removeEventListener('keydown', onKeydown);
btn.focus({preventScroll:true});
}
function onDocClick(e){ if (!wrap.contains(e.target)) closeMenu(); }
function onKeydown(e){
const max = opts.length - 1;
if (e.key === 'Escape'){ e.preventDefault(); closeMenu(); return; }
if (e.key === 'ArrowDown'){ e.preventDefault(); activeIndex = Math.min(max, activeIndex+1); opts[activeIndex].focus(); return; }
if (e.key === 'ArrowUp'){ e.preventDefault(); activeIndex = Math.max(0, activeIndex-1); opts[activeIndex].focus(); return; }
if (e.key === 'Enter' || e.key === ' '){
e.preventDefault();
const val = opts[activeIndex]?.dataset.value;
if (val) selectValue(val, true);
}
}
btn.addEventListener('click', () => open ? closeMenu() : openMenu());
function selectValue(val, triggerChange){
native.value = val;
opts.forEach((r, i) => {
const sel = (r.dataset.value === val);
r.setAttribute('aria-selected', sel ? 'true' : 'false');
if (sel) activeIndex = i;
});
labelSpan.textContent = native.selectedOptions[0]?.text || '';
closeMenu();
if (triggerChange){
native.dispatchEvent(new Event('change', {bubbles:true}));
}
}
native.addEventListener('change', () => {
labelSpan.textContent = native.selectedOptions[0]?.text || '';
const val = native.value;
console.log(val, 'vallule')
opts.forEach((r, i) => {
const sel = (r.dataset.value === val);
r.setAttribute('aria-selected', sel ? 'true' : 'false');
if (sel) activeIndex = i;
});
});
})();
});
</script>
<style>
:root{
--supp-radius: 18px;
--supp-border: #BDBDBD;
--supp-head: #0B0B0B;
--supp-muted: #6B6B6B;
--supp-rule: #BDBDBD;
--supp-accent: #208468; /* teal-ish like mock */
--selx-green: #E9F9D8; /* dropdown selected bg */
}
.visually-hidden{position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px);white-space:nowrap;}
.supp-card{
border:1px solid var(--supp-border);
border-radius: var(--supp-radius);
padding: 28px clamp(20px, 3vw, 36px);
background:#fff;
margin: 24px auto;
max-width: 1408px;
}
.supp-card__head{
display:flex; align-items:center; gap:16px; justify-content:space-between;
padding-bottom: 14px;
border-bottom:1px solid var(--supp-rule);
}
.supp-title{
margin: 0;
color: #161819;
font-family: Lateral;
font-size: 36px;
font-style: normal;
font-weight: 700;
line-height: 44px;
letter-spacing: 0.072px;
}
span.serving_per {
display: block;
margin-top: 10px;
}
/* Custom select */
.supp-variant { position: relative; min-width: 320px; }
@media (max-width: 520px){ .supp-variant{ min-width: 100%; } }
.supp-variant select.product-variant-select{
position:absolute; inset:0; width:100%; height:100%;
opacity:0; pointer-events:none; /* hidden after enhance */
}
.selx {
position:relative;
display:flex; align-items:center; justify-content:space-between;
width:100%;
border-radius: 4px;
border: 1px solid var(--Grays-Butters-Gray, #BDBDBD);
background: var(--Primary-White, #FFF);
padding:12px 40px 12px 14px;
font-size:14px; line-height:1.25; color:#333;
cursor:pointer;
transition:border-color .15s ease;
}
.selx:focus-visible{ outline:2px solid var(--supp-accent); outline-offset:2px; }
.selx:hover{ border-color:#D6D6D6; }
.selx .chev{
position:absolute; right:12px; top:50%; transform:translateY(-50%);
width:18px; height:18px; color:#777; pointer-events:none;
transition: transform .15s ease;
}
.selx[aria-expanded="true"] .chev{ transform:translateY(-50%) rotate(180deg); }
.selx-menu{
position:absolute; left:0; right:0; top:calc(100% + 8px);
max-height: 320px; overflow:auto;
background:#fff; border:1px solid var(--supp-border); border-radius:10px;
box-shadow: 0 8px 28px rgba(0,0,0,.08);
z-index: 40; padding:6px 0; display:none;
}
.selx-menu[data-open="true"]{ display:block; }
.selx-opt{
display:flex; align-items:center; gap:10px;
padding:10px 14px; font-size:14px; color:#222; cursor:pointer;
}
.selx-opt:hover{
background: #E5FDCF;
}
.selx-check{
width:16px; height:16px; display:inline-flex; align-items:center; justify-content:center;
color: var(--supp-accent); opacity:0; flex:0 0 16px;
}
.selx-opt[aria-selected="true"] .selx-check{
opacity:1;
color: #208468;
height: 11px;
width: 14px;
}
.selx-menu::-webkit-scrollbar{ width:10px; }
.selx-menu::-webkit-scrollbar-thumb{ background:#E6E6E6; border-radius:10px; }
.supp-subhead{
color: #444646;
font-family: 'Heebo';
font-size: 14px;
font-style: normal;
font-weight: 500;
line-height: 20px;
letter-spacing: 0.028px;
}
.supp-subhead a{
text-decoration: none;
color: #208468;
font-family: 'Heebo';
font-size: 14px;
font-style: normal;
font-weight: 500;
line-height: 20px;
letter-spacing: 0.028px;
}
.supp-grid{
display:grid; grid-template-columns: 1.2fr 1.2fr;
gap: 40px;
margin-top: 24px;
}
/* TABLE */
.supp-table{ width:100%; border-collapse: collapse; }
.supp-table thead td{
text-align: left;
text-transform: uppercase;
padding: 8px 0px;
border-bottom: 6px solid #111;
background: transparent;
color: #161819;
font-family: 'Heebo';
font-size: 12px;
font-style: normal;
font-weight: 600;
line-height: 20px;
letter-spacing: 0.024px;
}
td.td--third {
border-top: 6px solid #111;
}
tr.table-row-3.table-row-3--first {
border-top: 6px solid #111;
}
.supp-table .th--mid, .supp-table .td--amt{ width: 20%; text-align:end; }
.supp-table .th--right, .supp-table .td--dv{ width: 12%; text-align:right; }
.supp-table tbody tr{ border-bottom:1px solid var(--supp-rule); }
.supp-table td{
padding: 4px 0px;
vertical-align: top;
color: #161819;
font-size: 12px;
font-style: normal;
font-weight: 500;
line-height: 20px;
letter-spacing: 0.024px;
}
.supp-table .td--name.indent-1 { padding-left: 24px;}
.supp-table .td--name.indent-2 { padding-left: 42px; }
.supp-table .td--amt{ color:#161819; font-weight:500; }
.supp-table .td--dv{ color:#333; text-align:right; }
/* RIGHT COLUMN */
.supp-right__list{ list-style:none; padding:0; margin:0; }
.supp-right__list > li{ margin-bottom: 18px; }
.supp-right__heading{
display: block;
margin: 0 0 6px 0;
color: var(--supp-accent);
font-family: 'Heebo';
font-size: 12px;
font-style: normal;
font-weight: 500;
line-height: 20px;
letter-spacing: 0.024px;
text-transform: uppercase;
}
.supp-right__body .metafield-rich_text_field p{
font-family: 'Heebo';
font-size: 12px;
font-style: normal;
font-weight: 500;
line-height: 20px;
letter-spacing: 0.024px;
color: #161819;
}
.supp-right__text{ color:#208468; font-size:12px; line-height:1.55; margin-bottom:0px; }
.supp-right__body ul{
padding-left: 40px;
margin: 6px 0;
list-style: disc;
font-family: ''Heebo'';
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: 20px;
letter-spacing: 0.024px;
color: #161819;
}
.supp-select span {
color: var(--Grayscale-Black, #161819);
font-family: 'Heebo';
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
letter-spacing: 0.032px;
}
.supp-table tbody tr.first--row { border-top: 6px solid #111; }
.supp-table .td--name .light-text {
color:#706F73;
font-family: 'Heebo';
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: 20px;
letter-spacing: 0.024px;
}
.td--third .metafield-rich_text_field p {
letter-spacing: 0.024px;
color: #161819;
font-size: 12px;
font-style: normal;
font-weight: 500;
line-height: 20px;
}
.supp-table tr.\31 --richtext .td--amt{
width:10%;
}
.header-mid {
width: 40%;
}
/* RESPONSIVE */
@media (max-width: 980px){
.supp-grid{ grid-template-columns: 1fr; gap:22px; }
.supp-variant{ min-width: 220px; }
}
@media (max-width: 520px){
.supp-title{ font-size: 28px; }
.supp-card{ padding: 22px 16px; border-radius:14px; margin: 20px 12px; }
.supp-variant{ width:100%; }
.supp-table thead td{ font-size:12px; }
.supp-table td{ font-size:12px; }
.supp-card__head {
flex-direction: column;
}
}
.supp-variant[data-option-size="1"]{
display: none !important;
}
</style>
</section>
</div><div id="shopify-section-template--21336520622297__section_abJWkA" class="shopify-section section-wrapper">
<div class="section-wrapper pdp-section pdp-section-ba-carousel">
<div class="section-background color-scheme-1"></div>
<div
class="section section--page-width color-scheme-1"
style="
"
>
<div
class="border-style custom-section-content"
style="--border-width: 1px; --border-style: none;
--border-color: rgb(var(--color-border-rgb) / 1.0);
--border-radius: 0px;
"
>
<div class="custom-section-background">
</div>
<div
class="
spacing-style
layout-panel-flex
layout-panel-flex--column
section-content-wrapper
mobile-column
"
style="
--flex-direction: column; --flex-wrap: nowrap;
--gap: 0px;
--horizontal-alignment: center; --vertical-alignment: center;
--vertical-alignment-mobile: center;
--padding-block-start: 0px;--padding-block-end: 0px;
"
data-testid="section-content"
>
<div
class=" spacing-style text-block text-block--AVjYyMU83dnQwUTg0Q__text_cdTUfL text-heading-display-2
"
style="
--padding-block-start: 0px; --padding-block-end:24px;
--padding-inline-start:0px; --padding-inline-end:0px;
--color: var(--color-foreground);--font-weight: 500;
--width: fit-content;
--max-width: var(--max-width--body-normal);
"
>
<h2>They achieved a whole-body reboot in 21 days.</h2>
</div>
<style>
</style>
<div
class="media-carousel media-carousel--AZHRYUlBuNDYxQ3Joa__ba_carousel_dynamic_9JeKAJ ba-carousel"
data-section-id="AZHRYUlBuNDYxQ3Joa__ba_carousel_dynamic_9JeKAJ"
data-autoplay="false"
data-autoplay-speed="5"
data-move-by="1"
data-infinite-scroll="false"
data-arrow-position="image"
data-mobile-layout="single"
style="
--slides-desktop: 3;
--slides-mobile: 1;
--gap-mobile: 20px;
--gap-desktop: 40px;
--arrow-bg-color: #ffffff;
--arrow-icon-color: #000000;
--dot-inactive-color: #d9d9d9;
--dot-active-color: #208468;
--carousel-bg-color: #ffffff;
--carousel-desktop-width: 100%;
--carousel-mobile-width: 100vw;
--carousel-margin-x: 0;
"
>
<div class="carousel-wrapper">
<button class="carousel-arrow prev" aria-label="Previous slide">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M11.78 5.22a.75.75 0 0 1 0 1.06L8.06 10l3.72 3.72a.75.75 0 1 1-1.06 1.06l-4.25-4.25a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Z" clip-rule="evenodd"></path></svg>
</button>
<div class="carousel-viewport">
<div class="carousel-track">
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-001-jennifer-g-en-us.png?v=1772480322&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-001-jennifer-g-en-us.png?v=1772480322&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-001-jennifer-g-en-us.png?v=1772480322&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Jennifer G.</div>
<div class="tile-subtitle">Lost 10 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“I plan on doing the Reset at least once every year ... I feel amazing!”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-002-becca-m-en-us.png?v=1772480314&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-002-becca-m-en-us.png?v=1772480314&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-002-becca-m-en-us.png?v=1772480314&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Becca M.</div>
<div class="tile-subtitle">Lost 16 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>"I loved everything about the Ultimate Reset. I felt AMAZING. I was surprised how MUCH food you got to eat. I was full all the time. I loved that I started to see results right away. It was so encouraging to step on the scale and to consistently see it going in the right direction."</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-003-vince-l-en-us.png?v=1772480318&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-003-vince-l-en-us.png?v=1772480318&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-003-vince-l-en-us.png?v=1772480318&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Vince L.</div>
<div class="tile-subtitle">Lost 17 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“I liked the flexibility options with the meals and the Reset in a crunch. The foods were easy to find at my local grocery store.”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-004-meghan-b-en-us.png?v=1772480320&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-004-meghan-b-en-us.png?v=1772480320&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-004-meghan-b-en-us.png?v=1772480320&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Meghan B.</div>
<div class="tile-subtitle">Lost 11 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“I loved Ultimate Reset’s recipes! It made preparing my food a ritual that I was excited about doing. I learned to cook foods I’d never heard of before, and they all tasted amazing!”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-005-paul-c-en-us.png?v=1772480324&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-005-paul-c-en-us.png?v=1772480324&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-005-paul-c-en-us.png?v=1772480324&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Paul C.</div>
<div class="tile-subtitle">Lost 13 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>"My doctor was amazed at the drop in my cholesterol. ... Ultimate Reset was neat and organized, with a detailed daily schedule and meal plan. During this process of changing my food habits and learning to eat much healthier, I found meals that I have since incorporated into our normal rotation."</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-006-john-w-en-us.png?v=1772480316&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-006-john-w-en-us.png?v=1772480316&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-006-john-w-en-us.png?v=1772480316&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">John W.</div>
<div class="tile-subtitle">Lost 19 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“It wasn’t as difficult as I had imagined in my head. I really liked the structure of the program. And results wise – awesome! One of the best results I had with the Reset was my energy level.”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-007-jessi-s-en-us.png?v=1772480317&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-007-jessi-s-en-us.png?v=1772480317&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-007-jessi-s-en-us.png?v=1772480317&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Jessi S.</div>
<div class="tile-subtitle">Lost 13 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“I really loved how everything was laid out and that there was no guesswork! During the program, I realized the difference between eating to fill and eating to fuel. I learned what foods I should eat, and I also gained a love for nutrition.”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-008-kyle-w-en-us.png?v=1772480315&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-008-kyle-w-en-us.png?v=1772480315&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-008-kyle-w-en-us.png?v=1772480315&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Kyle W.</div>
<div class="tile-subtitle">Lost 18 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“I feel healthier. I’m a little smaller. Ultimate Reset has opened up a new perspective on eating vegan. I’m proud I lost 18 pounds!”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-009-kelly-m-en-us.png?v=1772480316&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-009-kelly-m-en-us.png?v=1772480316&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-009-kelly-m-en-us.png?v=1772480316&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Kelly M.</div>
<div class="tile-subtitle">Lost 14 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“Ultimate Reset was just what I needed! I immediately started seeing results! I loved that it told you exactly what to eat and gave you all of the supplements needed to feel like a new person!”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-010-blake-m-en-us.png?v=1772480321&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-010-blake-m-en-us.png?v=1772480321&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-010-blake-m-en-us.png?v=1772480321&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Blake M.</div>
<div class="tile-subtitle">Lost 12 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“The main thing I liked about UR is that I was practicing the skills I needed in order to prepare food and eat the way I needed to achieve and maintain the lean, muscular look I desire for myself!”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-011-tamela-f-en-us.png?v=1772480326&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-011-tamela-f-en-us.png?v=1772480326&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-011-tamela-f-en-us.png?v=1772480326&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Tamela F.</div>
<div class="tile-subtitle">Lost 13 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“I was absolutely blown away with my Ultimate Reset results! ... I am much more aware of what I put in my body and make a more consistent effort to eat more clean. I love that I am in better shape now at 43 years old than I was when I was 31!”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-012-dan-v-en-us.png?v=1772480318&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-012-dan-v-en-us.png?v=1772480318&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-012-dan-v-en-us.png?v=1772480318&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Dan V.</div>
<div class="tile-subtitle">Lost 13 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“I can’t thank BODi enough for putting this program together. I think it’s an invaluable tool in my arsenal to live a healthy and fulfilling life.”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-013-heidi-t-en-us.png?v=1772480314&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-013-heidi-t-en-us.png?v=1772480314&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-013-heidi-t-en-us.png?v=1772480314&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Heidi T.</div>
<div class="tile-subtitle">Lost 12 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“I lost all the bloat from the holidays and lost weight in my mid-section. I have my energy back, and I feel alive again. It has turned my life around 180 degrees! I loved Ultimate Reset.”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-014-elsa-s-en-us.png?v=1772480321&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-014-elsa-s-en-us.png?v=1772480321&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-014-elsa-s-en-us.png?v=1772480321&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Elsa S.</div>
<div class="tile-subtitle">Lost 13 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“My relationship with food has forever changed. I lost 13 pounds that aren’t coming back because I won’t be fueling my body with the wrong foods anymore.”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-015-yael-c-en-us.png?v=1772480317&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-015-yael-c-en-us.png?v=1772480317&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-015-yael-c-en-us.png?v=1772480317&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Yael C.</div>
<div class="tile-subtitle">Lost 11 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“There are so many reasons why I loved the program! I thrived on the structure. The meals and supplements were all laid out for me, so I didn’t have to think about it.”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-016-tiffany-w-en-us.png?v=1772480320&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-016-tiffany-w-en-us.png?v=1772480320&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-016-tiffany-w-en-us.png?v=1772480320&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Tiffany W.</div>
<div class="tile-subtitle">Lost 14 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“Ultimate Reset is life-changing and has helped me make better decisions about my nutrition. I absolutely loved the food, and I rediscovered my passion for cooking. My focus is a lot better now, and my skin is literally glowing.”<br />
</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-017-isabell-c-en-us.png?v=1772480319&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-017-isabell-c-en-us.png?v=1772480319&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-017-isabell-c-en-us.png?v=1772480319&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Isabell C.</div>
<div class="tile-subtitle">Lost 9 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“I loved eating fresh food every day and feeling full but light. I also liked having a pre-planned meal plan so I didn’t have to worry about bad food choices.”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-018-laura-c-en-us.png?v=1772480324&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-018-laura-c-en-us.png?v=1772480324&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-018-laura-c-en-us.png?v=1772480324&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Laura C.</div>
<div class="tile-subtitle">Lost 7 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>“I never felt starved, hungry, or defeated on Ultimate Reset. I felt challenged, energized, and prepped to start a whole new chapter with my fitness and nutrition.”</p></div></div>
</div>
</div>
</div>
<div class="carousel-slide">
<div class="carousel-card">
<div class="card-content">
<img src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-019-mia-e-en-us.png?v=1772480316&width=800" alt="Ultimate Reset cleanse before and after results" srcset="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-019-mia-e-en-us.png?v=1772480316&width=352 352w, //shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-before-and-after-019-mia-e-en-us.png?v=1772480316&width=800 800w" width="800" height="774" loading="lazy">
<div class="tile-title">Mia E.</div>
<div class="tile-subtitle">Lost 12 lbs. in 21 Days†</div>
<div class="ba-testimonial"><div class="metafield-rich_text_field"><p>"The Reset was challenging, but I felt amazing when I completed it. I feel great from the inside out, and people tell me I’m glowing."</p></div></div>
</div>
</div>
</div>
</div>
</div>
<button class="carousel-arrow next" aria-label="Next slide">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06 1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z" clip-rule="evenodd"></path></svg>
</button>
</div>
<div class="carousel-dots"></div>
</div>
<script>
function initMediaCarousel(carousel) {
const track = carousel.querySelector('.carousel-track');
const prev = carousel.querySelector('.prev');
const next = carousel.querySelector('.next');
const dotsWrap = carousel.querySelector('.carousel-dots');
if (!track) return;
const originalSlides = [];
track.querySelectorAll('.carousel-slide:not(.carousel-slide-clone)').forEach((slide) => {
originalSlides.push(slide);
});
if (originalSlides.length === 0) return;
let index = 0;
let timer;
let isTransitioning = false;
const moveBy = Number(carousel.dataset.moveBy) || 1;
const autoplay = carousel.dataset.autoplay === 'true';
const autoplaySpeed = Number(carousel.dataset.autoplaySpeed) * 1000 || 5000;
const infiniteScroll = carousel.dataset.infiniteScroll === 'true';
const arrowPosition = carousel.dataset.arrowPosition || 'image';
const slidesPerView = () =>
window.innerWidth < 768
? Number(getComputedStyle(carousel).getPropertyValue('--slides-mobile'))
: Number(getComputedStyle(carousel).getPropertyValue('--slides-desktop'));
const maxIndex = () => Math.max(0, originalSlides.length - slidesPerView());
function updateArrowPosition() {
const wrapper = carousel.querySelector('.carousel-wrapper');
if (!wrapper) return;
if (arrowPosition === 'image') {
const firstSlide = originalSlides[0];
if (!firstSlide) return;
const firstImage = firstSlide.querySelector(
"img, picture, .image-block, .card-media, [class*='image']"
);
if (firstImage) {
const img = firstImage.tagName === 'IMG' ? firstImage : firstImage.querySelector('img');
const calculatePosition = () => {
const wrapperRect = wrapper.getBoundingClientRect();
const imageRect = firstImage.getBoundingClientRect();
const imageTop = imageRect.top - wrapperRect.top;
const imageCenter = imageTop + imageRect.height / 2;
wrapper.style.setProperty('--arrow-top', `${imageCenter}px`);
};
if (img && !img.complete) {
img.addEventListener('load', calculatePosition, { once: true });
} else {
calculatePosition();
}
}
} else {
wrapper.style.setProperty('--arrow-top', '50%');
}
}
let cloneCount = 0;
function setupInfiniteLoop() {
if (!infiniteScroll || originalSlides.length <= slidesPerView()) {
track.querySelectorAll('.carousel-slide-clone').forEach((el) => el.remove());
cloneCount = 0;
index = Math.min(index, maxIndex());
return;
}
track.querySelectorAll('.carousel-slide-clone').forEach((el) => el.remove());
cloneCount = Math.ceil(Math.max(slidesPerView(), moveBy));
for (
let i = originalSlides.length - 1;
i >= Math.max(0, originalSlides.length - cloneCount);
i--
) {
const clone = originalSlides[i].cloneNode(true);
clone.classList.add('carousel-slide-clone');
clone.setAttribute('aria-hidden', 'true');
track.insertBefore(clone, track.firstChild);
}
for (let i = 0; i < Math.min(cloneCount, originalSlides.length); i++) {
const clone = originalSlides[i].cloneNode(true);
clone.classList.add('carousel-slide-clone');
clone.setAttribute('aria-hidden', 'true');
track.appendChild(clone);
}
index = cloneCount;
}
function updatePosition(withTransition = true) {
const allSlides = Array.from(track.children);
if (allSlides.length === 0) return;
const slideWidth = allSlides[0].offsetWidth + parseInt(getComputedStyle(track).gap || 0);
if (!withTransition) {
track.style.transition = 'none';
}
track.style.transform = `translateX(-${index * slideWidth}px)`;
if (!withTransition) {
track.offsetHeight;
track.style.transition = '';
}
updateArrows();
updateDots();
}
function updateArrows() {
if (!prev || !next) return;
const overflow = originalSlides.length > slidesPerView();
if (infiniteScroll) {
prev.style.display = overflow ? 'flex' : 'none';
next.style.display = overflow ? 'flex' : 'none';
} else {
const currentIndex = infiniteScroll ? index - cloneCount : index;
prev.style.display = overflow && currentIndex > 0 ? 'flex' : 'none';
next.style.display = overflow && currentIndex < maxIndex() ? 'flex' : 'none';
}
}
function createDots() {
if (!dotsWrap) return;
dotsWrap.innerHTML = '';
const totalPages = maxIndex() + 1;
for (let i = 0; i < totalPages; i++) {
const btn = document.createElement('button');
btn.setAttribute('aria-label', `Go to slide ${i + 1}`);
btn.onclick = () => {
if (infiniteScroll) {
index = i + cloneCount;
} else {
index = i;
}
updatePosition();
stopAutoplay();
};
dotsWrap.appendChild(btn);
}
}
function updateDots() {
if (!dotsWrap) return;
let realIndex;
if (infiniteScroll) {
realIndex = index - cloneCount;
const totalRealSlides = originalSlides.length;
if (realIndex < 0) {
realIndex = totalRealSlides + realIndex;
} else if (realIndex >= totalRealSlides) {
realIndex = realIndex - totalRealSlides;
}
} else {
realIndex = index;
}
const dotIndex = Math.max(0, Math.min(realIndex, maxIndex()));
[...dotsWrap.children].forEach((dot, i) => {
dot.classList.toggle('active', i === dotIndex);
});
}
function handleInfiniteLoop() {
if (!infiniteScroll || cloneCount === 0) return;
const allSlides = Array.from(track.children);
const totalSlides = allSlides.length;
if (index >= originalSlides.length + cloneCount) {
const offset = index - (originalSlides.length + cloneCount);
index = cloneCount + offset;
updatePosition(false);
} else if (index < cloneCount) {
const offset = cloneCount - index;
index = originalSlides.length + cloneCount - offset;
updatePosition(false);
}
}
function startAutoplay() {
if (!autoplay) return;
timer = setInterval(() => {
moveNext();
}, autoplaySpeed);
}
function stopAutoplay() {
clearInterval(timer);
}
function movePrev() {
if (isTransitioning) return;
isTransitioning = true;
if (infiniteScroll) {
index -= moveBy;
updatePosition();
setTimeout(() => {
handleInfiniteLoop();
isTransitioning = false;
}, 350);
} else {
index = Math.max(0, index - moveBy);
updatePosition();
isTransitioning = false;
}
}
function moveNext() {
if (isTransitioning) return;
isTransitioning = true;
if (infiniteScroll) {
index += moveBy;
updatePosition();
setTimeout(() => {
handleInfiniteLoop();
isTransitioning = false;
}, 350);
} else {
index = Math.min(maxIndex(), index + moveBy);
updatePosition();
isTransitioning = false;
}
}
prev?.addEventListener('click', () => {
stopAutoplay();
movePrev();
});
next?.addEventListener('click', () => {
stopAutoplay();
moveNext();
});
let touchStartX = 0;
let touchCurrentX = 0;
let touchStartY = 0;
let isDragging = false;
let dragOffset = 0;
let startTranslateX = 0;
const viewport = carousel.querySelector('.carousel-viewport');
function getSlideWidth() {
const allSlides = Array.from(track.children);
if (allSlides.length === 0) return 0;
return allSlides[0].offsetWidth + parseInt(getComputedStyle(track).gap || 0);
}
function getCurrentTranslateX() {
const style = window.getComputedStyle(track);
const matrix = new DOMMatrix(style.transform);
return matrix.m41;
}
viewport?.addEventListener(
'touchstart',
(e) => {
touchStartX = e.touches[0].clientX;
touchStartY = e.touches[0].clientY;
touchCurrentX = touchStartX;
isDragging = false;
startTranslateX = getCurrentTranslateX();
track.style.touchAction = 'pan-x';
track.style.transition = 'none';
stopAutoplay();
},
{ passive: true }
);
viewport?.addEventListener(
'touchmove',
(e) => {
track.style.touchAction = 'pan-x';
if (isTransitioning) return;
touchCurrentX = e.touches[0].clientX;
const deltaX = touchCurrentX - touchStartX;
const deltaY = e.touches[0].clientY - touchStartY;
if (!isDragging && Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > 10) {
isDragging = true;
}
if (isDragging) {
dragOffset = deltaX;
track.style.transform = `translateX(${startTranslateX + dragOffset}px)`;
}
},
{ passive: true }
);
viewport?.addEventListener(
'touchend',
() => {
if (!isDragging) {
track.style.transition = '';
return;
}
isDragging = false;
track.style.touchAction = 'auto';
track.style.transition = '';
const slideWidth = getSlideWidth();
const velocity = dragOffset;
const threshold = slideWidth * 0.2;
if (Math.abs(velocity) > threshold) {
if (velocity < 0) {
if (infiniteScroll) {
index += moveBy;
updatePosition();
setTimeout(() => {
handleInfiniteLoop();
isTransitioning = false;
}, 350);
} else {
index = Math.min(maxIndex(), index + moveBy);
updatePosition();
}
} else {
if (infiniteScroll) {
index -= moveBy;
updatePosition();
setTimeout(() => {
handleInfiniteLoop();
isTransitioning = false;
}, 350);
} else {
index = Math.max(0, index - moveBy);
updatePosition();
}
}
} else {
updatePosition();
}
dragOffset = 0;
},
{ passive: true }
);
window.addEventListener('resize', () => {
if (infiniteScroll) {
setupInfiniteLoop();
} else {
index = Math.min(index, maxIndex());
}
createDots();
updatePosition(false);
updateArrowPosition();
});
if (infiniteScroll) {
setupInfiniteLoop();
}
createDots();
requestAnimationFrame(() => {
updatePosition(false);
updateArrowPosition();
startAutoplay();
});
}
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.media-carousel').forEach(initMediaCarousel);
});
document.addEventListener('shopify:section:load', (event) => {
event.target.querySelectorAll('.media-carousel').forEach(initMediaCarousel);
});
document.addEventListener('shopify:block:select', (event) => {
const carousel = event.target.closest('.media-carousel');
if (carousel) {
initMediaCarousel(carousel);
}
});
</script>
<div
class=" pdp-ba-disclaimer spacing-style text-block text-block--AdFc4Szd1YXlHTUw4Q__text_3K46EJ text-body-sm
"
style="
--padding-block-start: 0px; --padding-block-end:0px;
--padding-inline-start:0px; --padding-inline-end:0px;
--color: var(--color-foreground);--font-weight: 500;
--width: fit-content;
--max-width: var(--max-width--body-none);
"
>
<p>†Results vary based on starting point and effort. Most of the people featured were independent BODi Partners. Laura C. was a BODi employee. Results achieved in 21 days with the Ultimate Reset program.</p>
</div>
<style>
</style>
</div>
</div>
</div>
</div>
</div><div id="shopify-section-template--21336520622297__section_z79896" class="shopify-section section-wrapper">
<div class="section-wrapper pdp-section pdp-section-faq">
<div class="section-background color-scheme-1"></div>
<div
class="section section--page-width color-scheme-1"
style="
"
>
<div
class="border-style custom-section-content"
style="--border-width: 1px; --border-style: none;
--border-color: rgb(var(--color-border-rgb) / 1.0);
--border-radius: 0px;
"
>
<div class="custom-section-background">
</div>
<div
class="
spacing-style
layout-panel-flex
layout-panel-flex--column
section-content-wrapper
mobile-column
"
style="
--flex-direction: column; --flex-wrap: nowrap;
--gap: 0px;
--horizontal-alignment: center; --vertical-alignment: center;
--vertical-alignment-mobile: center;
--padding-block-start: 0px;--padding-block-end: 0px;
"
data-testid="section-content"
>
<div
class=" spacing-style text-block text-block--Ad25GbXRNL29qWkZ3R__text_mVLhBw text-heading-display-2
"
style="
--padding-block-start: 0px; --padding-block-end:0px;
--padding-inline-start:0px; --padding-inline-end:0px;
--color: var(--color-foreground);--font-weight: 500;
--width: fit-content;
--max-width: var(--max-width--body-narrow);
"
>
<h2>Common questions</h2>
</div>
<style>
</style>
<div
class="accordion accordion--AbVN0OTEzYlFva0p3U__pdp_faq_accordion_KKKCMV accordion--plus accordion--pdp-faq spacing-style faq-content-container"
style="
--accordion-gap: 0px;
--summary-font-family: var(--font-h6--family);
--summary-font-style: var(--font-h6--style);
--summary-font-weight: var(--font-h6--weight);
--summary-font-size: var(--font-h6--size);
--summary-font-line-height: var(--font-h6--line-height);
--summary-font-case: var(--font-h6--case);
--accordion-background-color: #ffffff;
--accordion-text-color: #161819;
--accordion-icon-color: #161819;
--accordion-border-color: #e8eaee;
--accordion-icon-size: 20px;
--accordion-show-borders: 1;
--accordion-show-dividers: 0;
--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;
"
><accordion-custom>
<details
class="details"
data-testid="accordion-details"
>
<summary class="details__header">
<h3>What is the Ultimate Reset?</h3>
<span class="svg-wrapper icon-caret icon-animated"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="svg-wrapper icon-plus"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="vertical" d="M2.75 7H11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
<path class="horizontal" d="M7 2.75L7 11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
</svg>
</span>
</summary>
<div class="details-content">
<div class="metafield-rich_text_field"><p>Ultimate Reset is a 21-day program that gently helps restore the body to its "factory settings" while fueling your body with the right nutrition, so you get the energy you need. Ultimate Reset is a program designed to give your body the daily nutritional foundation it needs, just as a fitness program gets the body in top shape externally. Users looking to restore energy, boost moods, and maximize health can dramatically improve the way they feel and function.</p></div>
</div>
</details>
<div class="accordion-row-divider"></div>
</accordion-custom><accordion-custom>
<details
class="details"
data-testid="accordion-details"
>
<summary class="details__header">
<h3>Who should do the Ultimate Reset program?</h3>
<span class="svg-wrapper icon-caret icon-animated"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="svg-wrapper icon-plus"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="vertical" d="M2.75 7H11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
<path class="horizontal" d="M7 2.75L7 11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
</svg>
</span>
</summary>
<div class="details-content">
<div class="metafield-rich_text_field"><p>Anyone looking to restore energy, lose weight, and maximize health! Whether users have been struggling with their health, food cravings, weight, or even just experiencing low energy and feeling sluggish, in just 3 weeks anyone can dramatically improve the way they feel and function.</p></div>
</div>
</details>
<div class="accordion-row-divider"></div>
</accordion-custom><accordion-custom>
<details
class="details"
data-testid="accordion-details"
>
<summary class="details__header">
<h3>Can Shakeology be taken daily while on the Reset?</h3>
<span class="svg-wrapper icon-caret icon-animated"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="svg-wrapper icon-plus"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="vertical" d="M2.75 7H11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
<path class="horizontal" d="M7 2.75L7 11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
</svg>
</span>
</summary>
<div class="details-content">
<div class="metafield-rich_text_field"><p>Yes, Vegan Shakeology is recommended as a part of the Reset. When using Shakeology as part of the Reset, we recommend using only a Vegan formula.</p></div>
</div>
</details>
<div class="accordion-row-divider"></div>
</accordion-custom><accordion-custom>
<details
class="details"
data-testid="accordion-details"
>
<summary class="details__header">
<h3>Are the Ultimate Reset supplements vegan or gluten-free?</h3>
<span class="svg-wrapper icon-caret icon-animated"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="svg-wrapper icon-plus"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="vertical" d="M2.75 7H11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
<path class="horizontal" d="M7 2.75L7 11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
</svg>
</span>
</summary>
<div class="details-content">
<div class="metafield-rich_text_field"><p>The Ultimate Reset supplement formulas do not include any known animal-derived or gluten-containing ingredients, but the finished products have not been tested and confirmed to be gluten-free. Ultimate Reset products are made in a manufacturing facility that also processes known allergens such as soy, milk, egg, fish, crustacean shellfish, tree nuts, peanuts and wheat (gluten) ingredients.</p><p>While our manufacturing procedures follows strict, required FDA Good Manufacturing Practices (GMPs), which include immediate cleaning and breaking down of equipment after every production batch and proper air filtration systems as precautionary measures, the possibility of cross-contamination can never be 100% eliminated.</p></div>
</div>
</details>
<div class="accordion-row-divider"></div>
</accordion-custom><accordion-custom>
<details
class="details"
data-testid="accordion-details"
>
<summary class="details__header">
<h3>Are the supplements affected by temperature?</h3>
<span class="svg-wrapper icon-caret icon-animated"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="svg-wrapper icon-plus"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="vertical" d="M2.75 7H11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
<path class="horizontal" d="M7 2.75L7 11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
</svg>
</span>
</summary>
<div class="details-content">
<div class="metafield-rich_text_field"><p>For best results, store and consume the product as directed.</p></div>
</div>
</details>
<div class="accordion-row-divider"></div>
</accordion-custom><accordion-custom>
<details
class="details"
data-testid="accordion-details"
>
<summary class="details__header">
<h3>While on Ultimate Reset, should other vitamins be taken?</h3>
<span class="svg-wrapper icon-caret icon-animated"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 5.5L7 9.5L3 5.5" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="svg-wrapper icon-plus"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="vertical" d="M2.75 7H11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
<path class="horizontal" d="M7 2.75L7 11.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/>
</svg>
</span>
</summary>
<div class="details-content">
<div class="metafield-rich_text_field"><p>We recommend consulting with your doctor about taking additional vitamins to assess your individual needs.</p></div>
</div>
</details>
<div class="accordion-row-divider"></div>
</accordion-custom></div><script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "What is the Ultimate Reset?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Ultimate Reset is a 21-day program that gently helps restore the body to its \u0026quot;factory settings\u0026quot; while fueling your body with the right nutrition, so you get the energy you need. Ultimate Reset is a program designed to give your body the daily nutritional foundation it needs, just as a fitness program gets the body in top shape externally. Users looking to restore energy, boost moods, and maximize health can dramatically improve the way they feel and function."
}
},{
"@type": "Question",
"name": "Who should do the Ultimate Reset program?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Anyone looking to restore energy, lose weight, and maximize health! Whether users have been struggling with their health, food cravings, weight, or even just experiencing low energy and feeling sluggish, in just 3 weeks anyone can dramatically improve the way they feel and function."
}
},{
"@type": "Question",
"name": "Can Shakeology be taken daily while on the Reset?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, Vegan Shakeology is recommended as a part of the Reset. When using Shakeology as part of the Reset, we recommend using only a Vegan formula."
}
},{
"@type": "Question",
"name": "Are the Ultimate Reset supplements vegan or gluten-free?",
"acceptedAnswer": {
"@type": "Answer",
"text": "The Ultimate Reset supplement formulas do not include any known animal-derived or gluten-containing ingredients, but the finished products have not been tested and confirmed to be gluten-free. Ultimate Reset products are made in a manufacturing facility that also processes known allergens such as soy, milk, egg, fish, crustacean shellfish, tree nuts, peanuts and wheat (gluten) ingredients. While our manufacturing procedures follows strict, required FDA Good Manufacturing Practices (GMPs), which include immediate cleaning and breaking down of equipment after every production batch and proper air filtration systems as precautionary measures, the possibility of cross-contamination can never be 100% eliminated."
}
},{
"@type": "Question",
"name": "Are the supplements affected by temperature?",
"acceptedAnswer": {
"@type": "Answer",
"text": "For best results, store and consume the product as directed."
}
},{
"@type": "Question",
"name": "While on Ultimate Reset, should other vitamins be taken?",
"acceptedAnswer": {
"@type": "Answer",
"text": "We recommend consulting with your doctor about taking additional vitamins to assess your individual needs."
}
}]
}
</script>
</div>
</div>
</div>
</div>
</div><div id="shopify-section-template--21336520622297__custom_liquid_gHNdke" class="shopify-section"><div class="section-background color-scheme-1"></div>
<div
class="section section--page-width spacing-style color-scheme-1"
style="--padding-block-start: 0px; --padding-block-end:0px;
--padding-inline-start:0px; --padding-inline-end:0px;
"
>
<link href="//shop.bodi.com/cdn/shop/t/2/assets/template-supplement.css?v=92572355177561154461774384456" rel="stylesheet" type="text/css" media="all" />
</div>
</div>
</main>
<!-- BEGIN sections: footer-group -->
<footer id="shopify-section-sections--21336457314521__sticky_footer_pdp_VLUYAc" class="shopify-section shopify-section-group-footer-group footer-section"><section
class="sticky-footer-pdp"
id="sticky-footer-pdp"
data-threshold-mobile="20"
data-threshold-desktop="100"
data-trigger-mode="element_visibility"
data-trigger-selector=".buy-box-cta,.subscription-product-info"
data-currency="USD"
data-locale="en"
data-option-labels="{}"
data-add-to-cart-form-selector="product-form-component form[action*='/cart/add']"
data-product-handle="ultimate-reset-cleanse"
>
<script type="application/json" data-sfpdp-initial-variant>
{"id":47683217391833,"title":"Default Title","option1":"Default Title","option2":null,"option3":null,"sku":"MDSUCLN2101","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Ultimate Reset","public_title":null,"options":["Default Title"],"price":14996,"weight":0,"compare_at_price":19995,"inventory_management":"shopify","barcode":"691303314347","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}}
</script>
<div class="sticky-footer-pdp__content section section--page-width">
<div class="sticky-footer-pdp__image-wrap">
<img
class="sticky-footer-pdp__image"
data-sfpdp-field="image"
src="//shop.bodi.com/cdn/shop/files/bodi-ultimate-reset-en-us.png?v=1772479737&width=112"
alt="Ultimate Reset"
width="56"
height="56"
loading="lazy"
>
</div>
<div class="sticky-footer-pdp__body">
<div class="sticky-footer-pdp__title-row">
<span class="sticky-footer-pdp__name" data-sfpdp-field="title">Ultimate Reset</span>
<button
type="button"
class="sticky-footer-pdp__toggle"
data-sfpdp-toggle
aria-expanded="false"
aria-controls="sticky-footer-pdp-options"
aria-label="Show selected options"
>
<svg class="sticky-footer-pdp__chevron" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 6L8 10L12 6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
<div class="sticky-footer-pdp__options" id="sticky-footer-pdp-options" data-sfpdp-options>
<ul class="sticky-footer-pdp__meta-list" data-sfpdp-field="meta-list"></ul>
<a href="#sections--21336457314521__sticky_footer_pdp_VLUYAc" class="sticky-footer-pdp__edit" data-sfpdp-edit>Edit</a>
</div>
</div>
<div class="sticky-footer-pdp__price" data-sfpdp-field="price">
<s class="sticky-footer-pdp__price-compare" data-sfpdp-field="compare-price">
$199.95
</s>
<span class="sticky-footer-pdp__price-value" data-sfpdp-field="price-value">$149.96</span>
</div>
<button
type="button"
class="bodi-button sticky-footer-pdp__cta"
data-sfpdp-add-to-cart
data-variant-id="47683217391833"
>
Add To Cart
</button>
</div>
</section>
<script>
function initStickyFooterPdp(root) {
const footer = root.querySelector('#sticky-footer-pdp');
if (!footer) return;
if (footer.dataset.initialized === 'true') return;
footer.dataset.initialized = 'true';
const thresholdMobile = parseInt(footer.dataset.thresholdMobile) || 50;
const thresholdDesktop = parseInt(footer.dataset.thresholdDesktop) || 200;
const triggerMode = footer.dataset.triggerMode || 'scroll_depth';
const triggerSelector = (footer.dataset.triggerSelector || '').trim();
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
const stickyFooterOffsetProperty = '--sticky-footer-offset';
function setStickyFooterOffset(height) {
document.body?.style.setProperty(stickyFooterOffsetProperty, `${Math.ceil(height)}px`);
}
function resetStickyFooterOffset() {
document.body?.style.setProperty(stickyFooterOffsetProperty, '0px');
}
const currency = footer.dataset.currency || 'USD';
const locale = footer.dataset.locale || 'en';
const addToCartFormSelector = footer.dataset.addToCartFormSelector;
let optionLabels = {};
try {
optionLabels = JSON.parse(footer.dataset.optionLabels || '{}');
} catch (error) {
console.error('sticky-footer-pdp: could not parse option labels', error);
}
function formatMoney(cents) {
try {
return new Intl.NumberFormat(locale, {
style: 'currency',
currency,
currencyDisplay: 'narrowSymbol',
trailingZeroDisplay: 'stripIfInteger'
}).format((cents || 0) / 100);
} catch (error) {
return `$${((cents || 0) / 100).toFixed(2)}`;
}
}
const toggleButton = footer.querySelector('[data-sfpdp-toggle]');
const editLink = footer.querySelector('[data-sfpdp-edit]');
const addToCartButton = footer.querySelector('[data-sfpdp-add-to-cart]');
const imageEl = footer.querySelector('[data-sfpdp-field="image"]');
const titleEl = footer.querySelector('[data-sfpdp-field="title"]');
const metaListEl = footer.querySelector('[data-sfpdp-field="meta-list"]');
const priceValueEl = footer.querySelector('[data-sfpdp-field="price-value"]');
const comparePriceEl = footer.querySelector('[data-sfpdp-field="compare-price"]');
let isExpanded = false;
let suppressShowUntilRescroll = false;
function isMobile() {
return window.innerWidth < 768;
}
function setExpanded(expanded) {
isExpanded = expanded;
footer.classList.toggle('sticky-footer-pdp--expanded', expanded);
if (toggleButton) {
toggleButton.setAttribute('aria-expanded', expanded ? 'true' : 'false');
}
}
function collapseOptions() {
setExpanded(false);
}
if (toggleButton) {
toggleButton.addEventListener('click', function () {
setExpanded(!isExpanded);
});
}
function dispatchFooterEvent(eventName, data = {}) {
document.dispatchEvent(new CustomEvent(`stickyFooterPdp:${eventName}`, {
detail: {
element: footer,
height: footer.getBoundingClientRect().height,
...data
},
bubbles: true
}));
}
function applyVisibility(shouldShow) {
const isCurrentlyShowing = footer.classList.contains('show');
if (shouldShow && !isCurrentlyShowing) {
footer.classList.add('show');
setTimeout(() => {
setStickyFooterOffset(footer.getBoundingClientRect().height);
dispatchFooterEvent('show');
}, 50);
} else if (!shouldShow && isCurrentlyShowing) {
footer.classList.remove('show');
resetStickyFooterOffset();
dispatchFooterEvent('hide');
}
}
function handleScroll() {
const threshold = isMobile() ? thresholdMobile : thresholdDesktop;
const pastThreshold = window.scrollY > threshold;
if (suppressShowUntilRescroll) {
if (!pastThreshold) {
suppressShowUntilRescroll = false;
} else {
return;
}
}
applyVisibility(pastThreshold);
}
function initScrollDepthTrigger() {
let ticking = false;
window.addEventListener('scroll', function () {
if (!ticking) {
requestAnimationFrame(function () {
handleScroll();
ticking = false;
});
ticking = true;
}
});
handleScroll();
}
function isRenderedVisible(el) {
if (!el.isConnected) return false;
const rect = el.getBoundingClientRect();
if (rect.width === 0 && rect.height === 0) return false;
const style = window.getComputedStyle(el);
if (style.display === 'none' || style.visibility === 'hidden') return false;
return true;
}
function pickTriggerElement(selectorList) {
for (const selector of selectorList) {
const candidates = document.querySelectorAll(selector);
for (const candidate of candidates) {
if (isRenderedVisible(candidate)) return candidate;
}
}
return null;
}
function initElementVisibilityTrigger(attempts = 0) {
const selectorList = triggerSelector
.split(',')
.map((selector) => selector.trim())
.filter(Boolean);
const target = pickTriggerElement(selectorList);
if (!target) {
if (attempts < 30) {
setTimeout(() => initElementVisibilityTrigger(attempts + 1), 100);
return;
}
console.warn(
`sticky-footer-pdp: no visible trigger element matched "${triggerSelector}", falling back to scroll depth`
);
initScrollDepthTrigger();
return;
}
const observer = new IntersectionObserver(
function (entries) {
const entry = entries[0];
const scrolledPast = !entry.isIntersecting && entry.boundingClientRect.top < 0;
applyVisibility(scrolledPast);
},
{ threshold: 0 }
);
observer.observe(target);
}
if (triggerMode === 'element_visibility' && triggerSelector) {
initElementVisibilityTrigger();
} else {
initScrollDepthTrigger();
}
let resizeTimeout = null;
window.addEventListener('resize', function () {
if (resizeTimeout) clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(() => {
if (footer.classList.contains('show')) {
setStickyFooterOffset(footer.getBoundingClientRect().height);
dispatchFooterEvent('resize');
}
}, 100);
});
if (editLink) {
editLink.addEventListener('click', function (event) {
event.preventDefault();
applyVisibility(false);
suppressShowUntilRescroll = true;
if (isMobile()) {
collapseOptions();
}
window.scrollTo({
top: 0,
behavior: prefersReducedMotion ? 'auto' : 'smooth'
});
});
}
document.addEventListener('variant:update', function (event) {
const variant = event.detail && event.detail.resource;
if (!variant) return;
renderVariant(variant);
syncPricingAndFrequency();
if (isMobile()) {
collapseOptions();
}
if (event.detail.data && event.detail.data.newProduct) {
console.warn('sticky-footer-pdp: combined listing product change not handled for title update');
}
});
function renderVariant(variant) {
if (imageEl && variant.featured_image && variant.featured_image.src) {
imageEl.src = variant.featured_image.src;
}
if (metaListEl && Array.isArray(variant.options)) {
const items = variant.options
.map(function (value, index) {
const bucket = optionLabels[index + 1];
return bucket ? value : null;
})
.filter(Boolean);
metaListEl.innerHTML = items
.map((item) => `<li class="sticky-footer-pdp__meta-item">${item}</li>`)
.join('');
}
if (addToCartButton && variant.id) {
addToCartButton.dataset.variantId = variant.id;
}
}
const productHandle = footer.dataset.productHandle;
let productDataPromise = null;
function fetchProductData() {
if (productDataPromise) return productDataPromise;
productDataPromise = fetch(`/products/${productHandle}.js`)
.then((response) => (response.ok ? response.json() : null))
.catch(() => null);
return productDataPromise;
}
function getCurrentVariantId() {
const variantInput = document.querySelector('input[ref="variantId"]');
return (variantInput && variantInput.value) || addToCartButton?.dataset.variantId || '';
}
function getCurrentSellingPlanId() {
const sellingPlanInput = document.querySelector('input[name="selling_plan"]');
return (sellingPlanInput && sellingPlanInput.value) || '';
}
function getVariantPricing(variantId, data, sellingPlanId) {
const id = Number(variantId);
const variant = data.variants?.find((v) => v.id === id);
if (!variant) return { price: data.price || 0, compareAtPrice: null, planName: '' };
if (sellingPlanId) {
const planId = Number(sellingPlanId);
const allocation =
variant.selling_plan_allocations?.find((a) => a.selling_plan_id === planId) ||
variant.selling_plan_allocations?.[0];
if (allocation) {
return {
price: allocation.price,
compareAtPrice:
(allocation.compare_at_price === 0 && variant.compare_at_price > 0)
? variant.compare_at_price
: (allocation.compare_at_price > allocation.price ? allocation.compare_at_price : null),
planName: allocation.selling_plan?.name || 'Subscribe & Save'
};
}
}
return {
price: variant.price,
compareAtPrice: variant.compare_at_price > variant.price ? variant.compare_at_price : null,
planName: ''
};
}
function setFrequencyItem(label) {
if (!metaListEl) return;
const existing = metaListEl.querySelector('[data-sfpdp-frequency]');
if (!label) {
if (existing) existing.remove();
return;
}
if (existing) {
existing.textContent = label;
} else {
const item = document.createElement('li');
item.className = 'sticky-footer-pdp__meta-item';
item.dataset.sfpdpFrequency = '';
item.textContent = label;
metaListEl.appendChild(item);
}
}
async function syncPricingAndFrequency() {
if (!productHandle) return;
const data = await fetchProductData();
if (!data) return;
const variantId = getCurrentVariantId();
const sellingPlanId = getCurrentSellingPlanId();
const { price, compareAtPrice, planName } = variantId
? getVariantPricing(variantId, data, sellingPlanId)
: { price: data.price || 0, compareAtPrice: null, planName: '' };
if (priceValueEl) {
priceValueEl.textContent = formatMoney(price);
}
if (comparePriceEl) {
if (compareAtPrice) {
comparePriceEl.textContent = formatMoney(compareAtPrice);
comparePriceEl.hidden = false;
} else {
comparePriceEl.hidden = true;
}
}
setFrequencyItem(sellingPlanId ? planName : '');
}
function handleSellingPlanChange() {
syncPricingAndFrequency();
if (isMobile()) {
collapseOptions();
}
}
function watchSellingPlanInput(attempts = 0) {
const sellingPlanInput = document.querySelector('input[name="selling_plan"]');
if (sellingPlanInput) {
const observer = new MutationObserver(handleSellingPlanChange);
observer.observe(sellingPlanInput, { attributes: true, attributeFilter: ['value'] });
sellingPlanInput.addEventListener('change', handleSellingPlanChange);
return;
}
if (attempts < 50) {
setTimeout(() => watchSellingPlanInput(attempts + 1), 100);
}
}
watchSellingPlanInput();
function watchNativeWidget(attempts = 0) {
const widget = document.querySelector('recharge-subscription-widget');
if (!widget) return;
if (!widget.shadowRoot) {
if (attempts < 10) {
setTimeout(() => watchNativeWidget(attempts + 1), 100);
}
return;
}
widget.shadowRoot.addEventListener('input', handleSellingPlanChange);
}
watchNativeWidget();
if (addToCartButton) {
addToCartButton.addEventListener('click', function () {
const realForm = document.querySelector(addToCartFormSelector);
const realSubmitButton = realForm?.querySelector('button[type="submit"]');
if (realSubmitButton) {
realSubmitButton.click();
} else if (realForm) {
realForm.requestSubmit();
} else {
console.error('sticky-footer-pdp: could not find product add-to-cart form');
}
});
}
syncPricingAndFrequency();
resetStickyFooterOffset();
}
document.addEventListener('DOMContentLoaded', function () {
initStickyFooterPdp(document);
});
document.addEventListener('shopify:section:load', function (event) {
initStickyFooterPdp(event.target);
});
</script>
</footer><footer id="shopify-section-sections--21336457314521__sticky_footer_FmXzPb" class="shopify-section shopify-section-group-footer-group footer-section"></footer><footer id="shopify-section-sections--21336457314521__sticky_footer_aqbyLm" class="shopify-section shopify-section-group-footer-group footer-section"></footer><footer id="shopify-section-sections--21336457314521__sticky_footer_Hq6WUj" class="shopify-section shopify-section-group-footer-group footer-section"></footer><footer id="shopify-section-sections--21336457314521__footer_Nr9kwG" class="shopify-section shopify-section-group-footer-group footer-section">
<section class="footer">
<div class="footer__content"><div class="footer__top">
<div class="footer__logo-section">
<a href="/" class="footer__logo">
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/desktop-bodi-logo-dark.svg?v=39598879658721709861776873391"
alt="Bodi logo"
width="123"
height="40"
loading="lazy"
>
</a>
<div
class="locale-switcher locale-switcher--footer "
data-current-locale-base-url="https://shop.bodi.com"
>
<button
class="locale-switcher__button"
type="button"
aria-expanded="false"
aria-haspopup="true"
data-locale-switcher-button
><img
src="//shop.bodi.com/cdn/shop/t/2/assets/us_flag.svg?v=146820449465311856841771353646"
alt="U.S. flag"
class="locale-switcher__flag"
width="20"
height="20"
>
<span class="locale-switcher__label-wrapper">
<span class="locale-switcher__label locale-switcher__label--normal">U.S. English</span>
<span class="locale-switcher__label locale-switcher__label--bold">U.S. English</span>
</span><span class="locale-switcher__chevron">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
aria-hidden="true"
>
<path
fill-rule="evenodd"
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
clip-rule="evenodd"
/>
</svg>
</span>
</button>
<div
class="locale-switcher__dropdown closed"
role="menu"
data-locale-switcher-dropdown
>
<div class="locale-switcher__dropdown-content"><a
href="https://shop-ca.bodi.com"
class="locale-switcher__option"
role="menuitem"
data-locale-code="en_CA"
data-locale-base-url="https://shop-ca.bodi.com"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/ca_flag.svg?v=140489053438850075871771353646"
alt="Canada flag"
class="locale-switcher__flag"
width="20"
height="20"
>
<span class="locale-switcher__label">CAN English</span>
</a><a
href="https://shop-ca.bodi.com/fr"
class="locale-switcher__option"
role="menuitem"
data-locale-code="fr_CA"
data-locale-base-url="https://shop-ca.bodi.com/fr"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/ca_flag.svg?v=140489053438850075871771353646"
alt="Canada flag"
class="locale-switcher__flag"
width="20"
height="20"
>
<span class="locale-switcher__label">CAN Français</span>
</a><a
href="https://shop-gb.bodi.com"
class="locale-switcher__option"
role="menuitem"
data-locale-code="en_GB"
data-locale-base-url="https://shop-gb.bodi.com"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/gb_flag.svg?v=184068840994614594711771353645"
alt="UK flag"
class="locale-switcher__flag"
width="20"
height="20"
>
<span class="locale-switcher__label">UK English</span>
</a></div>
</div>
</div>
</div>
<div class="footer__apps footer__apps--mobile">
<a
href="https://apps.apple.com/us/app/bodi-by-beachbody-home-fitness/id1031660123"
target="_blank"
rel="noopener noreferrer"
aria-label="Apple"
class="footer__app-badge"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/app-store-badge.svg?v=120792209405859649841771353645"
alt="Apple"
width="120"
height="40"
loading="lazy"
>
</a>
<a
href="https://play.google.com/store/apps/details?id=com.beachbody.bod"
target="_blank"
rel="noopener noreferrer"
aria-label="Google"
class="footer__app-badge"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/google-play-badge.svg?v=177291720263664549321771353646"
alt="Google"
width="135"
height="40"
loading="lazy"
>
</a>
</div>
<div class="footer__social">
<a
href="https://www.instagram.com/bodi"
target="_blank"
rel="noopener noreferrer"
aria-label="Instagram"
class="footer__social-link"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/instagram-icon.svg?v=55966984291952598211771353644"
alt="Instagram"
width="24"
height="24"
loading="lazy"
>
</a>
<a
href="https://facebook.com/bodi"
target="_blank"
rel="noopener noreferrer"
aria-label="Facebook"
class="footer__social-link"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/facebook-icon.svg?v=107550427014668218611771353644"
alt="Facebook"
width="24"
height="24"
loading="lazy"
>
</a>
<a
href="https://youtube.com/@bodi"
target="_blank"
rel="noopener noreferrer"
aria-label="YouTube"
class="footer__social-link"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/youtube-icon.svg?v=122383149797620814721771353646"
alt="YouTube"
width="24"
height="24"
loading="lazy"
>
</a>
</div>
<div class="footer__apps">
<a
href="https://apps.apple.com/us/app/bodi-by-beachbody-home-fitness/id1031660123"
target="_blank"
rel="noopener noreferrer"
aria-label="Apple"
class="footer__app-badge"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/app-store-badge.svg?v=120792209405859649841771353645"
alt="Apple"
width="120"
height="40"
loading="lazy"
>
</a>
<a
href="https://play.google.com/store/apps/details?id=com.beachbody.bod"
target="_blank"
rel="noopener noreferrer"
aria-label="Google"
class="footer__app-badge"
>
<img
src="//shop.bodi.com/cdn/shop/t/2/assets/google-play-badge.svg?v=177291720263664549321771353646"
alt="Google"
width="135"
height="40"
loading="lazy"
>
</a>
</div>
</div><div class="footer__middle"><div class="footer__columns footer__columns--desktop"><div class="footer__column" ><span class="footer__column-heading">Explore</span><ul class="footer__column-links"><li><a
target="_self"
rel=""
href="/"
class="footer__column-link"
>
Home
</a>
</li><li><a
target="_self"
rel=""
href="/collections/fitness-programs-plans"
class="footer__column-link"
>
BODi Programs
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/c/success-stories"
class="footer__column-link"
>
Results & Success Stories
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/blog/"
class="footer__column-link"
>
Blog
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.facebook.com/login/?next=https%3A%2F%2Fwww.facebook.com%2Fgroups%2Fbodmembers%2F"
class="footer__column-link"
>
Facebook Community
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/affiliate"
class="footer__column-link"
>
Become an Affiliate
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/experience?sl-view=community"
class="footer__column-link"
>
The BODi Experience
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/experience#raf"
class="footer__column-link"
>
Refer & Earn
</a>
</li></ul>
</div><div class="footer__column" ><span class="footer__column-heading">Account & Support</span><ul class="footer__column-links"><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/account/settings"
class="footer__column-link"
>
My Account
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/account/orders"
class="footer__column-link"
>
My Orders
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/account/subscriptions"
class="footer__column-link"
>
My Subscriptions
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://faq.bodi.com/?_gl=1*1bjqr0g*_gcl_au*MTUzMzU1ODIwNi4xNzY0OTU2NDQy*FPAU*MTUzMzU1ODIwNi4xNzY0OTU2NDQy"
class="footer__column-link"
>
BODi Support
</a>
</li></ul>
</div><div class="footer__column" ><span class="footer__column-heading">Company</span><ul class="footer__column-links"><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/careers"
class="footer__column-link"
>
Careers
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/about"
class="footer__column-link"
>
About Us
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/contact"
class="footer__column-link"
>
Contact Information
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://thebeachbodycompany.com/"
class="footer__column-link"
>
Investor
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="mailto:bodi@aiir.agency"
class="footer__column-link"
>
Press Inquiries
</a>
</li></ul>
</div><div class="footer__column" ><span class="footer__column-heading">Legal</span><ul class="footer__column-links"><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/terms-of-use"
class="footer__column-link"
>
Terms & Conditions
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/privacy"
class="footer__column-link"
>
Privacy Policy
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/consumer-health-data-policy"
class="footer__column-link"
>
Consumer Health Data Policy
</a>
</li><li><a
target="_self"
rel=""
href="javascript:window.Osano.cm.showDrawer()"
class="footer__column-link"
>
Cookie Preferences
</a>
</li><li><a
target="_self"
rel=""
href="javascript:window.Osano.cm.showDoNotSell()"
class="footer__column-link"
>
Do Not Sell My Info
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/accessibility-statement"
class="footer__column-link"
>
Accessibility Statement
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/supplier-code"
class="footer__column-link"
>
Supplier Code
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/supply-chain"
class="footer__column-link"
>
California Supply Chain
</a>
</li></ul>
</div></div><div class="footer__columns footer__columns--mobile"><accordion-custom>
<details class="footer__accordion-details">
<summary class="footer__accordion-summary">
Explore
<span class="footer__accordion-icon">
<svg
class="footer__accordion-icon-plus"
aria-hidden="true"
focusable="false"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M12 5.25V18.75M5.25 12H18.75"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
/>
</svg>
<svg
class="footer__accordion-icon-minus"
aria-hidden="true"
focusable="false"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M5.25 12H18.75"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
/>
</svg>
</span>
</summary>
<div class="footer__accordion-content">
<ul class="footer__column-links"><li><a
target="_self"
rel=""
href="/"
class="footer__column-link"
>
Home
</a>
</li><li><a
target="_self"
rel=""
href="/collections/fitness-programs-plans"
class="footer__column-link"
>
BODi Programs
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/c/success-stories"
class="footer__column-link"
>
Results & Success Stories
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/blog/"
class="footer__column-link"
>
Blog
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.facebook.com/login/?next=https%3A%2F%2Fwww.facebook.com%2Fgroups%2Fbodmembers%2F"
class="footer__column-link"
>
Facebook Community
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/affiliate"
class="footer__column-link"
>
Become an Affiliate
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/experience?sl-view=community"
class="footer__column-link"
>
The BODi Experience
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/experience#raf"
class="footer__column-link"
>
Refer & Earn
</a>
</li></ul>
</div>
</details>
</accordion-custom><accordion-custom>
<details class="footer__accordion-details">
<summary class="footer__accordion-summary">
Account & Support
<span class="footer__accordion-icon">
<svg
class="footer__accordion-icon-plus"
aria-hidden="true"
focusable="false"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M12 5.25V18.75M5.25 12H18.75"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
/>
</svg>
<svg
class="footer__accordion-icon-minus"
aria-hidden="true"
focusable="false"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M5.25 12H18.75"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
/>
</svg>
</span>
</summary>
<div class="footer__accordion-content">
<ul class="footer__column-links"><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/account/settings"
class="footer__column-link"
>
My Account
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/account/orders"
class="footer__column-link"
>
My Orders
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/account/subscriptions"
class="footer__column-link"
>
My Subscriptions
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://faq.bodi.com/?_gl=1*1bjqr0g*_gcl_au*MTUzMzU1ODIwNi4xNzY0OTU2NDQy*FPAU*MTUzMzU1ODIwNi4xNzY0OTU2NDQy"
class="footer__column-link"
>
BODi Support
</a>
</li></ul>
</div>
</details>
</accordion-custom><accordion-custom>
<details class="footer__accordion-details">
<summary class="footer__accordion-summary">
Company
<span class="footer__accordion-icon">
<svg
class="footer__accordion-icon-plus"
aria-hidden="true"
focusable="false"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M12 5.25V18.75M5.25 12H18.75"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
/>
</svg>
<svg
class="footer__accordion-icon-minus"
aria-hidden="true"
focusable="false"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M5.25 12H18.75"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
/>
</svg>
</span>
</summary>
<div class="footer__accordion-content">
<ul class="footer__column-links"><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/careers"
class="footer__column-link"
>
Careers
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/about"
class="footer__column-link"
>
About Us
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/contact"
class="footer__column-link"
>
Contact Information
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://thebeachbodycompany.com/"
class="footer__column-link"
>
Investor
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="mailto:bodi@aiir.agency"
class="footer__column-link"
>
Press Inquiries
</a>
</li></ul>
</div>
</details>
</accordion-custom><accordion-custom>
<details class="footer__accordion-details">
<summary class="footer__accordion-summary">
Legal
<span class="footer__accordion-icon">
<svg
class="footer__accordion-icon-plus"
aria-hidden="true"
focusable="false"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M12 5.25V18.75M5.25 12H18.75"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
/>
</svg>
<svg
class="footer__accordion-icon-minus"
aria-hidden="true"
focusable="false"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M5.25 12H18.75"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
/>
</svg>
</span>
</summary>
<div class="footer__accordion-content">
<ul class="footer__column-links"><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/terms-of-use"
class="footer__column-link"
>
Terms & Conditions
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/privacy"
class="footer__column-link"
>
Privacy Policy
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/consumer-health-data-policy"
class="footer__column-link"
>
Consumer Health Data Policy
</a>
</li><li><a
target="_self"
rel=""
href="javascript:window.Osano.cm.showDrawer()"
class="footer__column-link"
>
Cookie Preferences
</a>
</li><li><a
target="_self"
rel=""
href="javascript:window.Osano.cm.showDoNotSell()"
class="footer__column-link"
>
Do Not Sell My Info
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/accessibility-statement"
class="footer__column-link"
>
Accessibility Statement
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/supplier-code"
class="footer__column-link"
>
Supplier Code
</a>
</li><li><a
target="_blank"
rel="noopener noreferrer"
href="https://www.bodi.com/us/en/supply-chain"
class="footer__column-link"
>
California Supply Chain
</a>
</li></ul>
</div>
</details>
</accordion-custom></div><div class="footer__email">
<span class="footer__email-heading">Sign up & be the first to know about new offers!</span>
<div
class="footer__email-signup"
id="lightbox-inline-form-f72bbb69-cc8c-4cd3-9295-1ec538d9ac8d"
style="max-width: 316px;"
></div>
<p class="footer__email-disclaimer">By continuing, I agree to the Terms and Conditions and Privacy Policy.</p>
</div></div><div class="footer__bottom">
<div class="footer__bottom-text">
<p>The contents on our website are for informational purposes only, and are not intended to diagnose any medical condition, replace the advice of a healthcare professional, or provide any medical advice or treatment. Consult with your physician and follow all safety instructions before beginning any exercise program or nutrition plan, or using any supplement, especially if you are pregnant, breastfeeding, have any medical condition or are taking any medication. <br/><br/>*These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.<br/><br/>‡Subscription Details: Subscription automatically renews for the same applicable term and price, until you cancel. Cancel anytime to avoid future charges by visiting <a href="https://www.bodi.com/us/en/account/subscriptions" target="_blank">Memberships & Subscriptions.</a><br/><br/>†31-Day Money-Back Guarantee: Our products are backed by a 31-day Money Back Guarantee, less shipping & handling. Excludes subscriptions initiated by a free trial; additional terms and conditions apply. For more information, click <a href="https://faq.bodi.com/answer?Id=259" target="_blank">here</a>. <br/><br/>**Supplement Promotion. 25% off a one time supplement purchase or 35% off Subscribe and Save subscriptions, until you cancel. Applies to your initial subscription selection. Any changes to the subscription after the promotion period will reset your discount to the then current best offer. Offer valid between August 6 and 31, 2026, in the U.S. and Canada only. Excludes Beachbars, 4 Week Gut Protocol Complete Kit, Belle Vitale All-In-One Kit, and any kits or bundles that include supplements and nutrition programs. Subject to availability.</p><p><br/></p><p>‡‡ Annual BODi Subscription Promotion. Get $60 off your annual BODi digital subscription (initial term only) and receive a free 14-serving Shakeology (subscription terms apply) and one shaker cup, while supplies last. Valid in the U.S. and CA only between beginning August 3-31, 2026, for a limited time.</p><p><br/>^^Belle Vitale Supplement Duo BOGO. Buy one Belle Vitale Supplement Duo and receive a second Duo for free. BOGO only applies to One-time Purchase of a Duo supplement. Limit one free Duo per customer/account. While supplies last. Valid from 6/16 to 9/30/26 for purchases on BODi.com in the U.S. and CA only.</p><p><br/></p><p>††FINAL SALE: These items are final sale and cannot be returned, exchanged, credited or refunded. All final sale purchases are considered final once completed. Please review your products carefully before completing your purchase. </p><p><br/><strong>APPLIES TO ALL OFFERS AND PROMOTIONS:</strong> While supplies last. Offer valid only on in-stock items, no rain checks. Valid for purchases on BODi.com only. Customer may be responsible for tax and/or shipping on free products. Offer is not transferable and may not be combined with other offers, promotions, or discounts, unless otherwise indicated. Not valid on prior orders and cannot be redeemed for cash or cash equivalents. BODi may modify or end any promo without notice.<br/><br/>Apple TV is a registered trademarks of Apple Inc. iOS is a registered trademark of Cisco Technology, Inc. Roku is a registered trademark of Roku, Inc. Fire and all related logos are trademarks of Amazon Technologies, Inc. Android, Chromecast, and Google Play are trademarks of Google LLC.<br/><br/>Distributed in the US by Beachbody, LLC, 400 Continental Blvd, Floor 6, El Segundo, CA 90245<br/><br/>© 2026 BODi. All rights reserved. All third party trademarks are the property of their respective owners.</p>
</div>
</div>
</div>
</section>
<script type="module" src="//shop.bodi.com/cdn/shop/t/2/assets/accordion-custom.js?v=78770727478219950621772670204" defer></script>
</footer><footer id="shopify-section-sections--21336457314521__footer_7QzYxU" class="shopify-section shopify-section-group-footer-group footer-section"></footer><footer id="shopify-section-sections--21336457314521__footer_3HA7qF" class="shopify-section shopify-section-group-footer-group footer-section"></footer>
<!-- END sections: footer-group -->
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/dialog.js?v=138083190563882019441771353646"
type="module"
></script>
<dialog-component
id="search-modal"
class="search-modal"
>
<dialog
ref="dialog"
on:click="/closeDialogOnClickOutside"
on:keydown="/closeDialogOnEscapePress"
class="search-modal__content dialog-modal"
scroll-lock
>
<script
src="//shop.bodi.com/cdn/shop/t/2/assets/predictive-search.js?v=137734153844302985541771353646"
type="module"
fetchpriority="low"
></script>
<predictive-search-component
class="predictive-search"
style="--product-corner-radius: 0px; --card-corner-radius: 0px;"
data-section-id="predictive-search"
data-search-position=""
data-testid="search-component--modal"
data-active-color-scheme="scheme-1"
role="search"
aria-label="Search"
>
<form
action="/search"
method="get"
role="search"
class="predictive-search-form"
ref="form"
on:keydown="/onSearchKeyDown"
>
<div
class="predictive-search-form__header"
>
<div class="predictive-search-form__header-inner">
<label
for="cmdk-input"
class="visually-hidden"
>Search</label>
<input
class="search-input"
id="cmdk-input"
type="search"
name="q"
role="combobox"
aria-expanded="false"
aria-owns="predictive-search-results"
aria-controls="predictive-search-results"
aria-haspopup="listbox"
aria-autocomplete="list"
autocomplete="off"
placeholder="Search"
ref="searchInput"
on:input="/search"
on:keydown="/onSearchKeyDown"
on:focus="/expandSearch"
>
<input
name="options[prefix]"
type="hidden"
value="last"
>
<span class="svg-wrapper predictive-search__icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><circle cx="9" cy="9" r="4.75" stroke="currentColor" stroke-width="var(--icon-stroke-width)"/><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="m12.5 12.5 3.25 3.25"/></svg>
</span>
<button
type="button"
class="button-unstyled predictive-search__reset-button"
aria-label="Reset search"
ref="resetButton"
hidden
on:click="/resetSearch"
>
<span class="svg-wrapper predictive-search__reset-button-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="6.25" stroke="currentColor" stroke-width="var(--icon-stroke-width)"/><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="m12.5 7.5-5 5M12.5 12.5l-5-5"/></svg>
</span>
<span class="predictive-search__reset-button-text">Clear</span>
</button>
</div>
<button
type="button"
class="button predictive-search__close-modal-button"
aria-label="Close dialog"
on:click="dialog-component/closeDialog"
ref="closeModalButton"
>
<span class="svg-wrapper">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
</button>
</div>
<div class="predictive-search-form__content-wrapper">
<div
class="predictive-search-form__content"
tabindex="-1"
ref="predictiveSearchResults"
on:click="/handleModalClick"
>
<div
id="predictive-search-results"
class="predictive-search-dropdown"
role="listbox"
aria-expanded="true"
style="--color-shadow: rgb(var(--color-foreground-rgb) / );"
>
<div class="predictive-search-results__inner">
<div
id="predictive-search-products"
data-testid="products-list-default--modal"
>
<div class="predictive-search-results__title">
Products
</div>
<ul
class="predictive-search-results__list predictive-search-results__wrapper-products list-unstyled"
role="listbox"
aria-label="Products"
>
<li
class="predictive-search-results__card predictive-search-results__card--product"
ref="resultsItems[]"
>
<div
class="resource-card"
href="/products/you-can-drop-it-book"
data-resource-type="product"
>
<a
class="resource-card__link"
href="/products/you-can-drop-it-book"
>
<span class="visually-hidden">
"You Can Drop It!" 2B Mindset Book
</span>
</a>
<div
class="resource-card__media"
style="--resource-card-aspect-ratio: 4 / 5;"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-you-can-drop-it-ilana-mulstein-diet-book.png?v=1772479730&width=500" alt="You Can Drop It! By Ilana Muhlstein, M.S., R.D.N. diet book" srcset="//shop.bodi.com/cdn/shop/files/bodi-you-can-drop-it-ilana-mulstein-diet-book.png?v=1772479730&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-you-can-drop-it-ilana-mulstein-diet-book.png?v=1772479730&width=352 352w" width="500" height="500" loading="lazy" class="resource-card__image" sizes="auto" transitionToProduct="false" data-media-id="48251870511321">
</div>
<div class="resource-card__content">
<p class="resource-card__title paragraph">"You Can Drop It!" 2B Mindset Book</p>
<div ref="priceContainer">
<span class="price">$28.00</span>
</div>
</div>
</div>
</li>
<li
class="predictive-search-results__card predictive-search-results__card--product"
ref="resultsItems[]"
>
<div
class="resource-card"
href="/products/mbf-muscle-burns-fat"
data-resource-type="product"
>
<a
class="resource-card__link"
href="/products/mbf-muscle-burns-fat"
>
<span class="visually-hidden">
#mbf + #mbfa
</span>
</a>
<div
class="resource-card__media"
style="--resource-card-aspect-ratio: 4 / 5;"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-mbf-mbfa-digital-program-box-art-1x1.png?v=1772479396&width=500" alt="mbf and mbfa Muscle Burns Fat" srcset="//shop.bodi.com/cdn/shop/files/bodi-mbf-mbfa-digital-program-box-art-1x1.png?v=1772479396&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-mbf-mbfa-digital-program-box-art-1x1.png?v=1772479396&width=352 352w" width="500" height="500" loading="lazy" class="resource-card__image" sizes="auto" transitionToProduct="false" data-media-id="48251856126169">
<img src="//shop.bodi.com/cdn/shop/files/preview_images/cdc52f62f354487f809152dc40f9bc97.thumbnail.0000000000.jpg?v=1772479537&width=500" alt="Muscle Burns Fat Sizzle Video" srcset="//shop.bodi.com/cdn/shop/files/preview_images/cdc52f62f354487f809152dc40f9bc97.thumbnail.0000000000.jpg?v=1772479537&width=240 240w, //shop.bodi.com/cdn/shop/files/preview_images/cdc52f62f354487f809152dc40f9bc97.thumbnail.0000000000.jpg?v=1772479537&width=352 352w" width="500" height="281" loading="lazy" class="resource-card__image resource-card__image--secondary" sizes="auto" transitionToProduct="false" data-media-id="38840042881241">
</div>
<div class="resource-card__content">
<p class="resource-card__title paragraph">#mbf + #mbfa</p>
<div ref="priceContainer">
<span class="price">$0.00</span>
</div>
</div>
</div>
</li>
<li
class="predictive-search-results__card predictive-search-results__card--product"
ref="resultsItems[]"
>
<div
class="resource-card"
href="/products/21-day-fix"
data-resource-type="product"
>
<a
class="resource-card__link"
href="/products/21-day-fix"
>
<span class="visually-hidden">
21 Day Fix
</span>
</a>
<div
class="resource-card__media"
style="--resource-card-aspect-ratio: 4 / 5;"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-21-day-fix-digital-program-box-art-1x1.png?v=1772478696&width=500" alt="21 Day Fix" srcset="//shop.bodi.com/cdn/shop/files/bodi-21-day-fix-digital-program-box-art-1x1.png?v=1772478696&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-21-day-fix-digital-program-box-art-1x1.png?v=1772478696&width=352 352w" width="500" height="500" loading="lazy" class="resource-card__image" sizes="auto" transitionToProduct="false" data-media-id="48251830468825">
<img src="//shop.bodi.com/cdn/shop/files/preview_images/98365fe5587f4fb29cfb34b733da0998.thumbnail.0000000000.jpg?v=1772478790&width=500" alt="21 Day Fix Promotional Video" srcset="//shop.bodi.com/cdn/shop/files/preview_images/98365fe5587f4fb29cfb34b733da0998.thumbnail.0000000000.jpg?v=1772478790&width=240 240w, //shop.bodi.com/cdn/shop/files/preview_images/98365fe5587f4fb29cfb34b733da0998.thumbnail.0000000000.jpg?v=1772478790&width=352 352w" width="500" height="281" loading="lazy" class="resource-card__image resource-card__image--secondary" sizes="auto" transitionToProduct="false" data-media-id="38840019255513">
</div>
<div class="resource-card__content">
<p class="resource-card__title paragraph">21 Day Fix</p>
<div ref="priceContainer">
<span class="price">$0.00</span>
</div>
</div>
</div>
</li>
<li
class="predictive-search-results__card predictive-search-results__card--product"
ref="resultsItems[]"
>
<div
class="resource-card"
href="/products/25-minute-speed-train"
data-resource-type="product"
>
<a
class="resource-card__link"
href="/products/25-minute-speed-train"
>
<span class="visually-hidden">
25 Minute Speed Train
</span>
</a>
<div
class="resource-card__media"
style="--resource-card-aspect-ratio: 4 / 5;"
>
<img src="//shop.bodi.com/cdn/shop/files/bodi-25-min-speed-train-digital-program-box-art-1x1.png?v=1772478699&width=500" alt="25 Min Speed Train" srcset="//shop.bodi.com/cdn/shop/files/bodi-25-min-speed-train-digital-program-box-art-1x1.png?v=1772478699&width=240 240w, //shop.bodi.com/cdn/shop/files/bodi-25-min-speed-train-digital-program-box-art-1x1.png?v=1772478699&width=352 352w" width="500" height="500" loading="lazy" class="resource-card__image" sizes="auto" transitionToProduct="false" data-media-id="48251830665433">
<img src="//shop.bodi.com/cdn/shop/files/preview_images/f87ab11f624b4024bf74191c2d43d6ea.thumbnail.0000000000.jpg?v=1772478743&width=500" alt="25 Minute Speed Train Sizzle Video" srcset="//shop.bodi.com/cdn/shop/files/preview_images/f87ab11f624b4024bf74191c2d43d6ea.thumbnail.0000000000.jpg?v=1772478743&width=240 240w, //shop.bodi.com/cdn/shop/files/preview_images/f87ab11f624b4024bf74191c2d43d6ea.thumbnail.0000000000.jpg?v=1772478743&width=352 352w" width="500" height="281" loading="lazy" class="resource-card__image resource-card__image--secondary" sizes="auto" transitionToProduct="false" data-media-id="38840019452121">
</div>
<div class="resource-card__content">
<p class="resource-card__title paragraph">25 Minute Speed Train</p>
<div ref="priceContainer">
<span class="price">$0.00</span>
</div>
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="predictive-search-form__footer">
<button
class="button button-primary predictive-search__search-button"
ref="viewAllButton"
>
View all
</button>
</div>
</div>
</form>
</predictive-search-component>
</dialog>
</dialog-component>
<div
class="redirect-modal"
role="dialog"
aria-modal="true"
hidden
>
<div class="redirect-modal__backdrop"></div>
<div class="redirect-modal__panel">
<div class="redirect-modal__top">
<h2 class="redirect-modal__title">Change shipping country?</h2>
<button class="redirect-modal__close" type="button" aria-label="Close dialog">
<svg
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path d="M4.31373 17.8587C3.90357 18.2688 3.88404 19.0012 4.3235 19.4309C4.75318 19.8606 5.48561 19.8508 5.89576 19.4407L11.8723 13.4544L17.8587 19.4407C18.2786 19.8606 19.0012 19.8606 19.4309 19.4309C19.8508 18.9915 19.8606 18.2786 19.4309 17.8587L13.4544 11.8723L19.4309 5.89576C19.8606 5.47584 19.8606 4.75318 19.4309 4.3235C18.9915 3.90357 18.2786 3.89381 17.8587 4.31373L11.8723 10.3001L5.89576 4.31373C5.48561 3.90357 4.74342 3.88404 4.3235 4.3235C3.89381 4.75318 3.90357 5.48561 4.31373 5.89576L10.3001 11.8723L4.31373 17.8587Z" fill="#161819"/>
</svg>
</button>
</div>
<p class="redirect-modal__body">
It seems you're in a different region. Would you like to update your shipping country?
</p>
<div class="redirect-modal__select-wrapper">
<select class="redirect-modal__select" aria-label="Select store region">
<option value="" data-placeholder disabled hidden>
Select Your Country
</option><option value="https://shop.bodi.com" data-country="US">
U.S. English
</option><option value="https://shop-ca.bodi.com" data-country="CA">
CAN English
</option><option value="https://shop-ca.bodi.com/fr" data-country="CA" data-lang="fr">
CAN Français
</option><option value="https://shop-gb.bodi.com" data-country="GB">
UK English
</option></select>
<span class="redirect-modal__select-chevron" aria-hidden="true">
<svg width="9" height="5" viewBox="0 0 9 5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.32723 0L4.16361 5L0 0L8.32723 0Z" fill="#49454F"/>
</svg>
</span>
</div>
<div class="redirect-modal__actions">
<button
class="redirect-modal__confirm bodi-button bodi-button--primary bodi-button--large"
type="button"
>
<span class="bodi-button__content">Confirm</span>
<span class="bodi-button__spinner" aria-hidden="true">
<svg
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<circle cx="10" cy="10" r="8" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-dasharray="40 12" />
</svg>
</span>
</button>
<button
class="redirect-modal__dismiss bodi-button bodi-button--secondary bodi-button--large"
type="button"
>
<span class="bodi-button__content">No thanks</span>
</button>
</div>
</div>
</div>
<script
type="module"
>
(async function () {
const storeCountry = "US";
const baseUrl = "https:\/\/shop.bodi.com";
const geoURL = `${baseUrl}/browsing_context_suggestions.json`;
const modal = document.querySelector('.redirect-modal');
if (!modal) return;
const backdrop = modal.querySelector('.redirect-modal__backdrop');
const confirmBtn = modal.querySelector('.redirect-modal__confirm');
const dismissBtn = modal.querySelector('.redirect-modal__dismiss');
const closeBtn = modal.querySelector('.redirect-modal__close');
const select = modal.querySelector('.redirect-modal__select');
function getRedirectPath() {
let path = window.location.pathname;
if (path.startsWith('/fr')) {
const parts = path.split('/fr');
path = parts[1] || '/';
}
if (!path.startsWith('/')) path = '/' + path;
return path;
}
const COOKIE_NAME = 'bodi-redirect-modal-dismissed';
const COOKIE_TTL_SECONDS = 5 * 60 * 60 * 24 * 30 * 12; // 1 year
function setDismissedCookie() {
window.BODi.setCookie(COOKIE_NAME, '1', { maxAge: COOKIE_TTL_SECONDS });
}
function hasDismissedCookie() {
return window.BODi.getCookie(COOKIE_NAME) !== null;
}
function showModal() {
modal.removeAttribute('hidden');
modal.offsetHeight; // force reflow so transition plays from initial state
modal.classList.add('is-open');
document.body.style.overflow = 'hidden';
}
function closeModal() {
setDismissedCookie();
modal.classList.remove('is-open');
document.body.style.overflow = '';
modal.addEventListener('transitionend', function handler(e) {
if (e.target !== modal) return;
modal.setAttribute('hidden', '');
modal.removeEventListener('transitionend', handler);
});
}
function handleConfirm() {
const selectedUrl = select.value;
if (!selectedUrl || select.options[select.selectedIndex]?.dataset.placeholder !== undefined) return;
setDismissedCookie();
confirmBtn.classList.add('bodi-button--loading');
window.location.href = selectedUrl + getRedirectPath() + '?localeChanged=true';
}
confirmBtn.addEventListener('click', handleConfirm);
dismissBtn.addEventListener('click', closeModal);
closeBtn.addEventListener('click', closeModal);
backdrop.addEventListener('click', closeModal);
modal.addEventListener('keydown', (e) => {
if (e.key === 'Escape') closeModal();
});
try {
const res = await fetch(geoURL);
const data = await res.json();
const debugCountry = new URLSearchParams(window.location.search).get('debugRedirectModalCountry');
const detectedCountry = (debugCountry ?? data.detected_values?.country?.handle)?.toUpperCase();
if (!detectedCountry || detectedCountry === storeCountry.toUpperCase()) return;
if (hasDismissedCookie()) return;
const matchingOption = Array.from(select.options).find(
(opt) => opt.dataset.country === detectedCountry
);
if (matchingOption) {
matchingOption.selected = true;
} else {
const placeholder = select.querySelector('[data-placeholder]');
if (placeholder) placeholder.selected = true;
}
showModal();
} catch (e) {
console.error('Could not detect user country. Error:', e);
}
})();
</script>
<quick-add-dialog id="quick-add-dialog">
<dialog
class="quick-add-modal dialog-modal color-scheme-1"
ref="dialog"
scroll-lock
>
<button
ref="closeButton"
on:click="/closeDialog"
class="button button-unstyled close-button quick-add-modal__close"
aria-label="Close dialog"
><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<div
id="quick-add-modal-content"
class="quick-add-modal__content"
></div>
</dialog>
</quick-add-dialog>
<div
class="rebuy-widget--global"
data-rebuy-id="274649"
data-rebuy-shopify-product-ids="9413928616153">
</div>
<div
class="rebuy-widget--global"
data-rebuy-id="274810"
data-rebuy-shopify-product-ids="9413928616153">
</div>
<div
class="rebuy-widget--global"
data-rebuy-id="295987"
data-rebuy-shopify-product-ids="9413928616153">
</div>
<div
class="rebuy-widget--global"
data-rebuy-id="274653"
data-rebuy-shopify-product-ids="9413928616153">
</div>
<script type="application/json" data-page-view-product="auto">
{
"id": 9413928616153,
"title": "Ultimate Reset",
"vendor": "bodi-us-prod",
"tags": ["cleanses","Supplement","targetedsupplements","UltimateReset"],
"selected_variant": {"id":47683217391833,"title":"Default Title","option1":"Default Title","option2":null,"option3":null,"sku":"MDSUCLN2101","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Ultimate Reset","public_title":null,"options":["Default Title"],"price":14996,"weight":0,"compare_at_price":19995,"inventory_management":"shopify","barcode":"691303314347","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},
"product_key": "ultimate-reset-cleanse",
"product_type": "Nutrition",
"product_subtype": "Supplement"
}
</script><script type="module" data-page-view-tracker="auto">
import {
trackViewCategoryPage,
trackViewLandingPage,
trackViewOtherPage,
trackViewProductDetailPage,
trackBloomreachViewItem
} from '//shop.bodi.com/cdn/shop/t/2/assets/analytics.util.js?v=160412045767586707941786551772';
import { ThemeEvents } from '//shop.bodi.com/cdn/shop/t/2/assets/events.js?v=144203031841125949931771353646';
let currentProductId = null;
function setupPdpVariantViewItemTracking(productData) {
if (!productData) return;
currentProductId = String(productData.id || "");
if (productData.selected_variant) {
trackBloomreachViewItem({
product: productData,
variant: productData.selected_variant,
});
}
document.addEventListener(ThemeEvents.variantUpdate, (event) => {
const detail = event?.detail;
const variant = detail?.resource;
const eventProductId = detail?.data?.newProduct?.id || detail?.data?.productId || null;
if (!variant) return;
if (eventProductId && currentProductId && String(eventProductId) !== String(currentProductId)) {
return;
}
if (detail?.data?.newProduct?.id) {
currentProductId = String(detail.data.newProduct.id);
productData.id = detail.data.newProduct.id;
}
trackBloomreachViewItem({
product: productData,
variant,
});
});
}
/**
* Track page view based on event type
* Only runs if section-based tracker is not present (acts as fallback for auto snippet)
*/
async function trackPageView() {
const trackerId = "auto";
const namespace = `[PageViewAnalytics:${trackerId}]`;
// If this is auto snippet, check if section tracker exists (override behavior)
if (trackerId === 'auto' && document.querySelector('[data-page-view-section-tracker]')) {
console.info(`${namespace} - Section tracker detected, skipping auto-track`);
return;
}
const eventType = "view product detail page";
try {
switch (eventType) {
case 'view category page':
await trackViewCategoryPage();
break;
case 'view landing page':
await trackViewLandingPage();
break;
case 'view other page':
await trackViewOtherPage();
break;
case 'view product detail page': {
const productDataElement = document.querySelector(`[data-page-view-product="${trackerId}"]`);
if (productDataElement) {
try {
const productData = JSON.parse(productDataElement.textContent);
await trackViewProductDetailPage(productData);
setupPdpVariantViewItemTracking(productData);
} catch (error) {
console.error(`${namespace} - Failed to parse product data`, error);
}
} else {
console.warn(`${namespace} - Product data not found for PDP event`);
}
break;
}
default:
console.warn(`${namespace} - Unknown event type: ${eventType}`);
}
} catch (error) {
console.error(`${namespace} - Failed to track page view`, { error });
}
}
// Fire event when page loads
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', trackPageView);
} else {
trackPageView();
}
</script>
<script>
(() => {
// Guard against duplicate script injection across section reloads.
if (window.__conditionalQueryEvaluatorInitialized) return;
window.__conditionalQueryEvaluatorInitialized = true;
const evaluateElement = (element) => {
if (!(element instanceof HTMLElement)) return;
const rawValue = element.dataset.queryParamString || '';
const queryParamString = decodeURIComponent(rawValue);
const queryMatchType = element.dataset.queryMatchType || 'contains';
if (!queryParamString) return;
const params = new URLSearchParams(window.location.search);
const searchString = params.toString().toLowerCase();
const expectedParam = queryParamString.toLowerCase();
let shouldShow = false;
if (queryMatchType === 'contains') {
shouldShow = searchString.includes(expectedParam);
} else if (queryMatchType === 'does-not-contain') {
shouldShow = !searchString.includes(expectedParam);
} else if (queryMatchType === 'regex') {
try {
shouldShow = new RegExp(queryParamString, 'i').test(params.toString());
} catch {
shouldShow = false;
}
}
if (shouldShow) {
const sectionId = element.dataset.sectionId;
if (sectionId) {
// Section triggers reveal the whole section wrapper by id.
const targetSection = document.getElementById(`shopify-section-${sectionId}`);
if (targetSection) {
targetSection.style.display = 'block';
}
} else {
// Non-section targets can be revealed directly.
element.style.display = '';
}
}
};
// Run on initial load and Shopify section hot-reloads.
const run = () => {
const elements = document.querySelectorAll('[data-conditional-query="true"]');
for (const element of elements) {
evaluateElement(element);
}
};
document.addEventListener('DOMContentLoaded', run);
document.addEventListener('shopify:section:load', run);
run();
})();
</script>
<script>
window.Shopify.loadFeatures(
[
{
name: 'consent-tracking-api',
version: '0.1',
},
],
function (error) {
if (!error) {
try {
window.Osano.cm.ready('shopify');
} catch (error) {
console.error('Osano must be loaded before initializing the Shopify API.');
}
}
}
);
</script>
<style> .password-main-content {padding-top: 0px;} </style>
<div id="shopify-block-AQTlTWDBDUEVwNWNoZ__10641372206048101839" class="shopify-block shopify-app-block">
<script>
window.Rebuy = window.Rebuy || {};
window.Rebuy.customer = window.Rebuy.customer || {};
</script>
<script async src="https://cdn.rebuyengine.com/onsite/js/rebuy.js?shop=xragki-mv.myshopify.com"></script>
</div><div id="shopify-block-AbWVYSnVnNHNXVDQvd__8043271908280424605" class="shopify-block shopify-app-block">
<script type="text/javascript" id="sezerium-products">
console.log('%c Stamp - Variant Collections is active!', 'background-color: green; color: white; padding: 5px; border-radius: 3px;');
const totalPage= 0;
const SezeriumCollection = {
id: '0',
handle: 'product',
template: 'product',
sortBy: 'featured',
page: totalPage,
featured: false,
search: false,
renderLimit: 99,
activeFilters: [],
activeFiltersUrl: "?",
products: []
};</script><!-- BEGIN app snippet: product-data --><script type="application/json" sezerium-data>{"product":{"id":9413928616153,"title":"Ultimate Reset","handle":"ultimate-reset-cleanse","vendor":"bodi-us-prod","type":"Nutrition","sku":"","category":"Detox \u0026amp; Cleanse Programs","available":true,"tags":["cleanses","Supplement","targetedsupplements","UltimateReset"],"images":["files\/bodi-ultimate-reset-en-us.png","files\/bodi-ultimate-reset-pdp-key-benefits-en-us.jpg","files\/bodi-ultimate-reset-pdp-key-benefits-2-en-us.jpg","files\/bodi-ultimate-reset-pdp-key-benefits-3-en-us.jpg"],"metafield":"Healthy 21-Day Cleanse","metafield2":"","metafield3":"","metafield4":"","metafield5":"","featuredImage":"files\/bodi-ultimate-reset-en-us.png","featuredMedia":"files\/bodi-ultimate-reset-en-us.png","giftCard":false,"price":14996,"compareAtPrice":19995,"minPrice":14996,"maxPrice":14996,"unitPrice":0,"unitPriceRef":"","options":["Title"],"optionSwatches":[],"variable":false,"variantLevel":1,"variants":[{"id":47683217391833,"metafield":"","metafield2":"","metafield3":"","metafield4":"","metafield5":"","available":true,"matched":true,"title":"Default Title","option1":"Default Title","option2":"","option3":"","barcode":"691303314347","sku":"MDSUCLN2101","incoming":false,"taxable":true,"featuredImage":"","featuredMedia":"","image":"","price":14996,"compareAtPrice":19995,"unitPrice":0,"unitPriceRef":"","weight":"0","weightUnit":"lb","quantity":-1477}],"quantity":-1477}}</script><!-- END app snippet -->
<script type="text/javascript">
let SezeriumButtonTemplates = {
addToCartButton: false,
chooseButton: false,
};
const SezeriumAdvanced = true;
const SezeriumPausedPlan = false;
const SezeriumPreview = SezeriumPausedPlan && !!(window.Shopify && (window.Shopify.designMode || window.Shopify.previewMode));let SezeriumAppSettings = {moneyFormat: '${{amount}}',settings: {"user":{"hash":"2c758933af02c0b301906f2819ae1268"},"theme":{"id":"157605626073","lock":false,"name":"commerce-shopify-theme/main","disable":false,"password":"activebunny","theme_store_id":"157605626073"},"general":{"all":false,"scroll":{"auto":false,"text":"Show More..","toTop":false,"active":false},"search":false,"apiBase":"/apps/custom-collection","featured":true,"metafield":"custom.badge","imageRatio":null,"metafield2":null,"metafield3":null,"metafield4":null,"metafield5":null,"mixEnabled":false,"useVariantApi":false,"buttonSettings":{"active":false,"bgColor":"#FFFFFF","textColor":"#000000"},"hideOutOfStock":false,"productOptions":["1.option"],"hideUnavailable":false,"variantsPerPage":null,"hideWithoutImages":false,"useCustomTemplate":false,"useDefaultTemplate":false,"featuredCollections":[{"order":"0","collection":{"id":"gid://shopify/Collection/447976702169","title":"Supplements","handle":"supplements"}},{"order":"1","collection":{"id":"gid://shopify/Collection/447977029849","title":"Shakeology","handle":"shakeology"}},{"order":"2","collection":{"id":"gid://shopify/Collection/449019707609","title":"P90x Supplement System","handle":"p90x-supplements"}}],"featuredVariantLimit":"8"},"translation":{"badge":{"sale":"Sale","soldOut":"Sold Out"},"button":{"soldOut":"Sold Out","addToCart":"Add To Cart","scrollTop":"Scroll to top","chooseOptions":"Choose Options"}},"variantsList":{"format":"{product.title} - {variant.title}","collection":{"all":false,"list":[{"id":"gid://shopify/Collection/447977029849","title":"Shakeology","handle":"shakeology"},{"id":"gid://shopify/Collection/449019707609","title":"P90x Supplement System","handle":"p90x-supplement-system"},{"id":"gid://shopify/Collection/447976702169","title":"Supplements","handle":"supplements"},{"id":"gid://shopify/Collection/454624575705","title":"Shakes & Nutrition","handle":"nutrition-shakes-superfoods"}]},"priceFormat":"{MIN_PRICE} - {MAX_PRICE}"}},
hasThemeTemplate: true,
productTemplate: "",
swatches: [],
collectionSettings: { "cs_445415162073":{"format":"{product.title} - {variant.title}","mixVariant":false,"priceFormat":"{PRICE}","hideOutOfStock":false,"productOptions":[],"hideUnavailable":false,"hideWithoutImages":false},"cs_445415194841":{"format":"{product.title} - {variant.title}","mixVariant":false,"priceFormat":"{PRICE}","hideOutOfStock":false,"productOptions":[],"hideUnavailable":false,"hideWithoutImages":false},"cs_447976702169":{"format":"{product.title} <br> {variant.title}","sortBy":"manual","sortMap":{"47683208184025":{"handle":"3-day-refresh-cleanse"},"47683208216793":{"handle":"3-day-refresh-cleanse"},"47683208347865":{"handle":"beachbar"},"47683208380633":{"handle":"collagen-peptides"},"47683208446169":{"handle":"digestive-health-fiber"},"47683208642777":{"handle":"energize-pre-workout"},"47683208708313":{"handle":"energize-pre-workout"},"47683208773849":{"handle":"energize-pre-workout"},"47683208839385":{"handle":"energize-pre-workout"},"47683209527513":{"handle":"hormone-health-supplements"},"47683209691353":{"handle":"hydrate-electrolyte-powder"},"47683209756889":{"handle":"last-thing-sleep-aid"},"47683209822425":{"handle":"optimize-revitalize-probiotics-enzymes"},"47683210051801":{"handle":"power-greens-veggies"},"47683210379481":{"handle":"recover-post-workout-protein-powder"},"47683210412249":{"handle":"recover-post-workout-protein-powder"},"47683210477785":{"handle":"recover-post-workout-protein-powder"},"47683210641625":{"handle":"shakeology"},"47683210674393":{"handle":"shakeology"},"47683210871001":{"handle":"shakeology"},"47683216081113":{"handle":"shakeology-0g-added-sugar"},"47683216113881":{"handle":"shakeology-0g-added-sugar"},"47683216146649":{"handle":"shakeology-0g-added-sugar"},"47683216179417":{"handle":"shakeology-0g-added-sugar"},"47683216277721":{"handle":"shakeology-0g-added-sugar"},"47683216310489":{"handle":"shakeology-0g-added-sugar"},"47683216507097":{"handle":"shakeology-sampler"},"47683217391833":{"handle":"ultimate-reset-cleanse"},"48369731698905":{"handle":"p90x-hydration-electrolytes-drink-powder"},"48369731731673":{"handle":"p90x-hydration-electrolytes-drink-powder"},"48369731764441":{"handle":"p90x-hydration-electrolytes-drink-powder"},"48369731797209":{"handle":"p90x-energy-drink-powder"},"48369731829977":{"handle":"p90x-energy-drink-powder"},"48369731862745":{"handle":"p90x-energy-drink-powder"},"48369731895513":{"handle":"p90x-creatine-monohydrate-powder"},"48369731928281":{"handle":"p90x-creatine-monohydrate-powder"},"48369731961049":{"handle":"p90x-pre-workout-powder"},"48369731993817":{"handle":"p90x-pre-workout-powder"},"48369732026585":{"handle":"p90x-pre-workout-powder"},"48369732059353":{"handle":"p90x-whey-protein-powder"},"48369732092121":{"handle":"p90x-whey-protein-powder"},"48369732124889":{"handle":"p90x-whey-protein-powder"},"48854346301657":{"handle":"shakeology-tm"},"48854346367193":{"handle":"shakeology-tm"},"48854346399961":{"handle":"shakeology-tm"},"48854346465497":{"handle":"shakeology-tm"},"49025673363673":{"handle":"shakeology-0g-added-sugar-7-serve"},"49025673396441":{"handle":"shakeology-0g-added-sugar-7-serve"},"49025673429209":{"handle":"shakeology-0g-added-sugar-7-serve"},"49025673461977":{"handle":"shakeology-0g-added-sugar-7-serve"},"49046560571609":{"handle":"shakeology-0g-added-sugar"}},"sortList":["47683216081113","47683208642777","47683209527513","48369731895513","47683210379481","47683216113881","47683208380633","47683208708313","47683210805465","47683210871001","47683209691353","47683216146649","49046560571609","48369731698905","47683216244953","47683208839385","47683216310489","47683210543321","47683210477785","48369731961049","47683216507097","47683210412249","47683210576089","47683210674393","47683210051801","47683216179417","47683208184025","48369731764441","47683210641625","47683208773849","48369731928281","47683208446169","47683208216793","48369732124889","48369731797209","48369732026585","47683217391833","47683209822425","48369731993817","48369731829977","48369731862745","48369731731673","48369732059353","48369732092121","47683216277721","47683209756889","47683208347865","47683208315097","48854346399961","48854346367193","48854346301657","49025673363673","49025673396441","49025673429209","49025673461977","48854346465497"],"mixVariant":false,"filterMatch":"all","priceFormat":"{MIN_PRICE} - {MAX_PRICE}","hideOutOfStock":false,"productOptions":["flavor","key ingredient"],"hideUnavailable":false,"hideWithoutImages":false},"cs_447976931545":{"format":"{product.title} - {variant.title}","mixVariant":false,"priceFormat":"{PRICE}","hideOutOfStock":false,"productOptions":[],"hideUnavailable":false,"hideWithoutImages":false},"cs_447976964313":{"format":"{product.title} - {variant.title}","sortBy":"manual","sortList":["47683212214489","47683211952345","47683211886809","47683211428057","47683211919577","47683212181721","47683211821273","47683211329753","47683211493593","47683211755737","47683212312793","47683211002073","47683212247257","47683212083417","47683211722969","47683211165913","47683211133145","47683212050649","47683212378329"],"mixVariant":false,"priceFormat":"{PRICE}","hideOutOfStock":false,"productOptions":[],"hideUnavailable":false,"hideWithoutImages":false},"cs_447976997081":{"format":"{product.title} - {variant.title}","sortBy":"manual","sortList":["48773657395417","48040100495577","48040136147161","47683212935385","47683214868697","47683212869849","47683214967001","47683215098073","47683213230297","47683213689049","47683214508249","48040136114393","47683215032537","47683214606553","47683213426905","48040136048857","48040136081625","47683215065305","47683213557977","47683213590745","47683214213337","47683215786201","47683214246105","47683213164761","47683213131993","47683213197529","47683214311641","47683215655129","47683213000921","47683215753433","47683214737625","47683215884505","47683213656281","47683215458521","47683213328601","47683214377177"],"mixVariant":false,"priceFormat":"{PRICE}","hideOutOfStock":false,"productOptions":[],"hideUnavailable":false,"hideWithoutImages":false},"cs_447977029849":{"format":"{product.title}<br>{variant.option1}/{variant.option2}<br>{variant.option3}","sortBy":"manual","sortList":["47683215982809","47683216081113","47683216113881","47683210871001","47683210641625","47683216146649","49046560571609","47683216244953","47683216310489","47683216507097","47683210674393","47683216179417","47683208184025","47683216015577","47683216277721","49046566207705","47683216343257","47683210576089","47683210805465","47683216212185","47683208216793","47683216048345","47683210543321","47683217162457","47683217260761","48854346301657","48854346334425","48854346367193","48854346399961","48854346432729","48854346465497","48854346498265","48854348988633","49025673363673","49025673396441","49025673429209","49025673461977"],"mixVariant":false,"filterMatch":"all","priceFormat":"{MIN_PRICE} - {MAX_PRICE}","hideOutOfStock":false,"productOptions":["flavor","packaging","key ingredient"],"hideUnavailable":false,"hideWithoutImages":false},"cs_447977062617":{"format":"{product.title} - {variant.title}","mixVariant":false,"priceFormat":"{PRICE}","hideOutOfStock":false,"productOptions":[],"hideUnavailable":false,"hideWithoutImages":false},"cs_447977095385":{"format":"{product.title} - {variant.title}","mixVariant":false,"priceFormat":"{PRICE}","hideOutOfStock":false,"productOptions":[],"hideUnavailable":false,"hideWithoutImages":false},"cs_447977128153":{"format":"{product.title} - {variant.title}","mixVariant":false,"priceFormat":"{PRICE}","hideOutOfStock":false,"productOptions":[],"hideUnavailable":false,"hideWithoutImages":false},"cs_449019707609":{"format":"{product.title} <br>{variant.option1}","sortBy":"manual","sortList":["48369731895513","48369731961049","48369731928281","48369732124889","48369731698905","48369731797209","48369732026585","48369731829977","48369731993817","48369731764441","48369731862745","48369731731673","48369732059353","48369732092121"],"mixVariant":false,"filterMatch":"all","priceFormat":"{MIN_PRICE} - {MAX_PRICE}","hideOutOfStock":false,"productOptions":["1.option"],"hideUnavailable":false,"hideWithoutImages":false},"cs_454624575705":{"format":"{product.title}<br>{variant.title}","sortBy":"manual","sortList":["47683215982809","47683216015577","47683216212185","47683216081113","47683216277721","47683216343257","47683216113881","47683208347865","47683210051801","47683210543321","47683216244953","47683216572633","47683210576089","47683216179417","47683208315097","47683216507097","47683216310489"],"mixVariant":false,"filterMatch":"all","priceFormat":"{MIN_PRICE} - {MAX_PRICE}","hideOutOfStock":false,"productOptions":["flavor"],"hideUnavailable":false,"hideWithoutImages":false} },
"selectors": {
"collection": "",
"product": ".product-grid__item, .sf__product-listing .sf__col-item, ul > li.product-grid__item, .resource-list__item, ul.product-grid > li",
"title": "a[ref='productTitleLink'] p, .product-card__title, .sezerium-section__product-title",
"image": ".product-media img, .product-card__image img, .card-gallery img, .sezerium-section__image",
"imgTag": "img, .product__media, .product-block__image .rimage-background, .inner .rimage-background, .grid-view-item__image, .gitem-img, .pr_lazy_img, .cs_bg_lz, .grid_img, .collection__image__top, .double__image > [data-bgset], .product-item-hover",
"firstImage": "is-active|media-default|main-image|image-primary|product-card-featured-image|main-media|first-image|image-first-hover|product-primary-image",
"button": "::ignore,.quick-add",
"price": ".price, .product-card__price, product-price > div[ref='priceContainer'] > .price, .sezerium-section__price--sale, .sezerium-section__price--regular",
"salePrice": ".compare-at-price, .product-card__compare-price, .sezerium-section__price--compare",
"unitPrice": "",
"saveBadge": ".sezerium-section__badge--sale,.product-badges .product-badges__badge,.card__badge span.badge,.product-card__label--sale,.product-label--sale,.price-label--sale,.badge--on-sale,.grid-product__tag--sale,.grid-product__price--savings,.product__badge--sale,.product__badge__item--saving,.label--highlight,.price-item--sale__save-tag,.color-promo-tag,.price__badge--sale,.sale-item,.grid-product__on-sale,.sale-box,.product-label.sale,.marquee-tags .badge,.product-label--on-sale,.product-thumbnail__product-sticker--sale,.product--label,.product-badge__sale,.sale-badge,.productitem__badge--sale,.product-badge--sale,.displayed-discount,.sale_banner,.t4s-badge-sale,.product-item__badge--sale,.tag--sale,.bg-scheme-accent,.product-sale-amount-badge",
"swatchSeparate": "product-swatches .variant-option__swatch,.color-swatch,.swatches li,.swatch .item,.swatch-view li,.ProductItem__ColorSwatchItem,.card-product__swatch,.tt-options-swatch li,.option-color-list li,.product-options__value,.m-product-option--node,.gridSwatches > li",
"swatchGroupped": "product-swatches,.product-card__info fieldset,.card-information fieldset,.x-variants-data fieldset,swatch-div .card__swatches,.card__info .card__swatches",
"scroll": "nav.pagination,div.pagination-wrapper,.pagination-border-top,#collection-pagination,.gf_collection-paginator-wrapper,.pagination-page,.boost-pfs-filter-bottom-pagination,.toolbar-bottom,.pagination,.pagination-custom,.Pagination,.justify-content-center,.collection-pagination,.box__paginate,.paginate,.pagination--container,#pagination,.collection--pagination,div.pagination__list,nav.pagination__nav,ul.t4s-pagination__list,nav.hdt-pagination,div.main-collection--pagination,#Huratips-Pagination,.m-pagination,.ecom-pagination-navigation",
"badges": {selector: {"wrapSelector": ".product-badges__badge", "containerSelector": ".product-badges"},soldOut: {"content": {"html": "{{text}}", "text": "Sold Out"}, "classNames": ".product-badges__badge product-badges__badge--rectangle.color-scheme-3"},},
"imageSliderArr": [
{ifEl:'product-grid-item-image',copyEl:'product-grid-item-image',copyUpdate:e=>(e.classList.remove('is-active'),e.removeAttribute('data-grid-current-image'),e),originUpdate:e=>e},
{ifEl:'.product-item__image-wrapper--multiple',copyEl:'img',copyUpdate:e=>(e.setAttribute('hidden','hidden'),e),originUpdate:e=>(e.removeAttribute('data-media-id'),e)},
{ifEl:'.card__main-image',copyEl:'img',copyUpdate:e=>(e.setAttribute('hidden','hidden'),e),originUpdate:e=>(e.removeAttribute('data-media-id'),e)}
]
}
};
</script>
<script type="text/javascript">
try {
const anyAsset = document.querySelector('link[rel="stylesheet"][href*="/assets/"]')?.href;
const v = anyAsset ? new URL(anyAsset).searchParams.get('v') : '1';
const cssHref = anyAsset && new URL('overflow-list.css', anyAsset).href + `?v=${v}`;
if (SezeriumAppSettings.settings.translation.button.addToCart === 'Add To Cart') {
SezeriumAppSettings.settings.translation.button.addToCart = 'Add';
}
document.addEventListener('sezerium:variant:initialize', (e) => {
const { el, variant, product } = e.detail;
el.id = `product-card-${variant.id}`;
el.dataset.productId = variant.id;
const overflowList = el.querySelector('swatches-variant-picker-component overflow-list');
const comp = el.querySelector('slideshow-component');
el.addEventListener('mouseleave', () => {
el.querySelector('slideshow-component')?.select(0, undefined, { animate: false });
});
if (overflowList) {
const template = document.createElement('template');
template.setAttribute('shadowrootmode', 'open');
template.innerHTML = `
<link rel="stylesheet" type="text/css" href="${cssHref}" media="all">
<ul part="list">
<slot></slot>
<slot
name="more"
part="more"
hidden
>
<li
part="more"
>
<button
class="button"
type="button"
tabindex="0"
>
m
</button>
</li>
</slot>
<li
part="placeholder"
hidden
></li>
</ul>
<div part="overflow">
<ul part="overflow-list">
<slot name="overflow"></slot>
</ul>
</div>
`;
overflowList.prepend(template);
}
let mainVariantSlide;
let hoverSlide;
const variantPicker = el.querySelector('swatches-variant-picker-component');
if (!variantPicker && !overflowList && comp?.disabled === true) {
Array.from(el.querySelectorAll('slideshow-slide')).slice(2).forEach(slide => slide.remove());
Array.from(el.querySelectorAll('slideshow-slide')).forEach(slide => slide.removeAttribute('hidden'));
const comp = el.querySelector('slideshow-component');
if (comp) {
comp.style.setProperty('--slideshow-timeline', '--slide-1, --slide-2');
comp.setAttribute('data-generic-media-size', '2');
}
} else {
mainVariantSlide = Array.from(el.querySelectorAll('slideshow-slide[variant-image]')).find(slide => {
const img = slide.querySelector('img');
return img && img.src.includes(variant.image);
});
if (mainVariantSlide) {
const productCard = el.querySelector('product-card');
productCard.dataset.initialMediaId = mainVariantSlide.getAttribute('slide-id');
const hoverImageSrc = window.SezeriumImageHandler.getHoverImage(variant.image, product.images);
// Get the next sibling element
hoverSlide = mainVariantSlide.nextElementSibling;
let hoverSlideImg = hoverSlide?.querySelector('img');
// Check if next slide exists and has the hover image
const hasHoverSlide = hoverSlideImg && hoverSlideImg.src.includes(hoverImageSrc);
mainVariantSlide.removeAttribute('hidden');
mainVariantSlide.setAttribute('reveal', '')
if (!hasHoverSlide && hoverImageSrc) {
// Clone the main variant slide
hoverSlide = mainVariantSlide.cloneNode(true);
hoverSlideImg = hoverSlide.querySelector('img');
// Insert it after the main variant slide
if (mainVariantSlide.nextSibling) {
mainVariantSlide.parentNode.insertBefore(hoverSlide, mainVariantSlide.nextSibling);
} else {
mainVariantSlide.parentNode.appendChild(hoverSlide);
}
// Update the hover slide with new image source
window.SezeriumImageHandler.updateImageSource(hoverSlideImg, window.SezeriumImageHandler.getImagePath(hoverSlideImg), hoverImageSrc);
hoverSlide.removeAttribute('variant-image');
// Update slide-id with variant.id
hoverSlide.setAttribute('slide-id', variant.id);
hoverSlide.removeAttribute('hidden');
hoverSlide.setAttribute('reveal', '')
}
}
}
if ((variantPicker || overflowList || comp?.disabled === false) && mainVariantSlide) {
el.querySelector('.sezerium-image')?.classList.remove('sezerium-image');
el.querySelector('.sezerium-hover-image')?.classList.remove('sezerium-hover-image');
mainVariantSlide.querySelector('img').classList.add('sezerium-image');
hoverSlide?.querySelector('img').classList.add('sezerium-hover-image');
e.detail.product.tmpImages = product.images;
e.detail.variant.tmpImage = variant.image;
e.detail.product.images = [];
e.detail.variant.image = '';
}
if (mainVariantSlide && comp) {
const cont = mainVariantSlide.parentNode;
if (cont) {
if (hoverSlide && hoverSlide.parentNode === cont) cont.prepend(hoverSlide);
cont.prepend(mainVariantSlide);
const slides = Array.from(cont.querySelectorAll('slideshow-slide'));
comp.style.setProperty('--slideshow-timeline', slides.map((_, i) => `--slide-${i}`).join(', '));
slides.forEach((s, i) => s.style.setProperty('--slideshow-timeline', `--slide-${i}`));
comp.setAttribute('initial-slide', '0');
comp.setAttribute('data-generic-media-size', String(slides.length));
try { comp.connectedCallback(); } catch (err) {}
}
}
});
document.addEventListener('sezerium:image:update', (event) => {
const { el, variant } = event.detail;
el.querySelectorAll('slideshow-slide[hidden]').forEach(s => { s.removeAttribute('hidden'); s.setAttribute('reveal', ''); });
const sliderComp = el.querySelector('slideshow-component');
if (!sliderComp) return;
const img = el.querySelector('.sezerium-image');
if (!img) return;
const productLink = el.querySelector('product-card-link');
if (productLink) {
productLink.setAttribute('data-product-id', variant.id);
productLink.setAttribute('data-featured-media-url', img.src);
}
const slider = img.closest('slideshow-slide');
if (!slider) return;
const slides = Array.from(sliderComp.querySelectorAll('slideshow-slide'));
const idx = slides.indexOf(slider);
if (idx < 0) return;
slides.forEach(s => s.setAttribute('aria-hidden', s === slider ? 'false' : 'true'));
sliderComp.setAttribute('initial-slide', String(idx));
try { sliderComp.connectedCallback(); } catch (e) {}
requestAnimationFrame(() => {
try { sliderComp.select(idx, undefined, { animate: false }); } catch (e) {}
try { sliderComp.select(slider.getAttribute('slide-id'), undefined, { animate: false }); } catch (e) {}
});
});
document.addEventListener('sezerium:price:update', (event) => {
const { el, variant, isOnSale } = event.detail;
if (isOnSale && !el.querySelector(SezeriumAppSettings.selectors.salePrice)) {
const priceEl = el.querySelector(SezeriumAppSettings.selectors.price);
if (!priceEl) return;
const priceContainer = priceEl.parentElement;
const salePrice = window.SezeriumPriceHandler.formatPrice(variant.compareAtPrice);
priceContainer.innerHTML = `<span role="group">
${priceEl.outerHTML}
<span>
<span role="group">
<span class="compare-at-price sezerium-compare-at-price sezerium-skip-price">${salePrice}</span>
<span>`;
}
el.querySelector('.price-from')?.remove?.();
});
document.addEventListener('sezerium:swatch:update', (e) => {
const { el, color, variant } = e.detail;
const firstOption = color.replace(/&/g, '&') || variant.option1.replace(/&/g, '&');
const secondOption = variant.option2.replace(/&/g, '&');
const thirdOption = variant.option3.replace(/&/g, '&');
// if (window.SezeriumHelper.isMobile()) {
// el.classList.add('sezerium-swatch');
// return;
// }
setTimeout(() => {
el.querySelectorAll('swatches-variant-picker-component fieldset').forEach((fieldset) => {
fieldset.classList.add('sezerium-swatch');
let targetInput = fieldset.querySelector(`input[value="${firstOption}"]`);
if (!targetInput) {
targetInput = fieldset.querySelector(`input[value="${secondOption}"]`);
}
if (!targetInput) {
targetInput = fieldset.querySelector(`input[value="${thirdOption}"]`);
}
if (targetInput) {
const checkedInput = fieldset.querySelector('input:checked');
if (checkedInput) {
checkedInput.checked = false;
checkedInput.removeAttribute('checked');
}
if (variant.available) {
targetInput.dataset.optionAvailable = 'true';
targetInput.ariaDisabled = 'false';
} else {
targetInput.dataset.optionAvailable = 'false';
targetInput.ariaDisabled = 'true';
}
targetInput.classList.add('sezerium-checked');
targetInput.checked = true;
targetInput.setAttribute('checked', '');
targetInput.disabled = false;
targetInput.dispatchEvent(new Event('change', { bubbles: true }));
}
});
}, 50);
setTimeout(() => {
el.querySelectorAll('variant-picker fieldset').forEach((fieldset, index) => {
fieldset.classList.add('sezerium-swatch');
const selectedOption = index === 0 ? firstOption : secondOption;
let targetInput = fieldset.querySelector(`input[value="${selectedOption}"]`);
if (!targetInput) {
targetInput = fieldset.querySelector(`input[value="${thirdOption}"]`);
}
if (targetInput) {
const checkedInput = fieldset.querySelector('input:checked');
if (checkedInput) {
checkedInput.checked = false;
checkedInput.removeAttribute('checked');
checkedInput.dispatchEvent(new Event('input', { bubbles: true }));
checkedInput.dispatchEvent(new Event('change', { bubbles: true }));
}
if (variant.available) {
targetInput.dataset.optionAvailable = 'true';
targetInput.ariaDisabled = 'false';
} else {
targetInput.dataset.optionAvailable = 'false';
targetInput.ariaDisabled = 'true';
}
targetInput.classList.add('sezerium-checked');
targetInput.checked = true;
targetInput.setAttribute('checked', 'checked');
targetInput.disabled = false;
targetInput.dispatchEvent(new Event('input', { bubbles: true }));
targetInput.dispatchEvent(new Event('change', { bubbles: true }));
}
});
}, 50);
});
document.addEventListener('sezerium:js:unload', (e) => {
const { collectionEl } = e.detail;
if (!collectionEl) return;
const slideshowComponent = collectionEl.closest('slideshow-component');
if (slideshowComponent) {
const itemCount = collectionEl.querySelectorAll('.sezerium-product').length;
const newTimeline = Array.from({length: itemCount}, (_, i) => `--slide-${i + 1}`)
.join(', ');
slideshowComponent.style.setProperty('--slideshow-timeline', newTimeline);
collectionEl.querySelectorAll('slideshow-slide.sezerium-product').forEach((item, index) => {
const slide = `--slide-${index+1}`;
item.style.setProperty('--slideshow-timeline', slide);
item.setAttribute('aria-hidden', false);
});
slideshowComponent.connectedCallback();
setTimeout(()=> slideshowComponent.select(0, undefined, { animate: false }), 500)
}
});
document.addEventListener('sezerium:set:productCount', (e) => {
const { productCount } = e.detail;
const productCountDiv = document.querySelector('div.products-count-wrapper > span');
if (productCountDiv) {
productCountDiv.textContent = productCountDiv.textContent.replace(/[0-9]+/, productCount);
}
});
document.addEventListener('sezerium:widget:update', (event) => {
const { el, product, variant } = event.detail;
const isSoldOut = variant.available === false || variant.availableForSale === false;
const isProductCard = variant.keepOriginal === true
|| product.sezeriumKeepOriginal === true
|| variant.title === 'Default Title';
const singleVariant = variant.title === 'Default Title'
|| (variant.selectedOptions || []).some((o) => o.value === 'Default Title');
const wantChoose = isProductCard && !singleVariant;
const t = SezeriumAppSettings.settings.translation.button;
const qckComponent = el.querySelector('quick-add-component');
if (qckComponent) {
qckComponent.setAttribute('data-quick-add-button', wantChoose ? 'choose' : 'add');
}
const btnComponent = el.querySelector('add-to-cart-component');
if (btnComponent) {
const btn = btnComponent.querySelector('button');
if (btn) btn.disabled = isSoldOut;
const btnText = btnComponent.querySelector('.add-to-cart-text__content');
if (btnText) {
const label = isSoldOut ? t.soldOut : (wantChoose ? t.chooseOptions : t.addToCart);
btnText.innerHTML = '<span><span>' + label + '</span></span>';
}
}
});
document.addEventListener('sezerium:title:update', (event) => {
const { el, product, variant } = event.detail;
const badgeElement = el.querySelector('.product-badge p');
const productBadgeText = product?.metafield?.length > 0 ? product.metafield : '';
const variantBadgeText = variant?.metafield?.length > 0 ? variant.metafield : '';
let badgeText = '';
if (variantBadgeText !== '') {
badgeText = variantBadgeText;
} else {
badgeText = productBadgeText;
}
if (badgeElement) {
badgeElement.innerHTML = badgeText;
}
return;
});
document.addEventListener('sezerium:price:update', (event) => {
const { el, product, variant } = event.detail;
if (!product) return;
const EXCLUDED_HANDLES = ['beachbar'];
if (EXCLUDED_HANDLES.includes(product.handle)) return;
const isSupplementProduct = product.tags?.includes('Supplement');
if (!isSupplementProduct) return;
const SUBSCRIPTION_DISCOUNT = 0.25;
const formatMoney = (cents) => (cents / 100).toLocaleString('en-US', {
style: 'currency',
currency: 'USD'
});
const applyDiscount = (cents) => Math.round(cents * (1 - SUBSCRIPTION_DISCOUNT));
const discountedMax = applyDiscount(product.maxPrice);
// using default catalog pricing instead of calculated discounting above
const priceHTML = `
<span class="price sezerium-price price--compare-strikethrough" style="text-decoration: line-through; color: #208468;">${formatMoney(variant.compareAtPrice)}</span>
<span class="price sezerium-price price--sale">${formatMoney(variant.price)}</span>
`;
el.querySelectorAll('product-price [ref="priceContainer"]').forEach((container) => {
container.style = "max-width: fit-content;";
container.innerHTML = priceHTML;
});
});
} catch (e) {
console.log('%c Stamp - Variant Collections custom js error:', 'background-color: black; color: white; padding: 5px; border-radius: 3px;');
console.log(e);
}
</script>
<link href="//cdn.shopify.com/extensions/01a02a5e-4408-7c7a-9527-a6da7e3811a9/stamp-variants-collection-1136/assets/sezerium-section.min.css" rel="stylesheet" type="text/css" media="all" />
<link href="//cdn.shopify.com/extensions/01a02a5e-4408-7c7a-9527-a6da7e3811a9/stamp-variants-collection-1136/assets/sezerium-pagination.css" rel="stylesheet" type="text/css" media="all" />
<script src="https://cdn.shopify.com/extensions/01a02a5e-4408-7c7a-9527-a6da7e3811a9/stamp-variants-collection-1136/assets/sezerium-section-helpers.min.js" defer fetchpriority="high"></script>
<script src="https://cdn.shopify.com/extensions/01a02a5e-4408-7c7a-9527-a6da7e3811a9/stamp-variants-collection-1136/assets/sezerium-variant.min.js" defer fetchpriority="high"></script><script>
document.addEventListener('DOMContentLoaded', () => {
if (!window.sezeriumVariableInstance && SezeriumCollection.handle !== 'index') {
window.sezeriumVariableInstance = new window.sezeriumVariantProduct(SezeriumCollection.products, SezeriumCollection.handle);
}
});
</script>
<style>
.sezerium-button, .sezerium-add-to-cart, .sezerium-choose-option {
color:#000000!important;
background-color:#FFFFFF!important;
}
</style>
</div><script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
</body>
</html>
Sitemap
Кол-во: 0
XML-карта сайта для поисковиков
?
Sitemap.xml помогает поисковику быстрее находить и индексировать страницы. Особенно важен для крупных сайтов и новых страниц, на которые ещё нет входящих ссылок.
Robots.txt не содержит ссылку на карту сайта. Рекомендуется добавить карту сайта и указать ссылку на нее в robots.txt.
Внутренние ссылки
Кол-во: 27
Ссылки на другие страницы своего сайта
?
Внутренние ссылки распределяют ссылочный вес между страницами и помогают поисковику обходить сайт. Пустые анкоры и ссылки на запрещённые robots.txt страницы — типичные ошибки.
Внутренних ссылок на странице 27 оптимально.
Внутренние ссылки не запрещены к индексации в robots.txt.
На странице присутствуют изображения 3.
Показать внутренние ссылки
| Url | Анкор | Состояние | Анализировать |
|---|---|---|---|
| /collections/supplements |
<div class="top-banner__inner">
<div class="
group-block
group-block--height-fit
group-block--width-fill
border-style
spacing-style
size-style
" style="
--border-width: 1px; --border-style: none;
--border-color: rgb(var(--color-border-rgb) / 1.0);
--border-radius: 0px;
--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;
--size-style-width: 100%;--size-style-height: fit;--size-style-width-mobile: 100%; --size-style-width-mobile-min: 5rem;
" data-testid="group-block"><div class="group-block__media-wrapper">
</div>
<div class="
group-block-content
layout-panel-flex
layout-panel-flex--row
mobile-column
" style="--flex-direction: row; --flex-wrap: nowrap;
--gap: 12px;
--horizontal-alignment: center; --vertical-alignment: center;
--vertical-alignment-mobile: center;
">
<rte-formatter class=" spacing-style text-block text-block--Ad1VsekFGUWJkbjB0U__text_m3YJJQ paragraph
rte
" style="
--padding-block-start: 0px; --padding-block-end:0px;
--padding-inline-start:0px; --padding-inline-end:0px;
--color: var(--color-foreground);--font-weight: 500;
--width: fit-content;
--max-width: var(--max-width--body-none);
">
<p>Summer BODi Savings: 25% Off Supplements** <span style="text-decoration:underline"><strong>Shop Now</strong></span></p>
</rte-formatter>
<style>
</style>
</div>
</div>
<style>
</style>
</div>
|
|
Анализировать url |
| /collections |
Shop
|
|
Анализировать url |
| /products/bodi-subscription |
Fitness Plans
|
|
Анализировать url |
| /collections/supplements |
Shop All Supplements
|
|
Анализировать url |
| /pages/about-p90x-sport-performance-supplements |
The P90X Supplement System - <span class="violator">NEW!</span>
|
|
Анализировать url |
| /pages/about-shakeology |
Shakeology
|
|
Анализировать url |
| /collections/supplements/targetedsupplements |
Targeted Supplements
|
|
Анализировать url |
| /collections/supplements/performancesupplements |
Performance Supplements
|
|
Анализировать url |
| /collections/supplements/cleanses |
Cleanses
|
|
Анализировать url |
| /collections/nutrition-plans |
<span>Nutrition Plans</span>
|
|
Анализировать url |
| /collections/exercise-equipment |
<span>Equipment</span>
|
|
Анализировать url |
| /collections/sale |
<span><span class="navhighlight">Sales</span></span>
|
|
Анализировать url |
| /products/bodi-subscription |
<p class="bodi-nav-mobile__accordion-title">Fitness Plans</p>
|
|
Анализировать url |
| / |
<span class="bodi-nav-mobile__footer-link-text">Home</span>
|
|
Анализировать url |
| /collections |
<span class="bodi-nav-mobile__shop-subitem-text">Shop All</span>
|
|
Анализировать url |
| /collections/nutrition-plans |
<span class="bodi-nav-mobile__shop-subitem-text">Nutrition Plans</span>
|
|
Анализировать url |
| /collections/exercise-equipment |
<span class="bodi-nav-mobile__shop-subitem-text">Equipment</span>
|
|
Анализировать url |
| /collections/sale |
<span class="bodi-nav-mobile__shop-subitem-text"><span class="navhighlight">Sales</span></span>
|
|
Анализировать url |
| /products/ultimate-reset-cleanse?variant=47683217391833 |
Ultimate Reset
|
|
Анализировать url |
| / |
Home
|
|
Анализировать url |
| /collections/fitness-programs-plans |
BODi Programs
|
|
Анализировать url |
| / |
Home
|
|
Анализировать url |
| /collections/fitness-programs-plans |
BODi Programs
|
|
Анализировать url |
| /products/you-can-drop-it-book |
<span class="visually-hidden">
"You Can Drop It!" 2B Mindset Book
</span>
|
|
Анализировать url |
| /products/mbf-muscle-burns-fat |
<span class="visually-hidden">
#mbf + #mbfa
</span>
|
|
Анализировать url |
| /products/21-day-fix |
<span class="visually-hidden">
21 Day Fix
</span>
|
|
Анализировать url |
| /products/25-minute-speed-train |
<span class="visually-hidden">
25 Minute Speed Train
</span>
|
|
Анализировать url |
Внешние ссылки
Кол-во: 61
Ссылки на сторонние сайты
?
Исходящие внешние ссылки передают часть ссылочного веса на чужие сайты. Ссылки на авторитетные ресурсы безопасны; ссылки на мусорные сайты могут навредить репутации страницы.
Внешних ссылок на странице 61 слишком много. Спрячьте лишние ссылки в тег noindex или атрибут rel='nofollow'!
Показать внешние ссылки
| Url | Анкор | Анализировать |
|---|---|---|
| bodi.com |
Stream
|
Анализировать url |
| bodi.com |
The BODi Experience
|
Анализировать url |
| bodi.com |
Login
|
Анализировать url |
| bodi.com |
<p class="bodi-nav-mobile__accordion-title">Stream</p>
|
Анализировать url |
| bodi.com |
<p class="bodi-nav-mobile__accordion-title">The BODi Experience</p>
|
Анализировать url |
| bodi.com |
<span class="bodi-nav-mobile__footer-link-text">About Us</span>
|
Анализировать url |
| faq.bodi.com |
<span class="bodi-nav-mobile__footer-link-text">BODi Support</span>
|
Анализировать url |
| instagram.com |
<svg width="36" height="36" viewbox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M18 0C27.941 0 36 8.059 36 18C36 27.941 27.941 36 18 36C8.059 36 0 27.941 0 18C0 8.059 8.059 0 18 0ZM19.344 7.2H16.654C15.491 7.202 14.918 7.21 14.384 7.228L14.118 7.238L13.546 7.263C12.396 7.316 11.611 7.498 10.924 7.765C10.214 8.041 9.611 8.41 9.011 9.011C8.411 9.611 8.041 10.214 7.765 10.924C7.498 11.611 7.315 12.396 7.263 13.546L7.238 14.118L7.228 14.384C7.211 14.918 7.202 15.491 7.199 16.654V19.344C7.204 21.088 7.22 21.505 7.263 22.452C7.316 23.602 7.498 24.386 7.765 25.073C8.041 25.783 8.41 26.386 9.011 26.986C9.611 27.586 10.214 27.956 10.924 28.232C11.611 28.499 12.396 28.682 13.546 28.734C13.779 28.744 13.981 28.754 14.178 28.761L14.414 28.77C15.009 28.79 15.666 28.797 17.14 28.799H19.141C20.328 28.796 20.938 28.789 21.463 28.774L21.701 28.766C21.937 28.757 22.171 28.747 22.451 28.734C23.601 28.682 24.386 28.499 25.073 28.232C25.783 27.956 26.386 27.587 26.986 26.986C27.586 26.386 27.956 25.784 28.232 25.073C28.499 24.386 28.682 23.601 28.734 22.452C28.747 22.172 28.757 21.937 28.766 21.702L28.774 21.463C28.79 20.897 28.797 20.233 28.799 18.857V16.856C28.796 15.578 28.789 14.969 28.769 14.414L28.761 14.178C28.754 13.981 28.745 13.779 28.734 13.546C28.682 12.396 28.499 11.611 28.232 10.924C27.956 10.214 27.587 9.611 26.986 9.011C26.386 8.411 25.784 8.041 25.073 7.765C24.386 7.498 23.601 7.315 22.452 7.263C21.505 7.22 21.088 7.204 19.344 7.2ZM19.118 9.145C20.448 9.147 21.034 9.155 21.606 9.175L21.81 9.183L22.363 9.207C23.416 9.255 23.988 9.431 24.369 9.579C24.873 9.775 25.232 10.009 25.61 10.387C25.988 10.765 26.222 11.125 26.418 11.629C26.566 12.009 26.742 12.581 26.79 13.634C26.8 13.838 26.807 14.016 26.814 14.187L26.822 14.391C26.843 15.001 26.851 15.627 26.852 17.155V19.118C26.85 20.448 26.842 21.034 26.822 21.606L26.814 21.81L26.79 22.363C26.742 23.416 26.566 23.988 26.418 24.369C26.222 24.873 25.988 25.232 25.61 25.61C25.232 25.988 24.873 26.222 24.369 26.418C23.988 26.566 23.416 26.742 22.363 26.79C22.16 26.8 21.982 26.807 21.81 26.814L21.606 26.822C20.996 26.843 20.371 26.851 18.842 26.852H16.88C15.55 26.85 14.964 26.842 14.392 26.822L14.188 26.814L13.635 26.79C12.582 26.742 12.01 26.566 11.63 26.418C11.126 26.222 10.766 25.988 10.388 25.61C10.01 25.232 9.776 24.873 9.58 24.369C9.432 23.988 9.256 23.416 9.208 22.363C9.198 22.16 9.191 21.982 9.184 21.81L9.176 21.606C9.155 20.996 9.147 20.371 9.146 18.842V16.88C9.148 15.55 9.156 14.964 9.176 14.392L9.184 14.188L9.208 13.635C9.256 12.582 9.432 12.01 9.58 11.63C9.776 11.126 10.01 10.766 10.388 10.388C10.766 10.01 11.126 9.776 11.63 9.58C12.01 9.432 12.582 9.256 13.635 9.208C13.839 9.198 14.017 9.191 14.188 9.184L14.392 9.176C15.002 9.155 15.628 9.147 17.156 9.146L19.118 9.145ZM17.998 12.452C14.936 12.452 12.452 14.936 12.452 17.999C12.452 21.062 14.936 23.545 17.999 23.545C21.062 23.545 23.545 21.062 23.545 17.999C23.545 14.936 21.062 12.452 17.999 12.452H17.998ZM17.998 14.398C19.987 14.398 21.598 16.01 21.598 17.998C21.598 19.987 19.987 21.598 17.998 21.598C16.01 21.598 14.398 19.987 14.398 17.998C14.398 16.01 16.01 14.398 17.998 14.398ZM23.764 10.938C23.048 10.938 22.468 11.518 22.468 12.233C22.468 12.949 23.048 13.529 23.764 13.529C24.48 13.529 25.06 12.949 25.06 12.233C25.06 11.518 24.48 10.938 23.764 10.938Z" fill="#161819"></path>
</svg>
|
|
| facebook.com |
<svg width="36" height="36" viewbox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M36 18.1097C36 8.10709 27.941 0 18 0C8.059 0 0 8.10709 0 18.1097C0 27.1484 6.582 34.6398 15.188 35.998V23.3444H10.618V18.1097H15.188V14.1205C15.188 9.58102 17.875 7.07484 21.986 7.07484C23.956 7.07484 26.016 7.42798 26.016 7.42798V11.885H23.746C21.51 11.885 20.813 13.2804 20.813 14.7121V18.1097H25.805L25.007 23.3444H20.812V36C29.419 34.6398 36 27.1484 36 18.1087" fill="#161819"></path>
</svg>
|
|
| youtube.com |
<svg width="36" height="36" viewbox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M18 0C27.941 0 36 8.059 36 18C36 27.941 27.941 36 18 36C8.059 36 0 27.941 0 18C0 8.059 8.059 0 18 0ZM18.35 9.922H17.65C17.015 9.926 15.6 9.938 14.079 9.985L13.539 10.003C11.729 10.069 9.882 10.188 9.092 10.401C8.111 10.665 7.338 11.442 7.076 12.43C6.672 13.948 6.61 16.867 6.601 17.716V18.191C6.611 19.041 6.671 21.959 7.076 23.477C7.338 24.465 8.111 25.242 9.092 25.507C10.632 25.922 16.194 25.977 17.649 25.985H18.35C19.023 25.981 20.569 25.968 22.19 25.913L22.733 25.893C24.453 25.826 26.158 25.709 26.908 25.506C27.889 25.242 28.662 24.465 28.924 23.477C29.357 21.85 29.397 18.617 29.4 18.042V17.865C29.397 17.291 29.357 14.057 28.924 12.43C28.662 11.442 27.889 10.665 26.908 10.4C25.368 9.985 19.805 9.93 18.35 9.922ZM15.668 14.563L21.628 17.953L15.668 21.343V14.563Z" fill="#161819"></path>
</svg>
|
Анализировать url |
| bodi.com |
Login
|
Анализировать url |
| bodi.com |
Join BODi
|
Анализировать url |
| account.shop.bodi.com |
My Account
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none">
<g clip-path="url(#clip0_4249_2907)">
<rect opacity="0.01" width="24" height="24" fill="#444646"></rect>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.44214 5.55806C9.19806 5.31398 8.80233 5.31398 8.55825 5.55806C8.32479 5.79152 8.31464 6.16374 8.5278 6.40927L8.55825 6.44194L14.0664 11.95L8.55825 17.4581C8.32479 17.6915 8.31464 18.0637 8.5278 18.3093L8.55825 18.3419C8.79172 18.5754 9.16394 18.5856 9.40947 18.3724L9.44214 18.3419L15.3921 12.3919C15.6256 12.1585 15.6358 11.7863 15.4226 11.5407L15.3921 11.5081L9.44214 5.55806Z" fill="#706F73"></path>
</g>
<defs>
<clippath id="clip0_4249_2907">
<rect width="24" height="24" fill="white"></rect>
</clippath>
</defs>
</svg>
|
Анализировать url |
| account.shop.bodi.com |
My Orders
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none">
<g clip-path="url(#clip0_4249_2907)">
<rect opacity="0.01" width="24" height="24" fill="#444646"></rect>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.44214 5.55806C9.19806 5.31398 8.80233 5.31398 8.55825 5.55806C8.32479 5.79152 8.31464 6.16374 8.5278 6.40927L8.55825 6.44194L14.0664 11.95L8.55825 17.4581C8.32479 17.6915 8.31464 18.0637 8.5278 18.3093L8.55825 18.3419C8.79172 18.5754 9.16394 18.5856 9.40947 18.3724L9.44214 18.3419L15.3921 12.3919C15.6256 12.1585 15.6358 11.7863 15.4226 11.5407L15.3921 11.5081L9.44214 5.55806Z" fill="#706F73"></path>
</g>
<defs>
<clippath id="clip0_4249_2907">
<rect width="24" height="24" fill="white"></rect>
</clippath>
</defs>
</svg>
|
Анализировать url |
| shop.bodi.com |
My Subscriptions
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none">
<g clip-path="url(#clip0_4249_2907)">
<rect opacity="0.01" width="24" height="24" fill="#444646"></rect>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.44214 5.55806C9.19806 5.31398 8.80233 5.31398 8.55825 5.55806C8.32479 5.79152 8.31464 6.16374 8.5278 6.40927L8.55825 6.44194L14.0664 11.95L8.55825 17.4581C8.32479 17.6915 8.31464 18.0637 8.5278 18.3093L8.55825 18.3419C8.79172 18.5754 9.16394 18.5856 9.40947 18.3724L9.44214 18.3419L15.3921 12.3919C15.6256 12.1585 15.6358 11.7863 15.4226 11.5407L15.3921 11.5081L9.44214 5.55806Z" fill="#706F73"></path>
</g>
<defs>
<clippath id="clip0_4249_2907">
<rect width="24" height="24" fill="white"></rect>
</clippath>
</defs>
</svg>
|
Анализировать url |
| faq.bodi.com |
BODi Support
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none">
<g clip-path="url(#clip0_4249_2907)">
<rect opacity="0.01" width="24" height="24" fill="#444646"></rect>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.44214 5.55806C9.19806 5.31398 8.80233 5.31398 8.55825 5.55806C8.32479 5.79152 8.31464 6.16374 8.5278 6.40927L8.55825 6.44194L14.0664 11.95L8.55825 17.4581C8.32479 17.6915 8.31464 18.0637 8.5278 18.3093L8.55825 18.3419C8.79172 18.5754 9.16394 18.5856 9.40947 18.3724L9.44214 18.3419L15.3921 12.3919C15.6256 12.1585 15.6358 11.7863 15.4226 11.5407L15.3921 11.5081L9.44214 5.55806Z" fill="#706F73"></path>
</g>
<defs>
<clippath id="clip0_4249_2907">
<rect width="24" height="24" fill="white"></rect>
</clippath>
</defs>
</svg>
|
Анализировать url |
| bodi.com |
Sign out
|
Анализировать url |
| account.shop.bodi.com |
Memberships & Subscriptions
|
Анализировать url |
| faq.bodi.com |
<strong>apply</strong>
|
Анализировать url |
| bodi.com |
Results & Success Stories
|
Анализировать url |
| bodi.com |
Blog
|
Анализировать url |
| facebook.com |
Facebook Community
|
|
| bodi.com |
Become an Affiliate
|
Анализировать url |
| bodi.com |
The BODi Experience
|
Анализировать url |
| bodi.com |
Refer & Earn
|
Анализировать url |
| bodi.com |
My Account
|
Анализировать url |
| bodi.com |
My Orders
|
Анализировать url |
| bodi.com |
My Subscriptions
|
Анализировать url |
| faq.bodi.com |
BODi Support
|
Анализировать url |
| bodi.com |
Careers
|
Анализировать url |
| bodi.com |
About Us
|
Анализировать url |
| bodi.com |
Contact Information
|
Анализировать url |
| thebeachbodycompany.com |
Investor
|
Анализировать url |
| bodi.com |
Terms & Conditions
|
Анализировать url |
| bodi.com |
Privacy Policy
|
Анализировать url |
| bodi.com |
Consumer Health Data Policy
|
Анализировать url |
| bodi.com |
Accessibility Statement
|
Анализировать url |
| bodi.com |
Supplier Code
|
Анализировать url |
| bodi.com |
California Supply Chain
|
Анализировать url |
| bodi.com |
Results & Success Stories
|
Анализировать url |
| bodi.com |
Blog
|
Анализировать url |
| facebook.com |
Facebook Community
|
|
| bodi.com |
Become an Affiliate
|
Анализировать url |
| bodi.com |
The BODi Experience
|
Анализировать url |
| bodi.com |
Refer & Earn
|
Анализировать url |
| bodi.com |
My Account
|
Анализировать url |
| bodi.com |
My Orders
|
Анализировать url |
| bodi.com |
My Subscriptions
|
Анализировать url |
| faq.bodi.com |
BODi Support
|
Анализировать url |
| bodi.com |
Careers
|
Анализировать url |
| bodi.com |
About Us
|
Анализировать url |
| bodi.com |
Contact Information
|
Анализировать url |
| thebeachbodycompany.com |
Investor
|
Анализировать url |
| bodi.com |
Terms & Conditions
|
Анализировать url |
| bodi.com |
Privacy Policy
|
Анализировать url |
| bodi.com |
Consumer Health Data Policy
|
Анализировать url |
| bodi.com |
Accessibility Statement
|
Анализировать url |
| bodi.com |
Supplier Code
|
Анализировать url |
| bodi.com |
California Supply Chain
|
Анализировать url |
| bodi.com |
Memberships & Subscriptions.
|
Анализировать url |
| faq.bodi.com |
here
|
Анализировать url |
Конкуренты Готовность: 0%
Конкуренты в Яндексе
Кол-во: 0
Топ сайтов-конкурентов в Яндексе
?
Сайты, чаще всего появляющиеся в ТОПе Яндекса по запросам из семантического ядра этой страницы.
Мы не нашли у вас конкурентов в Яндексе. Сайт или очень молодой или плохо продвигается.
Конкурентов в ТОП-10 Яндекса не нашлось.
Конкуренты в Google
Кол-во: 0
Топ сайтов-конкурентов в Google
?
Сайты, чаще всего появляющиеся в ТОПе Google по запросам из семантического ядра этой страницы.
Конкуренты в Google тоже не найдены. Займитесь продвижением сайта!
Конкурентов в ТОП-10 Google не нашлось.
ЗоЗПП: права потребителей Готовность: 100%
Нарушения
Не выявлены
Признаков дистанционной продажи товаров (интернет-магазина) не обнаружено — требования ЗоЗПП о раскрытии информации продавца к сайту не применяются. Нарушений нет.
ФЗ-149: рекомендательные технологии Готовность: 100%
Нарушения
Не выявлены
Рекомендательные блоки («с этим покупают», «похожие товары» и т.п.) на сайте не обнаружены — требования ст. 10.7 ФЗ-149 к сайту не применяются. Нарушений нет.
ФЗ-38: реклама Готовность: 100%
Нарушения
Не выявлены
Рекламных тематик с обязательными оговорками (медицина, БАД, кредиты и займы, новостройки) на сайте не обнаружено. Нарушений нет.
ФЗ-436: защита детей Готовность: 100%
Нарушения
Не выявлены
Признаков информационной продукции (новости, видео, книги, игры, курсы) не обнаружено — обязательная возрастная маркировка по ФЗ-436 сайту не требуется. Нарушений нет.
Вердикт
Выполнен подробный анализ сайта ultimatereset.com: готовность на 36%. Чтобы выполнить все условия и попасть на первую страницу выдачи поисковых систем требуется:
Постарайтесь исправить общие ошибки.
Исправьте ошибки в мета-тегах.
Исправьте ошибки индексации.
Поделитесь с друзьями: