
Momentous
Vegan Omega-3 30 Servings

Vegan Omega-3 30 Servings
Momentous
Flavour
Momentous
Flavour
Momentous
Price History
Description
Momentous Vegan Omega-3 supplement contains a market-leading 500mg each of EPA + DHA for a total 1,000mg delivery of Omega oil per serving.
Ingredients
Thanks so much for sharing your experience, Shaun - we really appreciate the feedback. \n
That “seaweed” or fishy burp can occasionally happen with omega-3s, even though the product is sourced from algae. Taking them with a meal, splitting the dose, or keeping them in the fridge can often help reduce this experience. \n
Our Vegan Omega-3 is third-party tested and uses refined algal oil to minimize taste, but we understand sensitivity can vary here. \n
If you have any questions on this, please feel free to contact our Customer Care team. We're happy to help! ","dateCreated":"2026-03-26T19:44:58.401Z","avatarUrl":"https://dov7r31oq5dkj.cloudfront.net/72adcf9f-ede7-4232-8bc6-db71fceaf77c/476d5c60-d9b8-456f-921f-2ef845125912","title":"Momentous"},"reviewer":{"displayName":"Shaun D.","isVerified":true},"isIncentivized":false,"status":"approved","title":"the only issue is seaweed burps","unhelpfulCount":0,"variantId":"44985721159863"},{"subscriberId":"72adcf9f-ede7-4232-8bc6-db71fceaf77c","reviewId":"cc457233-a084-4379-a0cd-4de1f8eb4b6a","subscriberId_productId":"72adcf9f-ede7-4232-8bc6-db71fceaf77c:shopify-8144660857015","productId":"shopify-8144660857015","body":"Not many vegan high quality omega 3 available, this is a great option. ","dateCreated":"2026-03-19T00:19:21.851Z","dateUpdated":"2026-03-19T00:19:21.851Z","helpfulCount":0,"isRecommended":true,"languageCode":"en","productHandle":"vegan-omega-3","productImageUrl":"https://cdn.shopify.com/s/files/1/1400/2351/files/Vegan-Omega-3_2000x2000_05112025_FINAL_x280.png?v=1752865918","productName":"Vegan Omega-3","productUrl":"//www.livemomentous.com/products/vegan-omega-3","rating":5,"reviewer":{"displayName":"Andrea S.","isVerified":true},"isIncentivized":false,"status":"approved","title":"Great option for vegans ","unhelpfulCount":0,"variantId":"44985721159863"}],"reviewsKeywords":{"keywordTopics":[{"keywords":[{"name":"vegan","occurrences":16},{"name":"Vegan","occurrences":1},{"name":"plant based","occurrences":1},{"name":"plant-based","occurrences":1},{"name":"vegan caps","occurrences":1},{"name":"alternative","occurrences":1}],"topic":"Vegan"},{"keywords":[{"name":"quality","occurrences":8},{"name":"Quality","occurrences":1},{"name":"clean source","occurrences":1},{"name":"cleanest","occurrences":1},{"name":"sourcing","occurrences":1},{"name":"well tested","occurrences":1},{"name":"testing","occurrences":1},{"name":"trust","occurrences":1}],"topic":"Quality"},{"keywords":[{"name":"taste","occurrences":6},{"name":"aftertaste","occurrences":5}],"topic":"Taste"},{"keywords":[{"name":"burps","occurrences":3},{"name":"burpless","occurrences":2},{"name":"fish burps","occurrences":1},{"name":"fishy burp","occurrences":1},{"name":"fishy burps","occurrences":1},{"name":"nausea","occurrences":1},{"name":"stomach","occurrences":1},{"name":"stomach upset","occurrences":1},{"name":"digestion","occurrences":1}],"topic":"Digestibility"},{"keywords":[{"name":"smell","occurrences":5},{"name":"fishy smell","occurrences":1}],"topic":"Smell"},{"keywords":[{"name":"dosage","occurrences":2},{"name":"convenience","occurrences":1},{"name":"ease of use","occurrences":1},{"name":"easy","occurrences":1},{"name":"pill size","occurrences":1},{"name":"refrigeration","occurrences":1},{"name":"travel","occurrences":1}],"topic":"Convenience"},{"keywords":[{"name":"Omega","occurrences":1},{"name":"Omega-3","occurrences":1},{"name":"omega 3","occurrences":1},{"name":"omega-3s","occurrences":1},{"name":"omegas","occurrences":1},{"name":"brain benefits","occurrences":1},{"name":"clarity","occurrences":1},{"name":"effectiveness","occurrences":1}],"topic":"Effectiveness"}],"languageCode":"en"},"reviewsNextUrl":"https://api.okendo.io/v1/stores/72adcf9f-ede7-4232-8bc6-db71fceaf77c/products/shopify-8144660857015/reviews?limit=5&orderBy=date%20desc&lastEvaluated=%7B%22subscriberId%22%3A%2272adcf9f-ede7-4232-8bc6-db71fceaf77c%22%2C%22subscriberId_productId%22%3A%2272adcf9f-ede7-4232-8bc6-db71fceaf77c%3Ashopify-8144660857015%22%2C%22dateCreated%22%3A%222026-03-19T00%3A19%3A21.851Z%22%2C%22reviewId%22%3A%22cc457233-a084-4379-a0cd-4de1f8eb4b6a%22%7D","reviewsSummary":{"body":"Customers say this vegan omega-3 supplement provides a plant-based alternative to fish oil. Many reviews mention it's gentle on the stomach and doesn't cause digestive upset like other brands. Users appreciate the quality and testing standards. However, reviews are mixed on taste and smell - while some report no fishy burps or aftertaste, others experience strong oceanic odors and unpleasant burps that can last hours. Common feedback includes larger-than-expected pill size and refrigeration requirements affecting travel convenience. Most customers value having a vegan option with high potency levels.","contributingReviewCount":37,"dateGenerated":"2026-02-06T00:07:17.147Z","datePublished":"2026-02-17T02:02:52.567Z","languageCode":"en"},"sort":{"defaultSort":"date desc"}} !(function() { const widgets = document.querySelectorAll('.js-oke-widgetSize'); if (widgets && widgets.length) { if (!window.okeSetWidgetSizes) { window.okeSetWidgetSizes = (allWidgets) => { if (allWidgets) { allWidgets.forEach(widget => { const width = widget.getBoundingClientRect().width; widget.classList.remove('oke-is-small', 'oke-is-medium', 'oke-is-large'); widget.classList.add(width > 960 ? 'oke-is-large' : width > 640 ? 'oke-is-medium' : 'oke-is-small'); }); } }; } if (!window.okeResizeObserver) { let okeMetafieldResizerTimer; window.okeResizeObserver = new ResizeObserver(entries => { if (entries && entries.length) { if (okeMetafieldResizerTimer) { clearTimeout(okeMetafieldResizerTimer); } okeMetafieldResizerTimer = window.setTimeout(() => { window.okeSetWidgetSizes(entries.map(e => e.target)); }, 100); } }); } window.okeSetWidgetSizes(document.querySelectorAll('.js-oke-widgetSize')); widgets.forEach((widget) => { window.okeResizeObserver.observe(widget); }); } })(); @media (min-width: 1024px) { .oke-w-main { width: 67%; margin-left: auto; } } [ { "@context": "https://schema.org/", "@type": "Product", "name": "Vegan Omega-3", "url": "https:\/\/www.livemomentous.com\/products\/vegan-omega-3", "image":"https:\/\/www.livemomentous.com\/cdn\/shop\/files\/Vegan-Omega-3_2000x2000_05112025_FINAL.png?v=1752865918\u0026width=2000","description": "Momentous Vegan Omega-3 is the most powerful plant-based omega-3 formula available, containing a market-leading 500mg each of EPA + DHA for a total 1,000mg delivery of Omega oil per serving. It’s sourced from Algal Oil—the original source of omegas consumed by fish. The result is a formula that provides crucial cell membrane support, contributing to improved brain function, muscle recovery, and overall resilience, in a clean, highly effective capsule that’s 100% free of animal products and unnecessary fillers.","sku": "850030796813","brand": { "@type": "Brand", "name": "Momentous" },"aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.2", "reviewCount": "47", "bestRating": "5", "worstRating": "1" },"hasMerchantReturnPolicy": { "@type": "MerchantReturnPolicy", "@id": "#momentous-return-policy", "applicableCountry": "US", "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow", "merchantReturnDays": 30, "merchantReturnLink": "https:\/\/www.livemomentous.com\/policies\/refund-policy", "returnMethod": "https://schema.org/ReturnByMail", "returnFees": "https://schema.org/FreeReturn", "customerRemorseReturnFees": "https://schema.org/FreeReturn", "returnShippingFeesAmount": { "@type": "MonetaryAmount", "value": 0, "currency": "USD" }, "refundType": "https://schema.org/FullRefund" }, "offers": [{ "@type": "Offer","sku": "850030796813","gtin12": "850030796813","itemCondition": "https://schema.org/NewCondition", "availability": "https://schema.org/InStock", "price": 41.0, "priceCurrency": "GBP", "url": "https:\/\/www.livemomentous.com\/products\/vegan-omega-3?variant=44985721159863","priceSpecification": [ { "@type": "UnitPriceSpecification", "price": 41.0, "priceCurrency": "GBP", "name": "One-Time Purchase" }, { "@type": "UnitPriceSpecification", "price": 30.75, "priceCurrency": "GBP", "name": "Delivery every 1 month", "validForMemberTier": { "@type": "MemberProgramTier", "@id": "#momentous-subscriber", "name": "Subscriber" } } ],"hasMerchantReturnPolicy": { "@type": "MerchantReturnPolicy", "@id": "#momentous-return-policy" } } ] }, { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https:\/\/www.livemomentous.com" }, { "@type": "ListItem", "position": 2, "name": "Vegan Products", "item": "https:\/\/www.livemomentous.com\/collections\/vegan" }, { "@type": "ListItem", "position": 3, "name": "Vegan Omega-3", "item": "https:\/\/www.livemomentous.com\/products\/vegan-omega-3" } ] } ] .combined-product-button.flavour-disabled { opacity: 0.5; position: relative; cursor: not-allowed; pointer-events: none; } .combined-product-button.flavour-disabled:after { content: ' '; position: absolute; width: 100%; height: 100%; top: 0; left: 0; background: linear-gradient(to top left, rgba(0,0,0,0) calc(50% - 1px), #CFCFCA, rgba(0,0,0,0) calc(50% + 1px)) } Sign up for offers, product news, and tips Support Account Help & Contact Subscriptions Locations Press Inquiries Company About Us Careers Blog Affiliate Program Trusted Experts Wholesale Corporate Wellness Resources Privacy Policy Terms of Service Your Privacy Choices Accessibility California Prop 65 Save with HSA/FSA Certificate of Analysis Patents Do Not Sell My Information *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. Afghanistan - USD $ Åland Islands - USD $ Algeria - USD $ Andorra - EUR € Anguilla - USD $ Antigua & Barbuda - USD $ Argentina - USD $ Armenia - USD $ Aruba - USD $ Ascension Island - USD $ Australia - AUD $ Austria - EUR € Bahamas - USD $ Bahrain - USD $ Bangladesh - USD $ Barbados - USD $ Belgium - EUR € Belize - USD $ Bermuda - USD $ Bhutan - USD $ Bolivia - USD $ Bosnia & Herzegovina - USD $ Botswana - USD $ Brazil - USD $ British Indian Ocean Territory - USD $ Brunei - USD $ Bulgaria - USD $ Burkina Faso - USD $ Burundi - USD $ Cambodia - USD $ Cameroon - USD $ Canada - CAD $ Cape Verde - USD $ Caribbean Netherlands - USD $ Cayman Islands - USD $ Central African Republic - USD $ Chad - USD $ Chile - USD $ China - USD $ Christmas Island - USD $ Cocos (Keeling) Islands - USD $ Colombia - USD $ Congo - Brazzaville - USD $ Congo - Kinshasa - USD $ Cook Islands - USD $ Costa Rica - USD $ Côte d’Ivoire - USD $ Croatia - USD $ Curaçao - USD $ Cyprus - EUR € Czechia - USD $ Denmark - USD $ Dominica - USD $ Dominican Republic - USD $ Ecuador - USD $ Egypt - USD $ El Salvador - USD $ Estonia - EUR € Eswatini - USD $ Ethiopia - USD $ Falkland Islands - USD $ Finland - EUR € France - EUR € French Guiana - USD $ French Polynesia - USD $ French Southern Territories - USD $ Gabon - USD $ Gambia - USD $ Germany - EUR € Ghana - USD $ Greece - EUR € Guadeloupe - USD $ Guatemala - USD $ Guernsey - USD $ Guinea - USD $ Guyana - USD $ Haiti - USD $ Hong Kong SAR - USD $ Hungary - USD $ Iceland - USD $ India - USD $ Indonesia - USD $ Iraq - USD $ Ireland - EUR € Isle of Man - USD $ Israel - USD $ Italy - EUR € Jamaica - USD $ Japan - USD $ Jersey - USD $ Jordan - USD $ Kenya - USD $ Kosovo - EUR € Kuwait - USD $ Laos - USD $ Latvia - EUR € Lebanon - USD $ Liberia - USD $ Liechtenstein - USD $ Lithuania - EUR € Luxembourg - EUR € Macao SAR - USD $ Madagascar - USD $ Malawi - USD $ Malaysia - USD $ Maldives - USD $ Mali - USD $ Malta - EUR € Martinique - USD $ Mauritania - USD $ Mauritius - USD $ Mayotte - USD $ Mexico - USD $ Moldova - USD $ Monaco - EUR € Montenegro - EUR € Morocco - USD $ Mozambique - USD $ Namibia - USD $ Nauru - USD $ Nepal - USD $ Netherlands - EUR € New Zealand - USD $ Nicaragua - USD $ Niger - USD $ Nigeria - USD $ Niue - USD $ Norfolk Island - USD $ Norway - USD $ Oman - USD $ Pakistan - USD $ Palestinian Territories - USD $ Panama - USD $ Papua New Guinea - USD $ Paraguay - USD $ Peru - USD $ Philippines - USD $ Pitcairn Islands - USD $ Poland - USD $ Portugal - EUR € Qatar - USD $ Réunion - USD $ Romania - USD $ Rwanda - USD $ San Marino - EUR € São Tomé & Príncipe - USD $ Saudi Arabia - USD $ Senegal - USD $ Seychelles - USD $ Sierra Leone - USD $ Singapore - USD $ Slovakia - EUR € Slovenia - EUR € Solomon Islands - USD $ Somalia - USD $ South Africa - USD $ South Georgia & South Sandwich Islands - USD $ South Korea - USD $ South Sudan - USD $ Spain - EUR € Sri Lanka - USD $ St. Helena - USD $ St. Pierre & Miquelon - USD $ Suriname - USD $ Svalbard & Jan Mayen - USD $ Sweden - USD $ Switzerland - USD $ Taiwan - USD $ Tajikistan - USD $ Tanzania - USD $ Thailand - USD $ Togo - USD $ Tokelau - USD $ Trinidad & Tobago - USD $ Tristan da Cunha - USD $ Tunisia - USD $ Türkiye - USD $ Turkmenistan - USD $ Tuvalu - USD $ U.S. Outlying Islands - USD $ Uganda - USD $ Ukraine - USD $ United Arab Emirates - USD $ United Kingdom - GBP £ United States - USD $ Uruguay - USD $ Vatican City - USD $ Venezuela - USD $ Vietnam - USD $ Western Sahara - USD $ Yemen - USD $ Zambia - USD $ Zimbabwe - USD $ United Kingdom - GB £ .country-selector { position: relative; } .country-selector__select { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; } .country-selector__selected-display { display: flex; align-items: center; gap: 8px; } document.querySelector('.country-selector__select').addEventListener('change', function() { const selectedOption = this.options[this.selectedIndex]; const flagSrc = selectedOption.dataset.flagSrc; const currency = selectedOption.dataset.currency; // Update the displayed flag and text const display = this.closest('.country-selector').querySelector('.country-selector__selected-display'); display.querySelector('img').src = flagSrc; display.querySelector('img').alt = selectedOption.text; display.querySelector('span').textContent = selectedOption.text; // Submit the form this.closest('form').submit(); }); document.addEventListener("DOMContentLoaded", () => { const managePreferencesBtn = document.querySelector( 'a[aria-label="Your Privacy Choices"]' ); if (managePreferencesBtn) { managePreferencesBtn.addEventListener("click", (event) => { event.preventDefault(); const consent = window[Symbol.for("blotout-consent")]; if (consent && typeof consent.showBanner === "function") { consent.showBanner(); console.log('Banner Fired') } }); } }); document.addEventListener('DOMContentLoaded', function() { // Handle newsletter form submission document.addEventListener('newsletter-submit', function(event) { const email = event.detail.email; // Here you can integrate with your email service (Klaviyo, Mailchimp, etc.) // Example: Send to Klaviyo or your backend console.log('Newsletter subscription:', email); // You can add your newsletter integration here // For example, if using Klaviyo: // if (window._learnq) { // window._learnq.push(['identify', { $email: email }]); // } }); }); /* Ensure x-cloak works properly */ [x-cloak] { display: none !important; } /* Custom styles for localization form integration */ #footer-new .country-selector { min-width: 200px; } #footer-new .country-selector__selected-display { padding: 8px 12px; cursor: pointer; transition: border-color 0.2s; } #footer-new .country-selector__selected-display:hover { border-color: #f97316; } #footer-new .country-selector__selected-display:focus-within { outline: 2px solid #f97316; outline-offset: 2px; } /* Ensure proper spacing for social icons */ #footer-new [role="list"] { list-style: none; padding: 0; margin: 0; } /* Smooth transitions for all interactive elements */ #footer-new a, #footer-new button { transition: all 0.2s ease-in-out; } /* High contrast mode support */ @media (prefers-contrast: high) { #footer-new { border-top: 2px solid currentColor; } #footer-new a:focus, #footer-new button:focus { outline-width: 3px; } } /* Reduced motion support */ @media (prefers-reduced-motion: reduce) { #footer-new * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } .footer-new__logo { width: 300px; height: 120px; } @media (max-width: 768px) { .footer-new__logo { width: 200px; height: 85px; } } .new-footer-klaviyo-form button[type="button"] { font-size: 0 !important; } .new-footer-klaviyo-form button[type="button"]::before { content: ""; display: inline-block; width: 19px; height: 16px; background-image: url("data:image/svg+xml;utf8,"); background-repeat: no-repeat; background-size: contain; margin-right: 6px; /* spacing before text */ vertical-align: middle; } function closeKlaviyoOutOfStockModal() { let modalElem = document.getElementById("klaviyo_modal"); modalElem.style.display = "none"; document.getElementById('back-in-stock').innerHTML = "" document.body.classList.remove('back-in-stock-opned') } function successKlaviyoOutOfStockModal() { document.getElementById("klaviyo_out_of_stock_form").innerHTML = `
You will receive an email when the product is back in stock! `; } function createKlaviyoOutOfStockSubscriptionModal(variantId, productTitle, variantTitle, backDate, image) { let modalElem = document.createElement("div"); modalElem.innerHTML = `
We’ll notify you when the product is back in stock!
${productTitle}
${variantTitle}
Estimated to be back in stock: ${backDate}
Email
Notify me when available
`
modalElem.id = "klaviyo_modal";
modalElem.classList.add("klaviyo_modal");
modalElem.style.display = "block";
return modalElem;
}
function klaviyoFormValidateEmail(email) {
return String(email)
.toLowerCase()
.match(
/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
);
};
window.openKlaviyoStockAlertSubscriptionForm = function(variantId, productTitle, variantTitle, backDate, image) {
let modalElem = createKlaviyoOutOfStockSubscriptionModal(variantId, productTitle, variantTitle, backDate, image);
document.getElementById('back-in-stock').appendChild(modalElem);
document.body.classList.add('back-in-stock-opned')
document.querySelectorAll('.klaviyo_modal_close_triger').forEach(item => {
item.addEventListener("click", closeKlaviyoOutOfStockModal);
})
document.getElementById("klaviyo_out_of_stock_form_button").addEventListener("click", function(evt) {
evt.stopPropagation();
const email = document.getElementById("Klaviyo_out_of_stock_email").value;
const emailValidation = klaviyoFormValidateEmail(email);
console.log(email, variantId, 'email, variantId');
if (!emailValidation) return;
const data = {
data: {
type: "back-in-stock-subscription",
attributes: {
profile: {
data: {
type: "profile",
attributes: {
email: email
}
}
},
channels: ["EMAIL"]
},
relationships: {
variant: {
data: {
type: "catalog-variant",
id: `$shopify:::$default:::${variantId}`
}
}
}
}
};
fetch("https://a.klaviyo.com/client/back-in-stock-subscriptions/?company_id=MfVp5f", {
method: "POST",
headers: {
"Content-Type": "application/json",
"revision": "2024-06-15"
},
body: JSON.stringify(data)
})
.then(async res => {
if (!res.ok) {
const errorText = await res.text(); // Don't assume JSON here
console.error("Klaviyo API error:", errorText);
throw new Error("Failed to subscribe");
}
// Only try parsing JSON if there's content
const contentType = res.headers.get("content-type") || "";
if (contentType.includes("application/json")) {
const result = await res.json();
console.log("Subscription success:", result);
}
// Run your success handler
successKlaviyoOutOfStockModal();
})
.catch(err => {
console.error("Klaviyo Back-in-Stock Error:", err);
});
});
document.getElementById("Klaviyo_out_of_stock_email").addEventListener("input", function(evt) {
let email = document.getElementById("Klaviyo_out_of_stock_email").value;
let emailValidation = klaviyoFormValidateEmail(email)
if (emailValidation) {
document.getElementById('klaviyo_out_of_stock_form_button').removeAttribute("disabled");
}
else {
document.getElementById("klaviyo_out_of_stock_form_button").setAttribute("disabled", "true");
}
})
}
window.upsell_popup = {
title : null,
subtitle : null,
info : null,
product_handle : "",
product_id : 1234,
product_image : "//www.livemomentous.com/cdn/shopifycloud/storefront/assets/no-image-2048-a2addb12_550x.gif",
product_variants : [
],
base_product_id : 1234
}
if (window.location.pathname == '/a/account/login') {
window.location.replace('/tools/recurring/login/');
}
window.addEventListener('load', function() {
var _learnq = window._learnq || [];
function addedToCart() {
fetch(`${window.location.origin}/cart.js`)
.then(res => res.clone().json().then(data => {
var cart = {
total_price: data.total_price/100,
$value: data.total_price/100,
total_discount: data.total_discount,
original_total_price: data.original_total_price/100,
items: data.items
}
if (item !== 'undefined') {
cart = Object.assign(cart, item)
}
if (klAjax) {
_learnq.push(['track', 'Added to Cart', cart]);
klAjax = false;
}
}))
};
(function (ns, fetch) {
ns.fetch = function() {
const response = fetch.apply(this, arguments);
response.then(res => {
if (`${window.location.origin}/cart/add.js`
.includes(res.url)) {
addedToCart()
}
});
return response
}
}(window, window.fetch));
var klAjax = true;
var atcButtons = document.querySelectorAll("form[action*='/cart/add'] button[type='submit']");
for (var i = 0; i {
window.ShopifyAnalytics.meta.selectedVariantId = '44985721159863';
console.log(
'window.ShopifyAnalytics.meta.selectedVariantId:',
window.ShopifyAnalytics.meta.selectedVariantId
);
}, 5000);
.rebuy-product-actions .subscription-checkbox .slider.round,
.buttons-wrappers button:nth-of-type(2) {
display: none;
}
.siena-iframe {
display: none;
}
@media (max-width: 1366px) {
.siena-iframe {
z-index: 39;
}
.siena-iframe.siena-iframe--bottom-0,
.siena-iframe.siena-iframe--fullscreen{
z-index: 9999999;
}
}
ttd_dom_ready( function() {
if (typeof TTDUniversalPixelApi === 'function') {
var universalPixelApi = new TTDUniversalPixelApi();
universalPixelApi.init("h4w8qq9", ["k1r6x4d"], "https://insight.adsrvr.org/track/up");
}
});
document.querySelectorAll('button[aria-label*="Add to Bag"]').forEach(function(btn) {
var productn = btn.getAttribute('aria-label').slice(11)
btn.addEventListener('click', function(event) {
var conversionPixel = new Image();
conversionPixel.src = "https://insight.adsrvr.org/track/pxl/?adv=h4w8qq9&ct=0:fmme5s8&fmt=3&td1=" + productn + "&ts=" + (new Date()).getTime(); // Adding a unique ID to prevent caching
conversionPixel.height = 1;
conversionPixel.width = 1;
conversionPixel.style.display = "none"; // Hide the pixel
document.body.appendChild(conversionPixel);
});
});
0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
:
1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
{{ value }}
{{ frequencyLabel(frequency, product.subscription_interval) }}
Quantity
{{ n }}
Sale price
Original price
Price
Powered by Rebuy
0 ? 'is-visible' : 'is-hidden']">
:
0">
{{ variant.title }}
{{ value }}
0">
0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
:
1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
{{ value }}
Select your purchase method
Out of Stock Protection
{{ frequencyLabel(frequency, product.subscription_interval) }}
One-Time Purchase
Receive Once
Add to Bag
Price
View Product
el.classList.remove('show')); $event.target.closest('.rebuy-product-block').querySelector('.rebuy-product-options').classList.add('show')"
type="button">
Price
Powered by Rebuy
0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
:
1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
{{ value }}
Select your purchase method
Out of Stock Protection
{{ frequencyLabel(frequency, product.subscription_interval) }}
One-Time Purchase
Receive Once
Add to Bag
Price
View Product
el.classList.remove('show')); $event.target.closest('.rebuy-product-block').querySelector('.rebuy-product-options').classList.add('show')"
type="button">
Price
Powered by Rebuy
Search
Search for products, collections, pages, and articles
.search-form-wrapper {
position: relative;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
isolation: isolate;
}
.search-form__input:focus {
border: 1px solid #000;
}
.search-form__results {
width: 480px;
border-radius: 10px;
border: 1px solid #E5E7EB;
background: #FFF;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
top: 100%;
}
@media(max-width: 640px) {
.search-form__results {
width: 100%;
border-radius: 10px;
border: none;
margin-top: 0;
}
}
.search-form__results.show {
display: block;
}
.search-result-divider {
border-top: 1px solid var(--grey-100, #e5e5e5);
}
.search-product-img {
width: 5rem;
height: 5rem;
}
@media(max-width: 640px) {
.search-product-img {
width: 70px;
height: 70px;
}
}
.atc-btn[data-loading] {
opacity: 0.6;
pointer-events: none;
}
.atc-btn[data-added] {
background-color: #2d7a3a;
}
.search-form__results.is-loading::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 2px;
background: linear-gradient(90deg, transparent 0%, var(--grey-900, #171717) 50%, transparent 100%);
background-size: 200% 100%;
animation: search-loading-shimmer 1.2s ease-in-out infinite;
pointer-events: none;
}
.search-form__results-content {
max-height: calc(100vh - 170px);
overflow-y: auto;
-webkit-overflow-scrolling: touch;
overscroll-behavior: contain;
}
.search-result-divider {
position: sticky;
bottom: 0;
background-color: #FFF;
z-index: 10;
}
@keyframes search-loading-shimmer {
0% { background-position: -100% 0; }
100% { background-position: 200% 0; }
}
@media(max-width: 640px) {
.search-product-row {
flex-direction: column;
align-items: flex-start !important;
}
.search-recommended-section {
display: none;
}
}
.query-item-text *,
.query-item-text {
white-space: nowrap;
}
.query-item-text mark {
background-color: #FFFADF;
color: inherit;
border-radius: 2px;
}
.search-form__clear-btn {
background: none;
border: none;
padding: 0;
cursor: pointer;
line-height: 0;
color: var(--grey-400, #999);
}
.search-form__clear-btn:hover svg path {
stroke: var(--grey-700, #404040);
}
(function() {
'use strict';
const SEARCH_ICON = `
`;
// Guard: only define the class once even if snippet is rendered multiple times
if (!window.MomentousPredictiveSearch) {
window.MomentousPredictiveSearch = class {
constructor(wrapper) {
this.wrapper = wrapper;
this.input = wrapper.querySelector('[data-search-input]');
this.resultsContainer = wrapper.querySelector('[data-search-results]');
this.resultsContent = wrapper.querySelector('[data-search-results-content]');
this.form = wrapper.querySelector('.search-form');
this.submitBtn = wrapper.querySelector('[data-search-submit]');
this.clearBtn = wrapper.querySelector('[data-search-clear]');
this.debounceTimer = null;
this.currentRequest = null;
this.currentQuery = '';
this.minQueryLength = 2;
this.debounceDelay = 300;
this.cache = new Map();
this.requestId = 0;
this.init();
}
init() {
this.input.addEventListener('input', (e) => {
this.handleInput(e.target.value);
this.updateClearBtn();
});
if (this.clearBtn) {
this.clearBtn.addEventListener('click', () => {
this.input.value = '';
this.currentQuery = '';
this.hideResults();
this.updateClearBtn();
this.input.focus();
});
}
this.input.addEventListener('focus', () => {
if (this.input.value.length >= this.minQueryLength) {
this.showResults();
}
});
this.input.addEventListener('touchend', (e) => {
e.stopPropagation();
this.input.focus();
});
this.input.addEventListener('touchstart', (e) => {
e.stopPropagation();
}, { passive: true });
const handleOutsideInteraction = (e) => {
if (!this.wrapper.contains(e.target)) {
const sidebarPanel = document.getElementById('ss-panel');
if (sidebarPanel && sidebarPanel.contains(this.wrapper) && sidebarPanel.contains(e.target)) {
return;
}
this.hideResults();
}
};
document.addEventListener('click', handleOutsideInteraction);
document.addEventListener('touchstart', handleOutsideInteraction, { passive: true });
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') this.hideResults();
});
}
updateClearBtn() {
const show = this.input.value.length >= this.minQueryLength;
if (this.clearBtn) this.clearBtn.classList.toggle('hidden', !show);
if (this.submitBtn) this.submitBtn.classList.toggle('hidden', show);
}
handleInput(query) {
const trimmedQuery = query.trim();
if (this.debounceTimer) clearTimeout(this.debounceTimer);
if (trimmedQuery.length {
this.fetchSearchData(trimmedQuery);
}, this.debounceDelay);
}
async fetchSearchData(query) {
if (this.cache.has(query)) {
const cached = this.cache.get(query);
this.setLoadingState(false);
this.renderResults(cached.results, query, cached.recommended);
return;
}
if (this.currentRequest) {
this.currentRequest.abort();
this.currentRequest = null;
}
const requestId = ++this.requestId;
const controller = new AbortController();
this.currentRequest = controller;
const baseUrl = window.Shopify?.routes?.root || '/';
const apiUrl = `${baseUrl}search/suggest.json?q=${encodeURIComponent(query)}&resources[type]=product,query&resources[limit]=5&resources[limit_scope]=each`;
try {
const response = await fetch(apiUrl, {
signal: controller.signal,
headers: { 'Accept': 'application/json' }
});
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
if (requestId !== this.requestId) return;
this.currentRequest = null;
const results = data.resources?.results || {};
if (this.cache.size > 50) this.cache.clear();
this.cache.set(query, { results, recommended: null });
this.setLoadingState(false);
this.renderResults(results, query, null);
} catch (error) {
if (error.name === 'AbortError') return;
if (requestId !== this.requestId) return;
console.error('Predictive search error:', error);
this.setLoadingState(false);
this.showError();
}
}
async fetchRecommendations(productId) {
try {
const baseUrl = window.Shopify?.routes?.root || '/';
const url = `${baseUrl}recommendations/products.json?product_id=${productId}&limit=6&intent=related`;
const response = await fetch(url, { headers: { 'Accept': 'application/json' } });
if (!response.ok) return [];
const data = await response.json();
return (data.products || [])
.filter(p => {
const tags = (p.tags || []).map(t => t.toLowerCase());
return !tags.includes('searchnise_ignore') && !tags.includes('search_hide');
})
.slice(0, 3);
} catch (e) {
return [];
}
}
async addToCart(variantId, btn) {
btn.setAttribute('data-loading', '');
btn.textContent = 'Adding...';
try {
const response = await fetch('/cart/add.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
body: JSON.stringify({ id: variantId, quantity: 1 })
});
if (!response.ok) throw new Error('Failed to add to cart');
btn.removeAttribute('data-loading');
btn.setAttribute('data-added', '');
btn.textContent = 'Added!';
document.dispatchEvent(new CustomEvent('cart:refresh'));
setTimeout(() => {
btn.removeAttribute('data-added');
btn.textContent = 'Add to Cart';
}, 2000);
} catch (e) {
btn.removeAttribute('data-loading');
btn.textContent = 'Add to Cart';
console.error('ATC error:', e);
}
}
bindAtcButtons() {
this.resultsContent.querySelectorAll('.atc-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
e.preventDefault();
const variantId = btn.dataset.variantId;
if (variantId) this.addToCart(variantId, btn);
});
});
}
renderResults(results, query, preloadedRecommended) {
if (!results || ((!results.products || results.products.length === 0) && (!results.queries || results.queries.length === 0))) {
this.resultsContent.innerHTML = `
No results found for "${this.escapeHtml(query)}"
`;
this.showResults();
return;
}
const products = (results.products || [])
.filter(p => {
const tags = (p.tags || []).map(t => t.toLowerCase());
return !tags.includes('searchnise_ignore') && !tags.includes('search_hide');
})
.slice(0, 4);
const queries = (results.queries || []).slice(0, 4);
const firstProductId = products.length > 0 ? products[0].id : null;
let html = '';
if (products.length > 0) {
html += ``;
products.forEach(product => {
html += this.renderMatchedProduct(product);
});
html += `
`;
}
if (queries.length > 0) {
html += `
Top Searches
- ${SEARCH_ICON}
${queries.map(q => this.renderQueryItem(q)).join('')}
`;
}
const searchUrl = (window.Shopify?.routes?.root || '/') + `search?q=${encodeURIComponent(query)}&type=product`;
html += `
View all results for “${this.escapeHtml(query)}”
`;
if (firstProductId) {
if (preloadedRecommended && preloadedRecommended.length > 0) {
html += this.renderRecommendedSection(preloadedRecommended);
} else if (preloadedRecommended === null) {
html += `
`;
}
}
this.resultsContent.innerHTML = html;
this.showResults();
this.bindAtcButtons();
if (firstProductId && preloadedRecommended === null) {
this.fetchAndPatchRecommendations(firstProductId, query);
}
}
renderMatchedProduct(product) {
const imgUrl = product.featured_image?.url || product.image || '';
const imgSized = imgUrl ? imgUrl.replace(/(\.[a-z]+)(\?.*)?$/i, '_220x220$1$2') : '';
const price = this.formatPrice(product.price, product.price_min, product.price_max);
const isSingleVariant = !product.variants || product.variants.length
${imgSized
? `
`
: `
`
}
${title}
${price ? `${price}
` : ''}
View Product
`;
}
renderSuggestedProduct(product) {
const imgUrl = product.featured_image?.src || product.featured_image?.url || product.images?.[0] || '';
const imgSized = imgUrl ? imgUrl.replace(/(\.[a-z]+)(\?.*)?$/i, '_300x300$1$2') : '';
const productUrl = this.escapeHtml(product.url || `/products/${product.handle}`);
const title = this.escapeHtml(product.title || '');
return `
${imgSized
? `
`
: `
`
}
${title}
`;
}
renderQueryItem(item) {
const queryText = item.styled_text || this.escapeHtml(item.text || '');
const queryUrl = this.escapeHtml(item.url || '#');
return `
${queryText}
`;
}
renderRecommendedSection(recommended) {
return `
Suggested Products
${recommended.map(p => this.renderSuggestedProduct(p)).join('')}
`;
}
async fetchAndPatchRecommendations(productId, query) {
const recommended = await this.fetchRecommendations(productId);
if (query !== this.currentQuery) return;
if (this.cache.has(query)) {
this.cache.get(query).recommended = recommended;
}
const slot = this.resultsContent.querySelector('[data-recommendations-slot]');
if (!slot) return;
if (recommended.length > 0) {
slot.outerHTML = this.renderRecommendedSection(recommended);
} else {
slot.remove();
}
}
setLoadingState(loading) {
this.resultsContainer.classList.toggle('is-loading', loading);
if (loading && !this.resultsContainer.classList.contains('show')) {
this.showResults();
}
}
formatPrice(price, priceMin, priceMax) {
if (!price && !priceMin && !priceMax) return '';
const formatCurrency = (amount) => {
if (window.Shopify?.formatMoney) {
return window.Shopify.formatMoney(amount, window.Shopify.money_format || '$');
}
const currency = window.Shopify?.currency?.active || 'USD';
return new Intl.NumberFormat('en-US', { style: 'currency', currency }).format(amount);
};
if (priceMin && priceMax && priceMin !== priceMax) {
return `${formatCurrency(priceMin)} – ${formatCurrency(priceMax)}`;
}
return formatCurrency(price || priceMin || priceMax);
}
escapeHtml(text) {
if (text == null) return '';
const div = document.createElement('div');
div.textContent = String(text);
return div.innerHTML;
}
showError() {
this.resultsContent.innerHTML = `
Unable to load results. Please try again.
`;
this.showResults();
}
showResults() {
this.resultsContainer.classList.remove('hidden');
this.resultsContainer.classList.add('show');
}
hideResults() {
this.resultsContainer.classList.add('hidden');
this.resultsContainer.classList.remove('show');
}
};
} // end if (!window.MomentousPredictiveSearch)
function initPredictiveSearch() {
document.querySelectorAll('[data-search-form]').forEach(function(wrapper) {
if (!wrapper.__predictiveSearch) {
wrapper.__predictiveSearch = new window.MomentousPredictiveSearch(wrapper);
}
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initPredictiveSearch);
} else {
initPredictiveSearch();
}
})();
Recommended Products
Creatine - 60 Servings
£27.00
View Product
Creatine - 90 Servings
£33.00
View Product
Creatine Chews 150-Count
£39.00
View Product
#ss-backdrop {
display: none;
position: fixed;
inset: 0;
background: rgba(0,0,0,0.45);
z-index: 400;
}
#ss-panel {
display: flex;
flex-direction: column;
position: fixed;
top: 0;
right: 0;
bottom: 0;
width: 440px;
max-width: 100%;
background: #fff;
z-index: 401;
transform: translateX(100%);
transition: transform 0.3s ease;
box-shadow: -4px 0 24px rgba(0,0,0,0.1);
}
#ss-panel.open,
#ss-backdrop.open {
display: flex; /* backdrop uses display:block via override below */
}
#ss-backdrop.open { display: block; }
#ss-panel.open { transform: translateX(0); }
#ss-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px 20px;
border-bottom: 1px solid #e5e5e5;
flex-shrink: 0;
}
#ss-title {
font-size: 17px;
font-weight: 600;
color: #171717;
}
#ss-header button {
background: none;
border: none;
cursor: pointer;
padding: 4px;
color: #555;
line-height: 0;
}
#ss-body {
flex: 1;
min-height: 0;
overflow-y: auto;
padding: 18px 20px;
-webkit-overflow-scrolling: touch;
}
/* Results appear inline, not as a dropdown */
#ss-panel .search-form-wrapper { isolation: auto; }
#ss-panel .search-form__results {
position: static !important;
width: 100% !important;
border: none !important;
box-shadow: none !important;
border-radius: 0 !important;
margin-top: 10px !important;
}
#ss-panel .search-form__results-content {
padding: 0 !important;
}
/* Recommended */
#ss-recommended { margin-top: 20px; }
#ss-recommended-label {
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: #757575;
margin: 0 0 12px;
}
.ss-rec-item {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
border: 1px solid #e5e5e5;
border-radius: 8px;
text-decoration: none;
margin-bottom: 8px;
transition: background 0.15s;
}
.ss-rec-item:hover { background: #fafafa; }
.ss-rec-item img,
.ss-rec-img-placeholder {
width: 72px;
height: 72px;
border-radius: 6px;
object-fit: cover;
flex-shrink: 0;
background: #f0f0f0;
}
.ss-rec-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 4px;
}
.ss-rec-title {
font-size: 13px;
font-weight: 600;
color: #171717;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.ss-rec-price {
font-size: 13px;
color: #737373;
}
#ss-recommended.hidden { display: none; }
var _ssScrollY = 0;
function openSearchSidebar() {
_ssScrollY = window.pageYOffset || document.documentElement.scrollTop;
document.body.style.position = 'fixed';
document.body.style.top = '-' + _ssScrollY + 'px';
document.body.style.width = '100%';
document.getElementById('ss-panel').classList.add('open');
document.getElementById('ss-backdrop').classList.add('open');
setTimeout(function() {
var input = document.querySelector('#ss-panel [data-search-input]');
if (input) input.focus();
}, 320);
}
function closeSearchSidebar() {
document.getElementById('ss-panel').classList.remove('open');
document.getElementById('ss-backdrop').classList.remove('open');
document.body.style.position = '';
document.body.style.top = '';
document.body.style.width = '';
window.scrollTo(0, _ssScrollY);
}
// Hide recommended when typing, show when empty
document.addEventListener('DOMContentLoaded', function() {
var input = document.querySelector('#ss-panel [data-search-input]');
var rec = document.getElementById('ss-recommended');
if (!input || !rec) return;
input.addEventListener('input', function() {
if (input.value.trim().length > 0) {
rec.classList.add('hidden');
} else {
rec.classList.remove('hidden');
}
});
// Clear button also restores recommended
var clearBtn = document.querySelector('#ss-panel [data-search-clear]');
if (clearBtn) {
clearBtn.addEventListener('click', function() {
setTimeout(function() { rec.classList.remove('hidden'); }, 20);
});
}
});
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') closeSearchSidebar();
});
.favicon {display: block;}
.recharge-theme {
/* App */
--recharge-app-background: #F9F8F4;
--recharge-app-container: 1200px;
--recharge-app-vertical-padding: 32px;
/* Brand colors */
--recharge-color-brand: #467C99;
/* Tints */
--recharge-color-brand-120: #38637a;
--recharge-color-brand-20: #6b96ad;
--recharge-color-brand-40: #90b0c2;
--recharge-color-brand-60: #b5cbd6;
--recharge-color-brand-75: #d1dee6;
--recharge-color-brand-85: #e3ebf0;
/* Neutral */
--recharge-color-neutral: hsl(201, 35%, 7%);
--recharge-color-neutral-80: hsl(201, 7%, 25%);
--recharge-color-neutral-70: hsl(201, 5%, 35%);
--recharge-color-neutral-40: hsl(201, 3%, 63%);
--recharge-color-neutral-10: hsl(201, 2%, 91%);
/* Links */
--recharge-button-secondary: #467C99;
--recharge-button-secondary-120: #38637a;
--recharge-button-secondary-60: #90b0c2;
/* Images */
--recharge-images-ratio: 1;
/* Cards */
--recharge-cards-background: #FFFFFF;
--recharge-cards-border-color: RGBA(0,0,0,0);
/* Fonts */
--recharge-typography-scale: 16px;
--recharge-typography-size-1: calc(3 * var(--recharge-typography-scale));
--recharge-typography-size-2: calc(2.25 * var(--recharge-typography-scale));
--recharge-typography-size-3: calc(1.625 * var(--recharge-typography-scale));
--recharge-typography-size-4: calc(1.25 * var(--recharge-typography-scale));
--recharge-typography-size-5: calc(1 * var(--recharge-typography-scale));
--recharge-typography-size-6: calc(.875 * var(--recharge-typography-scale));
/** Text **/
--recharge-typography-light: #FFFFFF;
--recharge-typography-primary: var(--recharge-color-neutral);
--recharge-typography-secondary: var(--recharge-color-neutral-70);
/* Corners */
--recharge-corners-radius: 8px;
--recharge-button-border-radius: 8px;
/* Views */
--recharge-views-background: #F9F8F4;
/* Buttons */
--recharge-button-font-family: inherit;
--recharge-button-brand: var(--recharge-color-brand);
--recharge-button-color: #FFFFFF;
}
(function() {
var initialCartState = [];
var previousCartStateKey = 'previousCartState';
var removedItemsKey = 'removedItemsState';
var previousCartState = [];
try {
previousCartState = JSON.parse(localStorage.getItem(previousCartStateKey) || '[]');
} catch (e) {
previousCartState = [];
}
var removedItems = previousCartState.filter(function(prevItem) {
return !initialCartState.some(function(currItem) {
return currItem.id === prevItem.id;
});
});
if (removedItems.length) {
localStorage.setItem(removedItemsKey, JSON.stringify(removedItems));
}
localStorage.setItem(previousCartStateKey, JSON.stringify(initialCartState));
})();
(function() {
var productId = "8144660857015";
var productTitle = "Vegan Omega-3";
var productHandle = "vegan-omega-3";
var marketId = "21022965943";
var storageKey = 'oe_viewedProducts';
function trackViewedProducts() {
if (!productId) return;
var viewedProducts = [];
try {
viewedProducts = JSON.parse(localStorage.getItem(storageKey) || '[]');
} catch (e) {
viewedProducts = [];
}
viewedProducts = viewedProducts.filter(function(p) { return p.id !== productId; });
viewedProducts.unshift({
id: productId,
title: productTitle,
handle: productHandle,
viewedAt: new Date().toISOString()
});
viewedProducts = viewedProducts.slice(0, 50);
localStorage.setItem(storageKey, JSON.stringify(viewedProducts));
updateCartAttributes();
}
function updateCartAttributes() {
var viewedProducts = [];
try {
viewedProducts = JSON.parse(localStorage.getItem(storageKey) || '[]');
} catch (e) {
return;
}
var productIds = viewedProducts.map(function(p) { return p.id; }).slice(0, 10).join(',');
var cartAttributes = {};
if (productIds) cartAttributes['__upsell_recently_viewed_products'] = productIds;
if (marketId) cartAttributes['__upsell_market_id'] = marketId;
if (Object.keys(cartAttributes).length === 0) return;
fetch(window.Shopify.routes.root + 'cart/update.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ attributes: cartAttributes })
}).catch(function() {});
}
trackViewedProducts();
window.addEventListener('popstate', trackViewedProducts);
})();
window['ShopifyForms'] = {
...window['ShopifyForms'],
currentPageType: "product"
}; Price History
Loading...
${variantTitle}
Estimated to be back in stock: ${backDate}
:
1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
{{ value }}
{{ frequencyLabel(frequency, product.subscription_interval) }}
Quantity
{{ n }}
Sale price
Original price
Price
Powered by Rebuy
0 ? 'is-visible' : 'is-hidden']">
:
0">
{{ variant.title }}
{{ value }}
0">
0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
:
1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
{{ value }}
Select your purchase method
Out of Stock Protection
{{ frequencyLabel(frequency, product.subscription_interval) }}
One-Time Purchase
Receive Once
Add to Bag
Price
View Product
el.classList.remove('show')); $event.target.closest('.rebuy-product-block').querySelector('.rebuy-product-options').classList.add('show')"
type="button">
Price
Powered by Rebuy
0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
:
1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
{{ value }}
Select your purchase method
Out of Stock Protection
{{ frequencyLabel(frequency, product.subscription_interval) }}
One-Time Purchase
Receive Once
Add to Bag
Price
View Product
el.classList.remove('show')); $event.target.closest('.rebuy-product-block').querySelector('.rebuy-product-options').classList.add('show')"
type="button">
Price
Powered by Rebuy
Search
Search for products, collections, pages, and articles
.search-form-wrapper {
position: relative;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
isolation: isolate;
}
.search-form__input:focus {
border: 1px solid #000;
}
.search-form__results {
width: 480px;
border-radius: 10px;
border: 1px solid #E5E7EB;
background: #FFF;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
top: 100%;
}
@media(max-width: 640px) {
.search-form__results {
width: 100%;
border-radius: 10px;
border: none;
margin-top: 0;
}
}
.search-form__results.show {
display: block;
}
.search-result-divider {
border-top: 1px solid var(--grey-100, #e5e5e5);
}
.search-product-img {
width: 5rem;
height: 5rem;
}
@media(max-width: 640px) {
.search-product-img {
width: 70px;
height: 70px;
}
}
.atc-btn[data-loading] {
opacity: 0.6;
pointer-events: none;
}
.atc-btn[data-added] {
background-color: #2d7a3a;
}
.search-form__results.is-loading::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 2px;
background: linear-gradient(90deg, transparent 0%, var(--grey-900, #171717) 50%, transparent 100%);
background-size: 200% 100%;
animation: search-loading-shimmer 1.2s ease-in-out infinite;
pointer-events: none;
}
.search-form__results-content {
max-height: calc(100vh - 170px);
overflow-y: auto;
-webkit-overflow-scrolling: touch;
overscroll-behavior: contain;
}
.search-result-divider {
position: sticky;
bottom: 0;
background-color: #FFF;
z-index: 10;
}
@keyframes search-loading-shimmer {
0% { background-position: -100% 0; }
100% { background-position: 200% 0; }
}
@media(max-width: 640px) {
.search-product-row {
flex-direction: column;
align-items: flex-start !important;
}
.search-recommended-section {
display: none;
}
}
.query-item-text *,
.query-item-text {
white-space: nowrap;
}
.query-item-text mark {
background-color: #FFFADF;
color: inherit;
border-radius: 2px;
}
.search-form__clear-btn {
background: none;
border: none;
padding: 0;
cursor: pointer;
line-height: 0;
color: var(--grey-400, #999);
}
.search-form__clear-btn:hover svg path {
stroke: var(--grey-700, #404040);
}
(function() {
'use strict';
const SEARCH_ICON = `
`;
// Guard: only define the class once even if snippet is rendered multiple times
if (!window.MomentousPredictiveSearch) {
window.MomentousPredictiveSearch = class {
constructor(wrapper) {
this.wrapper = wrapper;
this.input = wrapper.querySelector('[data-search-input]');
this.resultsContainer = wrapper.querySelector('[data-search-results]');
this.resultsContent = wrapper.querySelector('[data-search-results-content]');
this.form = wrapper.querySelector('.search-form');
this.submitBtn = wrapper.querySelector('[data-search-submit]');
this.clearBtn = wrapper.querySelector('[data-search-clear]');
this.debounceTimer = null;
this.currentRequest = null;
this.currentQuery = '';
this.minQueryLength = 2;
this.debounceDelay = 300;
this.cache = new Map();
this.requestId = 0;
this.init();
}
init() {
this.input.addEventListener('input', (e) => {
this.handleInput(e.target.value);
this.updateClearBtn();
});
if (this.clearBtn) {
this.clearBtn.addEventListener('click', () => {
this.input.value = '';
this.currentQuery = '';
this.hideResults();
this.updateClearBtn();
this.input.focus();
});
}
this.input.addEventListener('focus', () => {
if (this.input.value.length >= this.minQueryLength) {
this.showResults();
}
});
this.input.addEventListener('touchend', (e) => {
e.stopPropagation();
this.input.focus();
});
this.input.addEventListener('touchstart', (e) => {
e.stopPropagation();
}, { passive: true });
const handleOutsideInteraction = (e) => {
if (!this.wrapper.contains(e.target)) {
const sidebarPanel = document.getElementById('ss-panel');
if (sidebarPanel && sidebarPanel.contains(this.wrapper) && sidebarPanel.contains(e.target)) {
return;
}
this.hideResults();
}
};
document.addEventListener('click', handleOutsideInteraction);
document.addEventListener('touchstart', handleOutsideInteraction, { passive: true });
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') this.hideResults();
});
}
updateClearBtn() {
const show = this.input.value.length >= this.minQueryLength;
if (this.clearBtn) this.clearBtn.classList.toggle('hidden', !show);
if (this.submitBtn) this.submitBtn.classList.toggle('hidden', show);
}
handleInput(query) {
const trimmedQuery = query.trim();
if (this.debounceTimer) clearTimeout(this.debounceTimer);
if (trimmedQuery.length {
this.fetchSearchData(trimmedQuery);
}, this.debounceDelay);
}
async fetchSearchData(query) {
if (this.cache.has(query)) {
const cached = this.cache.get(query);
this.setLoadingState(false);
this.renderResults(cached.results, query, cached.recommended);
return;
}
if (this.currentRequest) {
this.currentRequest.abort();
this.currentRequest = null;
}
const requestId = ++this.requestId;
const controller = new AbortController();
this.currentRequest = controller;
const baseUrl = window.Shopify?.routes?.root || '/';
const apiUrl = `${baseUrl}search/suggest.json?q=${encodeURIComponent(query)}&resources[type]=product,query&resources[limit]=5&resources[limit_scope]=each`;
try {
const response = await fetch(apiUrl, {
signal: controller.signal,
headers: { 'Accept': 'application/json' }
});
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
if (requestId !== this.requestId) return;
this.currentRequest = null;
const results = data.resources?.results || {};
if (this.cache.size > 50) this.cache.clear();
this.cache.set(query, { results, recommended: null });
this.setLoadingState(false);
this.renderResults(results, query, null);
} catch (error) {
if (error.name === 'AbortError') return;
if (requestId !== this.requestId) return;
console.error('Predictive search error:', error);
this.setLoadingState(false);
this.showError();
}
}
async fetchRecommendations(productId) {
try {
const baseUrl = window.Shopify?.routes?.root || '/';
const url = `${baseUrl}recommendations/products.json?product_id=${productId}&limit=6&intent=related`;
const response = await fetch(url, { headers: { 'Accept': 'application/json' } });
if (!response.ok) return [];
const data = await response.json();
return (data.products || [])
.filter(p => {
const tags = (p.tags || []).map(t => t.toLowerCase());
return !tags.includes('searchnise_ignore') && !tags.includes('search_hide');
})
.slice(0, 3);
} catch (e) {
return [];
}
}
async addToCart(variantId, btn) {
btn.setAttribute('data-loading', '');
btn.textContent = 'Adding...';
try {
const response = await fetch('/cart/add.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
body: JSON.stringify({ id: variantId, quantity: 1 })
});
if (!response.ok) throw new Error('Failed to add to cart');
btn.removeAttribute('data-loading');
btn.setAttribute('data-added', '');
btn.textContent = 'Added!';
document.dispatchEvent(new CustomEvent('cart:refresh'));
setTimeout(() => {
btn.removeAttribute('data-added');
btn.textContent = 'Add to Cart';
}, 2000);
} catch (e) {
btn.removeAttribute('data-loading');
btn.textContent = 'Add to Cart';
console.error('ATC error:', e);
}
}
bindAtcButtons() {
this.resultsContent.querySelectorAll('.atc-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
e.preventDefault();
const variantId = btn.dataset.variantId;
if (variantId) this.addToCart(variantId, btn);
});
});
}
renderResults(results, query, preloadedRecommended) {
if (!results || ((!results.products || results.products.length === 0) && (!results.queries || results.queries.length === 0))) {
this.resultsContent.innerHTML = `
No results found for "${this.escapeHtml(query)}"
`;
this.showResults();
return;
}
const products = (results.products || [])
.filter(p => {
const tags = (p.tags || []).map(t => t.toLowerCase());
return !tags.includes('searchnise_ignore') && !tags.includes('search_hide');
})
.slice(0, 4);
const queries = (results.queries || []).slice(0, 4);
const firstProductId = products.length > 0 ? products[0].id : null;
let html = '';
if (products.length > 0) {
html += ``;
products.forEach(product => {
html += this.renderMatchedProduct(product);
});
html += `
`;
}
if (queries.length > 0) {
html += `
Top Searches
- ${SEARCH_ICON}
${queries.map(q => this.renderQueryItem(q)).join('')}
`;
}
const searchUrl = (window.Shopify?.routes?.root || '/') + `search?q=${encodeURIComponent(query)}&type=product`;
html += `
View all results for “${this.escapeHtml(query)}”
`;
if (firstProductId) {
if (preloadedRecommended && preloadedRecommended.length > 0) {
html += this.renderRecommendedSection(preloadedRecommended);
} else if (preloadedRecommended === null) {
html += `
`;
}
}
this.resultsContent.innerHTML = html;
this.showResults();
this.bindAtcButtons();
if (firstProductId && preloadedRecommended === null) {
this.fetchAndPatchRecommendations(firstProductId, query);
}
}
renderMatchedProduct(product) {
const imgUrl = product.featured_image?.url || product.image || '';
const imgSized = imgUrl ? imgUrl.replace(/(\.[a-z]+)(\?.*)?$/i, '_220x220$1$2') : '';
const price = this.formatPrice(product.price, product.price_min, product.price_max);
const isSingleVariant = !product.variants || product.variants.length
${imgSized
? `
`
: `
`
}
${title}
${price ? `${price}
` : ''}
View Product
`;
}
renderSuggestedProduct(product) {
const imgUrl = product.featured_image?.src || product.featured_image?.url || product.images?.[0] || '';
const imgSized = imgUrl ? imgUrl.replace(/(\.[a-z]+)(\?.*)?$/i, '_300x300$1$2') : '';
const productUrl = this.escapeHtml(product.url || `/products/${product.handle}`);
const title = this.escapeHtml(product.title || '');
return `
${imgSized
? `
`
: `
`
}
${title}
`;
}
renderQueryItem(item) {
const queryText = item.styled_text || this.escapeHtml(item.text || '');
const queryUrl = this.escapeHtml(item.url || '#');
return `
${queryText}
`;
}
renderRecommendedSection(recommended) {
return `
Suggested Products
${recommended.map(p => this.renderSuggestedProduct(p)).join('')}
`;
}
async fetchAndPatchRecommendations(productId, query) {
const recommended = await this.fetchRecommendations(productId);
if (query !== this.currentQuery) return;
if (this.cache.has(query)) {
this.cache.get(query).recommended = recommended;
}
const slot = this.resultsContent.querySelector('[data-recommendations-slot]');
if (!slot) return;
if (recommended.length > 0) {
slot.outerHTML = this.renderRecommendedSection(recommended);
} else {
slot.remove();
}
}
setLoadingState(loading) {
this.resultsContainer.classList.toggle('is-loading', loading);
if (loading && !this.resultsContainer.classList.contains('show')) {
this.showResults();
}
}
formatPrice(price, priceMin, priceMax) {
if (!price && !priceMin && !priceMax) return '';
const formatCurrency = (amount) => {
if (window.Shopify?.formatMoney) {
return window.Shopify.formatMoney(amount, window.Shopify.money_format || '$');
}
const currency = window.Shopify?.currency?.active || 'USD';
return new Intl.NumberFormat('en-US', { style: 'currency', currency }).format(amount);
};
if (priceMin && priceMax && priceMin !== priceMax) {
return `${formatCurrency(priceMin)} – ${formatCurrency(priceMax)}`;
}
return formatCurrency(price || priceMin || priceMax);
}
escapeHtml(text) {
if (text == null) return '';
const div = document.createElement('div');
div.textContent = String(text);
return div.innerHTML;
}
showError() {
this.resultsContent.innerHTML = `
Unable to load results. Please try again.
`;
this.showResults();
}
showResults() {
this.resultsContainer.classList.remove('hidden');
this.resultsContainer.classList.add('show');
}
hideResults() {
this.resultsContainer.classList.add('hidden');
this.resultsContainer.classList.remove('show');
}
};
} // end if (!window.MomentousPredictiveSearch)
function initPredictiveSearch() {
document.querySelectorAll('[data-search-form]').forEach(function(wrapper) {
if (!wrapper.__predictiveSearch) {
wrapper.__predictiveSearch = new window.MomentousPredictiveSearch(wrapper);
}
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initPredictiveSearch);
} else {
initPredictiveSearch();
}
})();
Recommended Products
Creatine - 60 Servings
£27.00
View Product
Creatine - 90 Servings
£33.00
View Product
Creatine Chews 150-Count
£39.00
View Product
#ss-backdrop {
display: none;
position: fixed;
inset: 0;
background: rgba(0,0,0,0.45);
z-index: 400;
}
#ss-panel {
display: flex;
flex-direction: column;
position: fixed;
top: 0;
right: 0;
bottom: 0;
width: 440px;
max-width: 100%;
background: #fff;
z-index: 401;
transform: translateX(100%);
transition: transform 0.3s ease;
box-shadow: -4px 0 24px rgba(0,0,0,0.1);
}
#ss-panel.open,
#ss-backdrop.open {
display: flex; /* backdrop uses display:block via override below */
}
#ss-backdrop.open { display: block; }
#ss-panel.open { transform: translateX(0); }
#ss-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px 20px;
border-bottom: 1px solid #e5e5e5;
flex-shrink: 0;
}
#ss-title {
font-size: 17px;
font-weight: 600;
color: #171717;
}
#ss-header button {
background: none;
border: none;
cursor: pointer;
padding: 4px;
color: #555;
line-height: 0;
}
#ss-body {
flex: 1;
min-height: 0;
overflow-y: auto;
padding: 18px 20px;
-webkit-overflow-scrolling: touch;
}
/* Results appear inline, not as a dropdown */
#ss-panel .search-form-wrapper { isolation: auto; }
#ss-panel .search-form__results {
position: static !important;
width: 100% !important;
border: none !important;
box-shadow: none !important;
border-radius: 0 !important;
margin-top: 10px !important;
}
#ss-panel .search-form__results-content {
padding: 0 !important;
}
/* Recommended */
#ss-recommended { margin-top: 20px; }
#ss-recommended-label {
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: #757575;
margin: 0 0 12px;
}
.ss-rec-item {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
border: 1px solid #e5e5e5;
border-radius: 8px;
text-decoration: none;
margin-bottom: 8px;
transition: background 0.15s;
}
.ss-rec-item:hover { background: #fafafa; }
.ss-rec-item img,
.ss-rec-img-placeholder {
width: 72px;
height: 72px;
border-radius: 6px;
object-fit: cover;
flex-shrink: 0;
background: #f0f0f0;
}
.ss-rec-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 4px;
}
.ss-rec-title {
font-size: 13px;
font-weight: 600;
color: #171717;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.ss-rec-price {
font-size: 13px;
color: #737373;
}
#ss-recommended.hidden { display: none; }
var _ssScrollY = 0;
function openSearchSidebar() {
_ssScrollY = window.pageYOffset || document.documentElement.scrollTop;
document.body.style.position = 'fixed';
document.body.style.top = '-' + _ssScrollY + 'px';
document.body.style.width = '100%';
document.getElementById('ss-panel').classList.add('open');
document.getElementById('ss-backdrop').classList.add('open');
setTimeout(function() {
var input = document.querySelector('#ss-panel [data-search-input]');
if (input) input.focus();
}, 320);
}
function closeSearchSidebar() {
document.getElementById('ss-panel').classList.remove('open');
document.getElementById('ss-backdrop').classList.remove('open');
document.body.style.position = '';
document.body.style.top = '';
document.body.style.width = '';
window.scrollTo(0, _ssScrollY);
}
// Hide recommended when typing, show when empty
document.addEventListener('DOMContentLoaded', function() {
var input = document.querySelector('#ss-panel [data-search-input]');
var rec = document.getElementById('ss-recommended');
if (!input || !rec) return;
input.addEventListener('input', function() {
if (input.value.trim().length > 0) {
rec.classList.add('hidden');
} else {
rec.classList.remove('hidden');
}
});
// Clear button also restores recommended
var clearBtn = document.querySelector('#ss-panel [data-search-clear]');
if (clearBtn) {
clearBtn.addEventListener('click', function() {
setTimeout(function() { rec.classList.remove('hidden'); }, 20);
});
}
});
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') closeSearchSidebar();
});
.favicon {display: block;}
.recharge-theme {
/* App */
--recharge-app-background: #F9F8F4;
--recharge-app-container: 1200px;
--recharge-app-vertical-padding: 32px;
/* Brand colors */
--recharge-color-brand: #467C99;
/* Tints */
--recharge-color-brand-120: #38637a;
--recharge-color-brand-20: #6b96ad;
--recharge-color-brand-40: #90b0c2;
--recharge-color-brand-60: #b5cbd6;
--recharge-color-brand-75: #d1dee6;
--recharge-color-brand-85: #e3ebf0;
/* Neutral */
--recharge-color-neutral: hsl(201, 35%, 7%);
--recharge-color-neutral-80: hsl(201, 7%, 25%);
--recharge-color-neutral-70: hsl(201, 5%, 35%);
--recharge-color-neutral-40: hsl(201, 3%, 63%);
--recharge-color-neutral-10: hsl(201, 2%, 91%);
/* Links */
--recharge-button-secondary: #467C99;
--recharge-button-secondary-120: #38637a;
--recharge-button-secondary-60: #90b0c2;
/* Images */
--recharge-images-ratio: 1;
/* Cards */
--recharge-cards-background: #FFFFFF;
--recharge-cards-border-color: RGBA(0,0,0,0);
/* Fonts */
--recharge-typography-scale: 16px;
--recharge-typography-size-1: calc(3 * var(--recharge-typography-scale));
--recharge-typography-size-2: calc(2.25 * var(--recharge-typography-scale));
--recharge-typography-size-3: calc(1.625 * var(--recharge-typography-scale));
--recharge-typography-size-4: calc(1.25 * var(--recharge-typography-scale));
--recharge-typography-size-5: calc(1 * var(--recharge-typography-scale));
--recharge-typography-size-6: calc(.875 * var(--recharge-typography-scale));
/** Text **/
--recharge-typography-light: #FFFFFF;
--recharge-typography-primary: var(--recharge-color-neutral);
--recharge-typography-secondary: var(--recharge-color-neutral-70);
/* Corners */
--recharge-corners-radius: 8px;
--recharge-button-border-radius: 8px;
/* Views */
--recharge-views-background: #F9F8F4;
/* Buttons */
--recharge-button-font-family: inherit;
--recharge-button-brand: var(--recharge-color-brand);
--recharge-button-color: #FFFFFF;
}
(function() {
var initialCartState = [];
var previousCartStateKey = 'previousCartState';
var removedItemsKey = 'removedItemsState';
var previousCartState = [];
try {
previousCartState = JSON.parse(localStorage.getItem(previousCartStateKey) || '[]');
} catch (e) {
previousCartState = [];
}
var removedItems = previousCartState.filter(function(prevItem) {
return !initialCartState.some(function(currItem) {
return currItem.id === prevItem.id;
});
});
if (removedItems.length) {
localStorage.setItem(removedItemsKey, JSON.stringify(removedItems));
}
localStorage.setItem(previousCartStateKey, JSON.stringify(initialCartState));
})();
(function() {
var productId = "8144660857015";
var productTitle = "Vegan Omega-3";
var productHandle = "vegan-omega-3";
var marketId = "21022965943";
var storageKey = 'oe_viewedProducts';
function trackViewedProducts() {
if (!productId) return;
var viewedProducts = [];
try {
viewedProducts = JSON.parse(localStorage.getItem(storageKey) || '[]');
} catch (e) {
viewedProducts = [];
}
viewedProducts = viewedProducts.filter(function(p) { return p.id !== productId; });
viewedProducts.unshift({
id: productId,
title: productTitle,
handle: productHandle,
viewedAt: new Date().toISOString()
});
viewedProducts = viewedProducts.slice(0, 50);
localStorage.setItem(storageKey, JSON.stringify(viewedProducts));
updateCartAttributes();
}
function updateCartAttributes() {
var viewedProducts = [];
try {
viewedProducts = JSON.parse(localStorage.getItem(storageKey) || '[]');
} catch (e) {
return;
}
var productIds = viewedProducts.map(function(p) { return p.id; }).slice(0, 10).join(',');
var cartAttributes = {};
if (productIds) cartAttributes['__upsell_recently_viewed_products'] = productIds;
if (marketId) cartAttributes['__upsell_market_id'] = marketId;
if (Object.keys(cartAttributes).length === 0) return;
fetch(window.Shopify.routes.root + 'cart/update.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ attributes: cartAttributes })
}).catch(function() {});
}
trackViewedProducts();
window.addEventListener('popstate', trackViewedProducts);
})();
window['ShopifyForms'] = {
...window['ShopifyForms'],
currentPageType: "product"
}; Price History
Loading...
:
0">
{{ variant.title }}
{{ value }}
0">
0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
:
1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
{{ value }}
Select your purchase method
Out of Stock Protection
{{ frequencyLabel(frequency, product.subscription_interval) }}
One-Time Purchase
Receive Once
Add to Bag
Price
View Product
el.classList.remove('show')); $event.target.closest('.rebuy-product-block').querySelector('.rebuy-product-options').classList.add('show')"
type="button">
Price
Powered by Rebuy
0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
:
1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
{{ value }}
Select your purchase method
Out of Stock Protection
{{ frequencyLabel(frequency, product.subscription_interval) }}
One-Time Purchase
Receive Once
Add to Bag
Price
View Product
el.classList.remove('show')); $event.target.closest('.rebuy-product-block').querySelector('.rebuy-product-options').classList.add('show')"
type="button">
Price
Powered by Rebuy
Search
Search for products, collections, pages, and articles
.search-form-wrapper {
position: relative;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
isolation: isolate;
}
.search-form__input:focus {
border: 1px solid #000;
}
.search-form__results {
width: 480px;
border-radius: 10px;
border: 1px solid #E5E7EB;
background: #FFF;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
top: 100%;
}
@media(max-width: 640px) {
.search-form__results {
width: 100%;
border-radius: 10px;
border: none;
margin-top: 0;
}
}
.search-form__results.show {
display: block;
}
.search-result-divider {
border-top: 1px solid var(--grey-100, #e5e5e5);
}
.search-product-img {
width: 5rem;
height: 5rem;
}
@media(max-width: 640px) {
.search-product-img {
width: 70px;
height: 70px;
}
}
.atc-btn[data-loading] {
opacity: 0.6;
pointer-events: none;
}
.atc-btn[data-added] {
background-color: #2d7a3a;
}
.search-form__results.is-loading::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 2px;
background: linear-gradient(90deg, transparent 0%, var(--grey-900, #171717) 50%, transparent 100%);
background-size: 200% 100%;
animation: search-loading-shimmer 1.2s ease-in-out infinite;
pointer-events: none;
}
.search-form__results-content {
max-height: calc(100vh - 170px);
overflow-y: auto;
-webkit-overflow-scrolling: touch;
overscroll-behavior: contain;
}
.search-result-divider {
position: sticky;
bottom: 0;
background-color: #FFF;
z-index: 10;
}
@keyframes search-loading-shimmer {
0% { background-position: -100% 0; }
100% { background-position: 200% 0; }
}
@media(max-width: 640px) {
.search-product-row {
flex-direction: column;
align-items: flex-start !important;
}
.search-recommended-section {
display: none;
}
}
.query-item-text *,
.query-item-text {
white-space: nowrap;
}
.query-item-text mark {
background-color: #FFFADF;
color: inherit;
border-radius: 2px;
}
.search-form__clear-btn {
background: none;
border: none;
padding: 0;
cursor: pointer;
line-height: 0;
color: var(--grey-400, #999);
}
.search-form__clear-btn:hover svg path {
stroke: var(--grey-700, #404040);
}
(function() {
'use strict';
const SEARCH_ICON = `
`;
// Guard: only define the class once even if snippet is rendered multiple times
if (!window.MomentousPredictiveSearch) {
window.MomentousPredictiveSearch = class {
constructor(wrapper) {
this.wrapper = wrapper;
this.input = wrapper.querySelector('[data-search-input]');
this.resultsContainer = wrapper.querySelector('[data-search-results]');
this.resultsContent = wrapper.querySelector('[data-search-results-content]');
this.form = wrapper.querySelector('.search-form');
this.submitBtn = wrapper.querySelector('[data-search-submit]');
this.clearBtn = wrapper.querySelector('[data-search-clear]');
this.debounceTimer = null;
this.currentRequest = null;
this.currentQuery = '';
this.minQueryLength = 2;
this.debounceDelay = 300;
this.cache = new Map();
this.requestId = 0;
this.init();
}
init() {
this.input.addEventListener('input', (e) => {
this.handleInput(e.target.value);
this.updateClearBtn();
});
if (this.clearBtn) {
this.clearBtn.addEventListener('click', () => {
this.input.value = '';
this.currentQuery = '';
this.hideResults();
this.updateClearBtn();
this.input.focus();
});
}
this.input.addEventListener('focus', () => {
if (this.input.value.length >= this.minQueryLength) {
this.showResults();
}
});
this.input.addEventListener('touchend', (e) => {
e.stopPropagation();
this.input.focus();
});
this.input.addEventListener('touchstart', (e) => {
e.stopPropagation();
}, { passive: true });
const handleOutsideInteraction = (e) => {
if (!this.wrapper.contains(e.target)) {
const sidebarPanel = document.getElementById('ss-panel');
if (sidebarPanel && sidebarPanel.contains(this.wrapper) && sidebarPanel.contains(e.target)) {
return;
}
this.hideResults();
}
};
document.addEventListener('click', handleOutsideInteraction);
document.addEventListener('touchstart', handleOutsideInteraction, { passive: true });
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') this.hideResults();
});
}
updateClearBtn() {
const show = this.input.value.length >= this.minQueryLength;
if (this.clearBtn) this.clearBtn.classList.toggle('hidden', !show);
if (this.submitBtn) this.submitBtn.classList.toggle('hidden', show);
}
handleInput(query) {
const trimmedQuery = query.trim();
if (this.debounceTimer) clearTimeout(this.debounceTimer);
if (trimmedQuery.length {
this.fetchSearchData(trimmedQuery);
}, this.debounceDelay);
}
async fetchSearchData(query) {
if (this.cache.has(query)) {
const cached = this.cache.get(query);
this.setLoadingState(false);
this.renderResults(cached.results, query, cached.recommended);
return;
}
if (this.currentRequest) {
this.currentRequest.abort();
this.currentRequest = null;
}
const requestId = ++this.requestId;
const controller = new AbortController();
this.currentRequest = controller;
const baseUrl = window.Shopify?.routes?.root || '/';
const apiUrl = `${baseUrl}search/suggest.json?q=${encodeURIComponent(query)}&resources[type]=product,query&resources[limit]=5&resources[limit_scope]=each`;
try {
const response = await fetch(apiUrl, {
signal: controller.signal,
headers: { 'Accept': 'application/json' }
});
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
if (requestId !== this.requestId) return;
this.currentRequest = null;
const results = data.resources?.results || {};
if (this.cache.size > 50) this.cache.clear();
this.cache.set(query, { results, recommended: null });
this.setLoadingState(false);
this.renderResults(results, query, null);
} catch (error) {
if (error.name === 'AbortError') return;
if (requestId !== this.requestId) return;
console.error('Predictive search error:', error);
this.setLoadingState(false);
this.showError();
}
}
async fetchRecommendations(productId) {
try {
const baseUrl = window.Shopify?.routes?.root || '/';
const url = `${baseUrl}recommendations/products.json?product_id=${productId}&limit=6&intent=related`;
const response = await fetch(url, { headers: { 'Accept': 'application/json' } });
if (!response.ok) return [];
const data = await response.json();
return (data.products || [])
.filter(p => {
const tags = (p.tags || []).map(t => t.toLowerCase());
return !tags.includes('searchnise_ignore') && !tags.includes('search_hide');
})
.slice(0, 3);
} catch (e) {
return [];
}
}
async addToCart(variantId, btn) {
btn.setAttribute('data-loading', '');
btn.textContent = 'Adding...';
try {
const response = await fetch('/cart/add.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
body: JSON.stringify({ id: variantId, quantity: 1 })
});
if (!response.ok) throw new Error('Failed to add to cart');
btn.removeAttribute('data-loading');
btn.setAttribute('data-added', '');
btn.textContent = 'Added!';
document.dispatchEvent(new CustomEvent('cart:refresh'));
setTimeout(() => {
btn.removeAttribute('data-added');
btn.textContent = 'Add to Cart';
}, 2000);
} catch (e) {
btn.removeAttribute('data-loading');
btn.textContent = 'Add to Cart';
console.error('ATC error:', e);
}
}
bindAtcButtons() {
this.resultsContent.querySelectorAll('.atc-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
e.preventDefault();
const variantId = btn.dataset.variantId;
if (variantId) this.addToCart(variantId, btn);
});
});
}
renderResults(results, query, preloadedRecommended) {
if (!results || ((!results.products || results.products.length === 0) && (!results.queries || results.queries.length === 0))) {
this.resultsContent.innerHTML = `
No results found for "${this.escapeHtml(query)}"
`;
this.showResults();
return;
}
const products = (results.products || [])
.filter(p => {
const tags = (p.tags || []).map(t => t.toLowerCase());
return !tags.includes('searchnise_ignore') && !tags.includes('search_hide');
})
.slice(0, 4);
const queries = (results.queries || []).slice(0, 4);
const firstProductId = products.length > 0 ? products[0].id : null;
let html = '';
if (products.length > 0) {
html += ``;
products.forEach(product => {
html += this.renderMatchedProduct(product);
});
html += `
`;
}
if (queries.length > 0) {
html += `
Top Searches
- ${SEARCH_ICON}
${queries.map(q => this.renderQueryItem(q)).join('')}
`;
}
const searchUrl = (window.Shopify?.routes?.root || '/') + `search?q=${encodeURIComponent(query)}&type=product`;
html += `
View all results for “${this.escapeHtml(query)}”
`;
if (firstProductId) {
if (preloadedRecommended && preloadedRecommended.length > 0) {
html += this.renderRecommendedSection(preloadedRecommended);
} else if (preloadedRecommended === null) {
html += `
`;
}
}
this.resultsContent.innerHTML = html;
this.showResults();
this.bindAtcButtons();
if (firstProductId && preloadedRecommended === null) {
this.fetchAndPatchRecommendations(firstProductId, query);
}
}
renderMatchedProduct(product) {
const imgUrl = product.featured_image?.url || product.image || '';
const imgSized = imgUrl ? imgUrl.replace(/(\.[a-z]+)(\?.*)?$/i, '_220x220$1$2') : '';
const price = this.formatPrice(product.price, product.price_min, product.price_max);
const isSingleVariant = !product.variants || product.variants.length
${imgSized
? `
`
: `
`
}
${title}
${price ? `${price}
` : ''}
View Product
`;
}
renderSuggestedProduct(product) {
const imgUrl = product.featured_image?.src || product.featured_image?.url || product.images?.[0] || '';
const imgSized = imgUrl ? imgUrl.replace(/(\.[a-z]+)(\?.*)?$/i, '_300x300$1$2') : '';
const productUrl = this.escapeHtml(product.url || `/products/${product.handle}`);
const title = this.escapeHtml(product.title || '');
return `
${imgSized
? `
`
: `
`
}
${title}
`;
}
renderQueryItem(item) {
const queryText = item.styled_text || this.escapeHtml(item.text || '');
const queryUrl = this.escapeHtml(item.url || '#');
return `
${queryText}
`;
}
renderRecommendedSection(recommended) {
return `
Suggested Products
${recommended.map(p => this.renderSuggestedProduct(p)).join('')}
`;
}
async fetchAndPatchRecommendations(productId, query) {
const recommended = await this.fetchRecommendations(productId);
if (query !== this.currentQuery) return;
if (this.cache.has(query)) {
this.cache.get(query).recommended = recommended;
}
const slot = this.resultsContent.querySelector('[data-recommendations-slot]');
if (!slot) return;
if (recommended.length > 0) {
slot.outerHTML = this.renderRecommendedSection(recommended);
} else {
slot.remove();
}
}
setLoadingState(loading) {
this.resultsContainer.classList.toggle('is-loading', loading);
if (loading && !this.resultsContainer.classList.contains('show')) {
this.showResults();
}
}
formatPrice(price, priceMin, priceMax) {
if (!price && !priceMin && !priceMax) return '';
const formatCurrency = (amount) => {
if (window.Shopify?.formatMoney) {
return window.Shopify.formatMoney(amount, window.Shopify.money_format || '$');
}
const currency = window.Shopify?.currency?.active || 'USD';
return new Intl.NumberFormat('en-US', { style: 'currency', currency }).format(amount);
};
if (priceMin && priceMax && priceMin !== priceMax) {
return `${formatCurrency(priceMin)} – ${formatCurrency(priceMax)}`;
}
return formatCurrency(price || priceMin || priceMax);
}
escapeHtml(text) {
if (text == null) return '';
const div = document.createElement('div');
div.textContent = String(text);
return div.innerHTML;
}
showError() {
this.resultsContent.innerHTML = `
Unable to load results. Please try again.
`;
this.showResults();
}
showResults() {
this.resultsContainer.classList.remove('hidden');
this.resultsContainer.classList.add('show');
}
hideResults() {
this.resultsContainer.classList.add('hidden');
this.resultsContainer.classList.remove('show');
}
};
} // end if (!window.MomentousPredictiveSearch)
function initPredictiveSearch() {
document.querySelectorAll('[data-search-form]').forEach(function(wrapper) {
if (!wrapper.__predictiveSearch) {
wrapper.__predictiveSearch = new window.MomentousPredictiveSearch(wrapper);
}
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initPredictiveSearch);
} else {
initPredictiveSearch();
}
})();
Recommended Products
Creatine - 60 Servings
£27.00
View Product
Creatine - 90 Servings
£33.00
View Product
Creatine Chews 150-Count
£39.00
View Product
#ss-backdrop {
display: none;
position: fixed;
inset: 0;
background: rgba(0,0,0,0.45);
z-index: 400;
}
#ss-panel {
display: flex;
flex-direction: column;
position: fixed;
top: 0;
right: 0;
bottom: 0;
width: 440px;
max-width: 100%;
background: #fff;
z-index: 401;
transform: translateX(100%);
transition: transform 0.3s ease;
box-shadow: -4px 0 24px rgba(0,0,0,0.1);
}
#ss-panel.open,
#ss-backdrop.open {
display: flex; /* backdrop uses display:block via override below */
}
#ss-backdrop.open { display: block; }
#ss-panel.open { transform: translateX(0); }
#ss-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px 20px;
border-bottom: 1px solid #e5e5e5;
flex-shrink: 0;
}
#ss-title {
font-size: 17px;
font-weight: 600;
color: #171717;
}
#ss-header button {
background: none;
border: none;
cursor: pointer;
padding: 4px;
color: #555;
line-height: 0;
}
#ss-body {
flex: 1;
min-height: 0;
overflow-y: auto;
padding: 18px 20px;
-webkit-overflow-scrolling: touch;
}
/* Results appear inline, not as a dropdown */
#ss-panel .search-form-wrapper { isolation: auto; }
#ss-panel .search-form__results {
position: static !important;
width: 100% !important;
border: none !important;
box-shadow: none !important;
border-radius: 0 !important;
margin-top: 10px !important;
}
#ss-panel .search-form__results-content {
padding: 0 !important;
}
/* Recommended */
#ss-recommended { margin-top: 20px; }
#ss-recommended-label {
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: #757575;
margin: 0 0 12px;
}
.ss-rec-item {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
border: 1px solid #e5e5e5;
border-radius: 8px;
text-decoration: none;
margin-bottom: 8px;
transition: background 0.15s;
}
.ss-rec-item:hover { background: #fafafa; }
.ss-rec-item img,
.ss-rec-img-placeholder {
width: 72px;
height: 72px;
border-radius: 6px;
object-fit: cover;
flex-shrink: 0;
background: #f0f0f0;
}
.ss-rec-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 4px;
}
.ss-rec-title {
font-size: 13px;
font-weight: 600;
color: #171717;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.ss-rec-price {
font-size: 13px;
color: #737373;
}
#ss-recommended.hidden { display: none; }
var _ssScrollY = 0;
function openSearchSidebar() {
_ssScrollY = window.pageYOffset || document.documentElement.scrollTop;
document.body.style.position = 'fixed';
document.body.style.top = '-' + _ssScrollY + 'px';
document.body.style.width = '100%';
document.getElementById('ss-panel').classList.add('open');
document.getElementById('ss-backdrop').classList.add('open');
setTimeout(function() {
var input = document.querySelector('#ss-panel [data-search-input]');
if (input) input.focus();
}, 320);
}
function closeSearchSidebar() {
document.getElementById('ss-panel').classList.remove('open');
document.getElementById('ss-backdrop').classList.remove('open');
document.body.style.position = '';
document.body.style.top = '';
document.body.style.width = '';
window.scrollTo(0, _ssScrollY);
}
// Hide recommended when typing, show when empty
document.addEventListener('DOMContentLoaded', function() {
var input = document.querySelector('#ss-panel [data-search-input]');
var rec = document.getElementById('ss-recommended');
if (!input || !rec) return;
input.addEventListener('input', function() {
if (input.value.trim().length > 0) {
rec.classList.add('hidden');
} else {
rec.classList.remove('hidden');
}
});
// Clear button also restores recommended
var clearBtn = document.querySelector('#ss-panel [data-search-clear]');
if (clearBtn) {
clearBtn.addEventListener('click', function() {
setTimeout(function() { rec.classList.remove('hidden'); }, 20);
});
}
});
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') closeSearchSidebar();
});
.favicon {display: block;}
.recharge-theme {
/* App */
--recharge-app-background: #F9F8F4;
--recharge-app-container: 1200px;
--recharge-app-vertical-padding: 32px;
/* Brand colors */
--recharge-color-brand: #467C99;
/* Tints */
--recharge-color-brand-120: #38637a;
--recharge-color-brand-20: #6b96ad;
--recharge-color-brand-40: #90b0c2;
--recharge-color-brand-60: #b5cbd6;
--recharge-color-brand-75: #d1dee6;
--recharge-color-brand-85: #e3ebf0;
/* Neutral */
--recharge-color-neutral: hsl(201, 35%, 7%);
--recharge-color-neutral-80: hsl(201, 7%, 25%);
--recharge-color-neutral-70: hsl(201, 5%, 35%);
--recharge-color-neutral-40: hsl(201, 3%, 63%);
--recharge-color-neutral-10: hsl(201, 2%, 91%);
/* Links */
--recharge-button-secondary: #467C99;
--recharge-button-secondary-120: #38637a;
--recharge-button-secondary-60: #90b0c2;
/* Images */
--recharge-images-ratio: 1;
/* Cards */
--recharge-cards-background: #FFFFFF;
--recharge-cards-border-color: RGBA(0,0,0,0);
/* Fonts */
--recharge-typography-scale: 16px;
--recharge-typography-size-1: calc(3 * var(--recharge-typography-scale));
--recharge-typography-size-2: calc(2.25 * var(--recharge-typography-scale));
--recharge-typography-size-3: calc(1.625 * var(--recharge-typography-scale));
--recharge-typography-size-4: calc(1.25 * var(--recharge-typography-scale));
--recharge-typography-size-5: calc(1 * var(--recharge-typography-scale));
--recharge-typography-size-6: calc(.875 * var(--recharge-typography-scale));
/** Text **/
--recharge-typography-light: #FFFFFF;
--recharge-typography-primary: var(--recharge-color-neutral);
--recharge-typography-secondary: var(--recharge-color-neutral-70);
/* Corners */
--recharge-corners-radius: 8px;
--recharge-button-border-radius: 8px;
/* Views */
--recharge-views-background: #F9F8F4;
/* Buttons */
--recharge-button-font-family: inherit;
--recharge-button-brand: var(--recharge-color-brand);
--recharge-button-color: #FFFFFF;
}
(function() {
var initialCartState = [];
var previousCartStateKey = 'previousCartState';
var removedItemsKey = 'removedItemsState';
var previousCartState = [];
try {
previousCartState = JSON.parse(localStorage.getItem(previousCartStateKey) || '[]');
} catch (e) {
previousCartState = [];
}
var removedItems = previousCartState.filter(function(prevItem) {
return !initialCartState.some(function(currItem) {
return currItem.id === prevItem.id;
});
});
if (removedItems.length) {
localStorage.setItem(removedItemsKey, JSON.stringify(removedItems));
}
localStorage.setItem(previousCartStateKey, JSON.stringify(initialCartState));
})();
(function() {
var productId = "8144660857015";
var productTitle = "Vegan Omega-3";
var productHandle = "vegan-omega-3";
var marketId = "21022965943";
var storageKey = 'oe_viewedProducts';
function trackViewedProducts() {
if (!productId) return;
var viewedProducts = [];
try {
viewedProducts = JSON.parse(localStorage.getItem(storageKey) || '[]');
} catch (e) {
viewedProducts = [];
}
viewedProducts = viewedProducts.filter(function(p) { return p.id !== productId; });
viewedProducts.unshift({
id: productId,
title: productTitle,
handle: productHandle,
viewedAt: new Date().toISOString()
});
viewedProducts = viewedProducts.slice(0, 50);
localStorage.setItem(storageKey, JSON.stringify(viewedProducts));
updateCartAttributes();
}
function updateCartAttributes() {
var viewedProducts = [];
try {
viewedProducts = JSON.parse(localStorage.getItem(storageKey) || '[]');
} catch (e) {
return;
}
var productIds = viewedProducts.map(function(p) { return p.id; }).slice(0, 10).join(',');
var cartAttributes = {};
if (productIds) cartAttributes['__upsell_recently_viewed_products'] = productIds;
if (marketId) cartAttributes['__upsell_market_id'] = marketId;
if (Object.keys(cartAttributes).length === 0) return;
fetch(window.Shopify.routes.root + 'cart/update.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ attributes: cartAttributes })
}).catch(function() {});
}
trackViewedProducts();
window.addEventListener('popstate', trackViewedProducts);
})();
window['ShopifyForms'] = {
...window['ShopifyForms'],
currentPageType: "product"
}; Price History
Loading...
:
1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
{{ value }}
Select your purchase method
Out of Stock Protection
{{ frequencyLabel(frequency, product.subscription_interval) }}
One-Time Purchase
Receive Once
Add to Bag
Price
View Product
el.classList.remove('show')); $event.target.closest('.rebuy-product-block').querySelector('.rebuy-product-options').classList.add('show')"
type="button">
Price
Powered by Rebuy
0 ? 'is-visible' : 'is-hidden', 'widget-layout-' + currentLayout()]">
:
1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
{{ value }}
Select your purchase method
Out of Stock Protection
{{ frequencyLabel(frequency, product.subscription_interval) }}
One-Time Purchase
Receive Once
Add to Bag
Price
View Product
el.classList.remove('show')); $event.target.closest('.rebuy-product-block').querySelector('.rebuy-product-options').classList.add('show')"
type="button">
Price
Powered by Rebuy
Search
Search for products, collections, pages, and articles
.search-form-wrapper {
position: relative;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
isolation: isolate;
}
.search-form__input:focus {
border: 1px solid #000;
}
.search-form__results {
width: 480px;
border-radius: 10px;
border: 1px solid #E5E7EB;
background: #FFF;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
top: 100%;
}
@media(max-width: 640px) {
.search-form__results {
width: 100%;
border-radius: 10px;
border: none;
margin-top: 0;
}
}
.search-form__results.show {
display: block;
}
.search-result-divider {
border-top: 1px solid var(--grey-100, #e5e5e5);
}
.search-product-img {
width: 5rem;
height: 5rem;
}
@media(max-width: 640px) {
.search-product-img {
width: 70px;
height: 70px;
}
}
.atc-btn[data-loading] {
opacity: 0.6;
pointer-events: none;
}
.atc-btn[data-added] {
background-color: #2d7a3a;
}
.search-form__results.is-loading::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 2px;
background: linear-gradient(90deg, transparent 0%, var(--grey-900, #171717) 50%, transparent 100%);
background-size: 200% 100%;
animation: search-loading-shimmer 1.2s ease-in-out infinite;
pointer-events: none;
}
.search-form__results-content {
max-height: calc(100vh - 170px);
overflow-y: auto;
-webkit-overflow-scrolling: touch;
overscroll-behavior: contain;
}
.search-result-divider {
position: sticky;
bottom: 0;
background-color: #FFF;
z-index: 10;
}
@keyframes search-loading-shimmer {
0% { background-position: -100% 0; }
100% { background-position: 200% 0; }
}
@media(max-width: 640px) {
.search-product-row {
flex-direction: column;
align-items: flex-start !important;
}
.search-recommended-section {
display: none;
}
}
.query-item-text *,
.query-item-text {
white-space: nowrap;
}
.query-item-text mark {
background-color: #FFFADF;
color: inherit;
border-radius: 2px;
}
.search-form__clear-btn {
background: none;
border: none;
padding: 0;
cursor: pointer;
line-height: 0;
color: var(--grey-400, #999);
}
.search-form__clear-btn:hover svg path {
stroke: var(--grey-700, #404040);
}
(function() {
'use strict';
const SEARCH_ICON = `
`;
// Guard: only define the class once even if snippet is rendered multiple times
if (!window.MomentousPredictiveSearch) {
window.MomentousPredictiveSearch = class {
constructor(wrapper) {
this.wrapper = wrapper;
this.input = wrapper.querySelector('[data-search-input]');
this.resultsContainer = wrapper.querySelector('[data-search-results]');
this.resultsContent = wrapper.querySelector('[data-search-results-content]');
this.form = wrapper.querySelector('.search-form');
this.submitBtn = wrapper.querySelector('[data-search-submit]');
this.clearBtn = wrapper.querySelector('[data-search-clear]');
this.debounceTimer = null;
this.currentRequest = null;
this.currentQuery = '';
this.minQueryLength = 2;
this.debounceDelay = 300;
this.cache = new Map();
this.requestId = 0;
this.init();
}
init() {
this.input.addEventListener('input', (e) => {
this.handleInput(e.target.value);
this.updateClearBtn();
});
if (this.clearBtn) {
this.clearBtn.addEventListener('click', () => {
this.input.value = '';
this.currentQuery = '';
this.hideResults();
this.updateClearBtn();
this.input.focus();
});
}
this.input.addEventListener('focus', () => {
if (this.input.value.length >= this.minQueryLength) {
this.showResults();
}
});
this.input.addEventListener('touchend', (e) => {
e.stopPropagation();
this.input.focus();
});
this.input.addEventListener('touchstart', (e) => {
e.stopPropagation();
}, { passive: true });
const handleOutsideInteraction = (e) => {
if (!this.wrapper.contains(e.target)) {
const sidebarPanel = document.getElementById('ss-panel');
if (sidebarPanel && sidebarPanel.contains(this.wrapper) && sidebarPanel.contains(e.target)) {
return;
}
this.hideResults();
}
};
document.addEventListener('click', handleOutsideInteraction);
document.addEventListener('touchstart', handleOutsideInteraction, { passive: true });
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') this.hideResults();
});
}
updateClearBtn() {
const show = this.input.value.length >= this.minQueryLength;
if (this.clearBtn) this.clearBtn.classList.toggle('hidden', !show);
if (this.submitBtn) this.submitBtn.classList.toggle('hidden', show);
}
handleInput(query) {
const trimmedQuery = query.trim();
if (this.debounceTimer) clearTimeout(this.debounceTimer);
if (trimmedQuery.length {
this.fetchSearchData(trimmedQuery);
}, this.debounceDelay);
}
async fetchSearchData(query) {
if (this.cache.has(query)) {
const cached = this.cache.get(query);
this.setLoadingState(false);
this.renderResults(cached.results, query, cached.recommended);
return;
}
if (this.currentRequest) {
this.currentRequest.abort();
this.currentRequest = null;
}
const requestId = ++this.requestId;
const controller = new AbortController();
this.currentRequest = controller;
const baseUrl = window.Shopify?.routes?.root || '/';
const apiUrl = `${baseUrl}search/suggest.json?q=${encodeURIComponent(query)}&resources[type]=product,query&resources[limit]=5&resources[limit_scope]=each`;
try {
const response = await fetch(apiUrl, {
signal: controller.signal,
headers: { 'Accept': 'application/json' }
});
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
if (requestId !== this.requestId) return;
this.currentRequest = null;
const results = data.resources?.results || {};
if (this.cache.size > 50) this.cache.clear();
this.cache.set(query, { results, recommended: null });
this.setLoadingState(false);
this.renderResults(results, query, null);
} catch (error) {
if (error.name === 'AbortError') return;
if (requestId !== this.requestId) return;
console.error('Predictive search error:', error);
this.setLoadingState(false);
this.showError();
}
}
async fetchRecommendations(productId) {
try {
const baseUrl = window.Shopify?.routes?.root || '/';
const url = `${baseUrl}recommendations/products.json?product_id=${productId}&limit=6&intent=related`;
const response = await fetch(url, { headers: { 'Accept': 'application/json' } });
if (!response.ok) return [];
const data = await response.json();
return (data.products || [])
.filter(p => {
const tags = (p.tags || []).map(t => t.toLowerCase());
return !tags.includes('searchnise_ignore') && !tags.includes('search_hide');
})
.slice(0, 3);
} catch (e) {
return [];
}
}
async addToCart(variantId, btn) {
btn.setAttribute('data-loading', '');
btn.textContent = 'Adding...';
try {
const response = await fetch('/cart/add.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
body: JSON.stringify({ id: variantId, quantity: 1 })
});
if (!response.ok) throw new Error('Failed to add to cart');
btn.removeAttribute('data-loading');
btn.setAttribute('data-added', '');
btn.textContent = 'Added!';
document.dispatchEvent(new CustomEvent('cart:refresh'));
setTimeout(() => {
btn.removeAttribute('data-added');
btn.textContent = 'Add to Cart';
}, 2000);
} catch (e) {
btn.removeAttribute('data-loading');
btn.textContent = 'Add to Cart';
console.error('ATC error:', e);
}
}
bindAtcButtons() {
this.resultsContent.querySelectorAll('.atc-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
e.preventDefault();
const variantId = btn.dataset.variantId;
if (variantId) this.addToCart(variantId, btn);
});
});
}
renderResults(results, query, preloadedRecommended) {
if (!results || ((!results.products || results.products.length === 0) && (!results.queries || results.queries.length === 0))) {
this.resultsContent.innerHTML = `
No results found for "${this.escapeHtml(query)}"
`;
this.showResults();
return;
}
const products = (results.products || [])
.filter(p => {
const tags = (p.tags || []).map(t => t.toLowerCase());
return !tags.includes('searchnise_ignore') && !tags.includes('search_hide');
})
.slice(0, 4);
const queries = (results.queries || []).slice(0, 4);
const firstProductId = products.length > 0 ? products[0].id : null;
let html = '';
if (products.length > 0) {
html += ``;
products.forEach(product => {
html += this.renderMatchedProduct(product);
});
html += `
`;
}
if (queries.length > 0) {
html += `
Top Searches
- ${SEARCH_ICON}
${queries.map(q => this.renderQueryItem(q)).join('')}
`;
}
const searchUrl = (window.Shopify?.routes?.root || '/') + `search?q=${encodeURIComponent(query)}&type=product`;
html += `
View all results for “${this.escapeHtml(query)}”
`;
if (firstProductId) {
if (preloadedRecommended && preloadedRecommended.length > 0) {
html += this.renderRecommendedSection(preloadedRecommended);
} else if (preloadedRecommended === null) {
html += `
`;
}
}
this.resultsContent.innerHTML = html;
this.showResults();
this.bindAtcButtons();
if (firstProductId && preloadedRecommended === null) {
this.fetchAndPatchRecommendations(firstProductId, query);
}
}
renderMatchedProduct(product) {
const imgUrl = product.featured_image?.url || product.image || '';
const imgSized = imgUrl ? imgUrl.replace(/(\.[a-z]+)(\?.*)?$/i, '_220x220$1$2') : '';
const price = this.formatPrice(product.price, product.price_min, product.price_max);
const isSingleVariant = !product.variants || product.variants.length
${imgSized
? `
`
: `
`
}
${title}
${price ? `${price}
` : ''}
View Product
`;
}
renderSuggestedProduct(product) {
const imgUrl = product.featured_image?.src || product.featured_image?.url || product.images?.[0] || '';
const imgSized = imgUrl ? imgUrl.replace(/(\.[a-z]+)(\?.*)?$/i, '_300x300$1$2') : '';
const productUrl = this.escapeHtml(product.url || `/products/${product.handle}`);
const title = this.escapeHtml(product.title || '');
return `
${imgSized
? `
`
: `
`
}
${title}
`;
}
renderQueryItem(item) {
const queryText = item.styled_text || this.escapeHtml(item.text || '');
const queryUrl = this.escapeHtml(item.url || '#');
return `
${queryText}
`;
}
renderRecommendedSection(recommended) {
return `
Suggested Products
${recommended.map(p => this.renderSuggestedProduct(p)).join('')}
`;
}
async fetchAndPatchRecommendations(productId, query) {
const recommended = await this.fetchRecommendations(productId);
if (query !== this.currentQuery) return;
if (this.cache.has(query)) {
this.cache.get(query).recommended = recommended;
}
const slot = this.resultsContent.querySelector('[data-recommendations-slot]');
if (!slot) return;
if (recommended.length > 0) {
slot.outerHTML = this.renderRecommendedSection(recommended);
} else {
slot.remove();
}
}
setLoadingState(loading) {
this.resultsContainer.classList.toggle('is-loading', loading);
if (loading && !this.resultsContainer.classList.contains('show')) {
this.showResults();
}
}
formatPrice(price, priceMin, priceMax) {
if (!price && !priceMin && !priceMax) return '';
const formatCurrency = (amount) => {
if (window.Shopify?.formatMoney) {
return window.Shopify.formatMoney(amount, window.Shopify.money_format || '$');
}
const currency = window.Shopify?.currency?.active || 'USD';
return new Intl.NumberFormat('en-US', { style: 'currency', currency }).format(amount);
};
if (priceMin && priceMax && priceMin !== priceMax) {
return `${formatCurrency(priceMin)} – ${formatCurrency(priceMax)}`;
}
return formatCurrency(price || priceMin || priceMax);
}
escapeHtml(text) {
if (text == null) return '';
const div = document.createElement('div');
div.textContent = String(text);
return div.innerHTML;
}
showError() {
this.resultsContent.innerHTML = `
Unable to load results. Please try again.
`;
this.showResults();
}
showResults() {
this.resultsContainer.classList.remove('hidden');
this.resultsContainer.classList.add('show');
}
hideResults() {
this.resultsContainer.classList.add('hidden');
this.resultsContainer.classList.remove('show');
}
};
} // end if (!window.MomentousPredictiveSearch)
function initPredictiveSearch() {
document.querySelectorAll('[data-search-form]').forEach(function(wrapper) {
if (!wrapper.__predictiveSearch) {
wrapper.__predictiveSearch = new window.MomentousPredictiveSearch(wrapper);
}
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initPredictiveSearch);
} else {
initPredictiveSearch();
}
})();
Recommended Products
Creatine - 60 Servings
£27.00
View Product
Creatine - 90 Servings
£33.00
View Product
Creatine Chews 150-Count
£39.00
View Product
#ss-backdrop {
display: none;
position: fixed;
inset: 0;
background: rgba(0,0,0,0.45);
z-index: 400;
}
#ss-panel {
display: flex;
flex-direction: column;
position: fixed;
top: 0;
right: 0;
bottom: 0;
width: 440px;
max-width: 100%;
background: #fff;
z-index: 401;
transform: translateX(100%);
transition: transform 0.3s ease;
box-shadow: -4px 0 24px rgba(0,0,0,0.1);
}
#ss-panel.open,
#ss-backdrop.open {
display: flex; /* backdrop uses display:block via override below */
}
#ss-backdrop.open { display: block; }
#ss-panel.open { transform: translateX(0); }
#ss-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px 20px;
border-bottom: 1px solid #e5e5e5;
flex-shrink: 0;
}
#ss-title {
font-size: 17px;
font-weight: 600;
color: #171717;
}
#ss-header button {
background: none;
border: none;
cursor: pointer;
padding: 4px;
color: #555;
line-height: 0;
}
#ss-body {
flex: 1;
min-height: 0;
overflow-y: auto;
padding: 18px 20px;
-webkit-overflow-scrolling: touch;
}
/* Results appear inline, not as a dropdown */
#ss-panel .search-form-wrapper { isolation: auto; }
#ss-panel .search-form__results {
position: static !important;
width: 100% !important;
border: none !important;
box-shadow: none !important;
border-radius: 0 !important;
margin-top: 10px !important;
}
#ss-panel .search-form__results-content {
padding: 0 !important;
}
/* Recommended */
#ss-recommended { margin-top: 20px; }
#ss-recommended-label {
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: #757575;
margin: 0 0 12px;
}
.ss-rec-item {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
border: 1px solid #e5e5e5;
border-radius: 8px;
text-decoration: none;
margin-bottom: 8px;
transition: background 0.15s;
}
.ss-rec-item:hover { background: #fafafa; }
.ss-rec-item img,
.ss-rec-img-placeholder {
width: 72px;
height: 72px;
border-radius: 6px;
object-fit: cover;
flex-shrink: 0;
background: #f0f0f0;
}
.ss-rec-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 4px;
}
.ss-rec-title {
font-size: 13px;
font-weight: 600;
color: #171717;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.ss-rec-price {
font-size: 13px;
color: #737373;
}
#ss-recommended.hidden { display: none; }
var _ssScrollY = 0;
function openSearchSidebar() {
_ssScrollY = window.pageYOffset || document.documentElement.scrollTop;
document.body.style.position = 'fixed';
document.body.style.top = '-' + _ssScrollY + 'px';
document.body.style.width = '100%';
document.getElementById('ss-panel').classList.add('open');
document.getElementById('ss-backdrop').classList.add('open');
setTimeout(function() {
var input = document.querySelector('#ss-panel [data-search-input]');
if (input) input.focus();
}, 320);
}
function closeSearchSidebar() {
document.getElementById('ss-panel').classList.remove('open');
document.getElementById('ss-backdrop').classList.remove('open');
document.body.style.position = '';
document.body.style.top = '';
document.body.style.width = '';
window.scrollTo(0, _ssScrollY);
}
// Hide recommended when typing, show when empty
document.addEventListener('DOMContentLoaded', function() {
var input = document.querySelector('#ss-panel [data-search-input]');
var rec = document.getElementById('ss-recommended');
if (!input || !rec) return;
input.addEventListener('input', function() {
if (input.value.trim().length > 0) {
rec.classList.add('hidden');
} else {
rec.classList.remove('hidden');
}
});
// Clear button also restores recommended
var clearBtn = document.querySelector('#ss-panel [data-search-clear]');
if (clearBtn) {
clearBtn.addEventListener('click', function() {
setTimeout(function() { rec.classList.remove('hidden'); }, 20);
});
}
});
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') closeSearchSidebar();
});
.favicon {display: block;}
.recharge-theme {
/* App */
--recharge-app-background: #F9F8F4;
--recharge-app-container: 1200px;
--recharge-app-vertical-padding: 32px;
/* Brand colors */
--recharge-color-brand: #467C99;
/* Tints */
--recharge-color-brand-120: #38637a;
--recharge-color-brand-20: #6b96ad;
--recharge-color-brand-40: #90b0c2;
--recharge-color-brand-60: #b5cbd6;
--recharge-color-brand-75: #d1dee6;
--recharge-color-brand-85: #e3ebf0;
/* Neutral */
--recharge-color-neutral: hsl(201, 35%, 7%);
--recharge-color-neutral-80: hsl(201, 7%, 25%);
--recharge-color-neutral-70: hsl(201, 5%, 35%);
--recharge-color-neutral-40: hsl(201, 3%, 63%);
--recharge-color-neutral-10: hsl(201, 2%, 91%);
/* Links */
--recharge-button-secondary: #467C99;
--recharge-button-secondary-120: #38637a;
--recharge-button-secondary-60: #90b0c2;
/* Images */
--recharge-images-ratio: 1;
/* Cards */
--recharge-cards-background: #FFFFFF;
--recharge-cards-border-color: RGBA(0,0,0,0);
/* Fonts */
--recharge-typography-scale: 16px;
--recharge-typography-size-1: calc(3 * var(--recharge-typography-scale));
--recharge-typography-size-2: calc(2.25 * var(--recharge-typography-scale));
--recharge-typography-size-3: calc(1.625 * var(--recharge-typography-scale));
--recharge-typography-size-4: calc(1.25 * var(--recharge-typography-scale));
--recharge-typography-size-5: calc(1 * var(--recharge-typography-scale));
--recharge-typography-size-6: calc(.875 * var(--recharge-typography-scale));
/** Text **/
--recharge-typography-light: #FFFFFF;
--recharge-typography-primary: var(--recharge-color-neutral);
--recharge-typography-secondary: var(--recharge-color-neutral-70);
/* Corners */
--recharge-corners-radius: 8px;
--recharge-button-border-radius: 8px;
/* Views */
--recharge-views-background: #F9F8F4;
/* Buttons */
--recharge-button-font-family: inherit;
--recharge-button-brand: var(--recharge-color-brand);
--recharge-button-color: #FFFFFF;
}
(function() {
var initialCartState = [];
var previousCartStateKey = 'previousCartState';
var removedItemsKey = 'removedItemsState';
var previousCartState = [];
try {
previousCartState = JSON.parse(localStorage.getItem(previousCartStateKey) || '[]');
} catch (e) {
previousCartState = [];
}
var removedItems = previousCartState.filter(function(prevItem) {
return !initialCartState.some(function(currItem) {
return currItem.id === prevItem.id;
});
});
if (removedItems.length) {
localStorage.setItem(removedItemsKey, JSON.stringify(removedItems));
}
localStorage.setItem(previousCartStateKey, JSON.stringify(initialCartState));
})();
(function() {
var productId = "8144660857015";
var productTitle = "Vegan Omega-3";
var productHandle = "vegan-omega-3";
var marketId = "21022965943";
var storageKey = 'oe_viewedProducts';
function trackViewedProducts() {
if (!productId) return;
var viewedProducts = [];
try {
viewedProducts = JSON.parse(localStorage.getItem(storageKey) || '[]');
} catch (e) {
viewedProducts = [];
}
viewedProducts = viewedProducts.filter(function(p) { return p.id !== productId; });
viewedProducts.unshift({
id: productId,
title: productTitle,
handle: productHandle,
viewedAt: new Date().toISOString()
});
viewedProducts = viewedProducts.slice(0, 50);
localStorage.setItem(storageKey, JSON.stringify(viewedProducts));
updateCartAttributes();
}
function updateCartAttributes() {
var viewedProducts = [];
try {
viewedProducts = JSON.parse(localStorage.getItem(storageKey) || '[]');
} catch (e) {
return;
}
var productIds = viewedProducts.map(function(p) { return p.id; }).slice(0, 10).join(',');
var cartAttributes = {};
if (productIds) cartAttributes['__upsell_recently_viewed_products'] = productIds;
if (marketId) cartAttributes['__upsell_market_id'] = marketId;
if (Object.keys(cartAttributes).length === 0) return;
fetch(window.Shopify.routes.root + 'cart/update.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ attributes: cartAttributes })
}).catch(function() {});
}
trackViewedProducts();
window.addEventListener('popstate', trackViewedProducts);
})();
window['ShopifyForms'] = {
...window['ShopifyForms'],
currentPageType: "product"
}; Price History
Loading...
:
1 ? 'lazy' : 'eager'" v-bind:src="itemImage(product, product.selected_variant, '400x400')" v-bind:alt="itemImageAlt(product, product.selected_variant)">
{{ value }}
Select your purchase method
Out of Stock Protection
{{ frequencyLabel(frequency, product.subscription_interval) }}
One-Time Purchase
Receive Once
Add to Bag
Price
View Product
el.classList.remove('show')); $event.target.closest('.rebuy-product-block').querySelector('.rebuy-product-options').classList.add('show')"
type="button">
Price
Powered by Rebuy
Search
Search for products, collections, pages, and articles
.search-form-wrapper {
position: relative;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
isolation: isolate;
}
.search-form__input:focus {
border: 1px solid #000;
}
.search-form__results {
width: 480px;
border-radius: 10px;
border: 1px solid #E5E7EB;
background: #FFF;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
top: 100%;
}
@media(max-width: 640px) {
.search-form__results {
width: 100%;
border-radius: 10px;
border: none;
margin-top: 0;
}
}
.search-form__results.show {
display: block;
}
.search-result-divider {
border-top: 1px solid var(--grey-100, #e5e5e5);
}
.search-product-img {
width: 5rem;
height: 5rem;
}
@media(max-width: 640px) {
.search-product-img {
width: 70px;
height: 70px;
}
}
.atc-btn[data-loading] {
opacity: 0.6;
pointer-events: none;
}
.atc-btn[data-added] {
background-color: #2d7a3a;
}
.search-form__results.is-loading::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 2px;
background: linear-gradient(90deg, transparent 0%, var(--grey-900, #171717) 50%, transparent 100%);
background-size: 200% 100%;
animation: search-loading-shimmer 1.2s ease-in-out infinite;
pointer-events: none;
}
.search-form__results-content {
max-height: calc(100vh - 170px);
overflow-y: auto;
-webkit-overflow-scrolling: touch;
overscroll-behavior: contain;
}
.search-result-divider {
position: sticky;
bottom: 0;
background-color: #FFF;
z-index: 10;
}
@keyframes search-loading-shimmer {
0% { background-position: -100% 0; }
100% { background-position: 200% 0; }
}
@media(max-width: 640px) {
.search-product-row {
flex-direction: column;
align-items: flex-start !important;
}
.search-recommended-section {
display: none;
}
}
.query-item-text *,
.query-item-text {
white-space: nowrap;
}
.query-item-text mark {
background-color: #FFFADF;
color: inherit;
border-radius: 2px;
}
.search-form__clear-btn {
background: none;
border: none;
padding: 0;
cursor: pointer;
line-height: 0;
color: var(--grey-400, #999);
}
.search-form__clear-btn:hover svg path {
stroke: var(--grey-700, #404040);
}
(function() {
'use strict';
const SEARCH_ICON = `
`;
// Guard: only define the class once even if snippet is rendered multiple times
if (!window.MomentousPredictiveSearch) {
window.MomentousPredictiveSearch = class {
constructor(wrapper) {
this.wrapper = wrapper;
this.input = wrapper.querySelector('[data-search-input]');
this.resultsContainer = wrapper.querySelector('[data-search-results]');
this.resultsContent = wrapper.querySelector('[data-search-results-content]');
this.form = wrapper.querySelector('.search-form');
this.submitBtn = wrapper.querySelector('[data-search-submit]');
this.clearBtn = wrapper.querySelector('[data-search-clear]');
this.debounceTimer = null;
this.currentRequest = null;
this.currentQuery = '';
this.minQueryLength = 2;
this.debounceDelay = 300;
this.cache = new Map();
this.requestId = 0;
this.init();
}
init() {
this.input.addEventListener('input', (e) => {
this.handleInput(e.target.value);
this.updateClearBtn();
});
if (this.clearBtn) {
this.clearBtn.addEventListener('click', () => {
this.input.value = '';
this.currentQuery = '';
this.hideResults();
this.updateClearBtn();
this.input.focus();
});
}
this.input.addEventListener('focus', () => {
if (this.input.value.length >= this.minQueryLength) {
this.showResults();
}
});
this.input.addEventListener('touchend', (e) => {
e.stopPropagation();
this.input.focus();
});
this.input.addEventListener('touchstart', (e) => {
e.stopPropagation();
}, { passive: true });
const handleOutsideInteraction = (e) => {
if (!this.wrapper.contains(e.target)) {
const sidebarPanel = document.getElementById('ss-panel');
if (sidebarPanel && sidebarPanel.contains(this.wrapper) && sidebarPanel.contains(e.target)) {
return;
}
this.hideResults();
}
};
document.addEventListener('click', handleOutsideInteraction);
document.addEventListener('touchstart', handleOutsideInteraction, { passive: true });
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') this.hideResults();
});
}
updateClearBtn() {
const show = this.input.value.length >= this.minQueryLength;
if (this.clearBtn) this.clearBtn.classList.toggle('hidden', !show);
if (this.submitBtn) this.submitBtn.classList.toggle('hidden', show);
}
handleInput(query) {
const trimmedQuery = query.trim();
if (this.debounceTimer) clearTimeout(this.debounceTimer);
if (trimmedQuery.length {
this.fetchSearchData(trimmedQuery);
}, this.debounceDelay);
}
async fetchSearchData(query) {
if (this.cache.has(query)) {
const cached = this.cache.get(query);
this.setLoadingState(false);
this.renderResults(cached.results, query, cached.recommended);
return;
}
if (this.currentRequest) {
this.currentRequest.abort();
this.currentRequest = null;
}
const requestId = ++this.requestId;
const controller = new AbortController();
this.currentRequest = controller;
const baseUrl = window.Shopify?.routes?.root || '/';
const apiUrl = `${baseUrl}search/suggest.json?q=${encodeURIComponent(query)}&resources[type]=product,query&resources[limit]=5&resources[limit_scope]=each`;
try {
const response = await fetch(apiUrl, {
signal: controller.signal,
headers: { 'Accept': 'application/json' }
});
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
if (requestId !== this.requestId) return;
this.currentRequest = null;
const results = data.resources?.results || {};
if (this.cache.size > 50) this.cache.clear();
this.cache.set(query, { results, recommended: null });
this.setLoadingState(false);
this.renderResults(results, query, null);
} catch (error) {
if (error.name === 'AbortError') return;
if (requestId !== this.requestId) return;
console.error('Predictive search error:', error);
this.setLoadingState(false);
this.showError();
}
}
async fetchRecommendations(productId) {
try {
const baseUrl = window.Shopify?.routes?.root || '/';
const url = `${baseUrl}recommendations/products.json?product_id=${productId}&limit=6&intent=related`;
const response = await fetch(url, { headers: { 'Accept': 'application/json' } });
if (!response.ok) return [];
const data = await response.json();
return (data.products || [])
.filter(p => {
const tags = (p.tags || []).map(t => t.toLowerCase());
return !tags.includes('searchnise_ignore') && !tags.includes('search_hide');
})
.slice(0, 3);
} catch (e) {
return [];
}
}
async addToCart(variantId, btn) {
btn.setAttribute('data-loading', '');
btn.textContent = 'Adding...';
try {
const response = await fetch('/cart/add.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
body: JSON.stringify({ id: variantId, quantity: 1 })
});
if (!response.ok) throw new Error('Failed to add to cart');
btn.removeAttribute('data-loading');
btn.setAttribute('data-added', '');
btn.textContent = 'Added!';
document.dispatchEvent(new CustomEvent('cart:refresh'));
setTimeout(() => {
btn.removeAttribute('data-added');
btn.textContent = 'Add to Cart';
}, 2000);
} catch (e) {
btn.removeAttribute('data-loading');
btn.textContent = 'Add to Cart';
console.error('ATC error:', e);
}
}
bindAtcButtons() {
this.resultsContent.querySelectorAll('.atc-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
e.preventDefault();
const variantId = btn.dataset.variantId;
if (variantId) this.addToCart(variantId, btn);
});
});
}
renderResults(results, query, preloadedRecommended) {
if (!results || ((!results.products || results.products.length === 0) && (!results.queries || results.queries.length === 0))) {
this.resultsContent.innerHTML = `
No results found for "${this.escapeHtml(query)}"
`;
this.showResults();
return;
}
const products = (results.products || [])
.filter(p => {
const tags = (p.tags || []).map(t => t.toLowerCase());
return !tags.includes('searchnise_ignore') && !tags.includes('search_hide');
})
.slice(0, 4);
const queries = (results.queries || []).slice(0, 4);
const firstProductId = products.length > 0 ? products[0].id : null;
let html = '';
if (products.length > 0) {
html += ``;
products.forEach(product => {
html += this.renderMatchedProduct(product);
});
html += `
`;
}
if (queries.length > 0) {
html += `
Top Searches
- ${SEARCH_ICON}
${queries.map(q => this.renderQueryItem(q)).join('')}
`;
}
const searchUrl = (window.Shopify?.routes?.root || '/') + `search?q=${encodeURIComponent(query)}&type=product`;
html += `
View all results for “${this.escapeHtml(query)}”
`;
if (firstProductId) {
if (preloadedRecommended && preloadedRecommended.length > 0) {
html += this.renderRecommendedSection(preloadedRecommended);
} else if (preloadedRecommended === null) {
html += `
`;
}
}
this.resultsContent.innerHTML = html;
this.showResults();
this.bindAtcButtons();
if (firstProductId && preloadedRecommended === null) {
this.fetchAndPatchRecommendations(firstProductId, query);
}
}
renderMatchedProduct(product) {
const imgUrl = product.featured_image?.url || product.image || '';
const imgSized = imgUrl ? imgUrl.replace(/(\.[a-z]+)(\?.*)?$/i, '_220x220$1$2') : '';
const price = this.formatPrice(product.price, product.price_min, product.price_max);
const isSingleVariant = !product.variants || product.variants.length
${imgSized
? `
`
: `
`
}
${title}
${price ? `${price}
` : ''}
View Product
`;
}
renderSuggestedProduct(product) {
const imgUrl = product.featured_image?.src || product.featured_image?.url || product.images?.[0] || '';
const imgSized = imgUrl ? imgUrl.replace(/(\.[a-z]+)(\?.*)?$/i, '_300x300$1$2') : '';
const productUrl = this.escapeHtml(product.url || `/products/${product.handle}`);
const title = this.escapeHtml(product.title || '');
return `
${imgSized
? `
`
: `
`
}
${title}
`;
}
renderQueryItem(item) {
const queryText = item.styled_text || this.escapeHtml(item.text || '');
const queryUrl = this.escapeHtml(item.url || '#');
return `
${queryText}
`;
}
renderRecommendedSection(recommended) {
return `
Suggested Products
${recommended.map(p => this.renderSuggestedProduct(p)).join('')}
`;
}
async fetchAndPatchRecommendations(productId, query) {
const recommended = await this.fetchRecommendations(productId);
if (query !== this.currentQuery) return;
if (this.cache.has(query)) {
this.cache.get(query).recommended = recommended;
}
const slot = this.resultsContent.querySelector('[data-recommendations-slot]');
if (!slot) return;
if (recommended.length > 0) {
slot.outerHTML = this.renderRecommendedSection(recommended);
} else {
slot.remove();
}
}
setLoadingState(loading) {
this.resultsContainer.classList.toggle('is-loading', loading);
if (loading && !this.resultsContainer.classList.contains('show')) {
this.showResults();
}
}
formatPrice(price, priceMin, priceMax) {
if (!price && !priceMin && !priceMax) return '';
const formatCurrency = (amount) => {
if (window.Shopify?.formatMoney) {
return window.Shopify.formatMoney(amount, window.Shopify.money_format || '$');
}
const currency = window.Shopify?.currency?.active || 'USD';
return new Intl.NumberFormat('en-US', { style: 'currency', currency }).format(amount);
};
if (priceMin && priceMax && priceMin !== priceMax) {
return `${formatCurrency(priceMin)} – ${formatCurrency(priceMax)}`;
}
return formatCurrency(price || priceMin || priceMax);
}
escapeHtml(text) {
if (text == null) return '';
const div = document.createElement('div');
div.textContent = String(text);
return div.innerHTML;
}
showError() {
this.resultsContent.innerHTML = `
Unable to load results. Please try again.
`;
this.showResults();
}
showResults() {
this.resultsContainer.classList.remove('hidden');
this.resultsContainer.classList.add('show');
}
hideResults() {
this.resultsContainer.classList.add('hidden');
this.resultsContainer.classList.remove('show');
}
};
} // end if (!window.MomentousPredictiveSearch)
function initPredictiveSearch() {
document.querySelectorAll('[data-search-form]').forEach(function(wrapper) {
if (!wrapper.__predictiveSearch) {
wrapper.__predictiveSearch = new window.MomentousPredictiveSearch(wrapper);
}
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initPredictiveSearch);
} else {
initPredictiveSearch();
}
})();
Recommended Products
Creatine - 60 Servings
£27.00
View Product
Creatine - 90 Servings
£33.00
View Product
Creatine Chews 150-Count
£39.00
View Product
#ss-backdrop {
display: none;
position: fixed;
inset: 0;
background: rgba(0,0,0,0.45);
z-index: 400;
}
#ss-panel {
display: flex;
flex-direction: column;
position: fixed;
top: 0;
right: 0;
bottom: 0;
width: 440px;
max-width: 100%;
background: #fff;
z-index: 401;
transform: translateX(100%);
transition: transform 0.3s ease;
box-shadow: -4px 0 24px rgba(0,0,0,0.1);
}
#ss-panel.open,
#ss-backdrop.open {
display: flex; /* backdrop uses display:block via override below */
}
#ss-backdrop.open { display: block; }
#ss-panel.open { transform: translateX(0); }
#ss-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px 20px;
border-bottom: 1px solid #e5e5e5;
flex-shrink: 0;
}
#ss-title {
font-size: 17px;
font-weight: 600;
color: #171717;
}
#ss-header button {
background: none;
border: none;
cursor: pointer;
padding: 4px;
color: #555;
line-height: 0;
}
#ss-body {
flex: 1;
min-height: 0;
overflow-y: auto;
padding: 18px 20px;
-webkit-overflow-scrolling: touch;
}
/* Results appear inline, not as a dropdown */
#ss-panel .search-form-wrapper { isolation: auto; }
#ss-panel .search-form__results {
position: static !important;
width: 100% !important;
border: none !important;
box-shadow: none !important;
border-radius: 0 !important;
margin-top: 10px !important;
}
#ss-panel .search-form__results-content {
padding: 0 !important;
}
/* Recommended */
#ss-recommended { margin-top: 20px; }
#ss-recommended-label {
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: #757575;
margin: 0 0 12px;
}
.ss-rec-item {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
border: 1px solid #e5e5e5;
border-radius: 8px;
text-decoration: none;
margin-bottom: 8px;
transition: background 0.15s;
}
.ss-rec-item:hover { background: #fafafa; }
.ss-rec-item img,
.ss-rec-img-placeholder {
width: 72px;
height: 72px;
border-radius: 6px;
object-fit: cover;
flex-shrink: 0;
background: #f0f0f0;
}
.ss-rec-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 4px;
}
.ss-rec-title {
font-size: 13px;
font-weight: 600;
color: #171717;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.ss-rec-price {
font-size: 13px;
color: #737373;
}
#ss-recommended.hidden { display: none; }
var _ssScrollY = 0;
function openSearchSidebar() {
_ssScrollY = window.pageYOffset || document.documentElement.scrollTop;
document.body.style.position = 'fixed';
document.body.style.top = '-' + _ssScrollY + 'px';
document.body.style.width = '100%';
document.getElementById('ss-panel').classList.add('open');
document.getElementById('ss-backdrop').classList.add('open');
setTimeout(function() {
var input = document.querySelector('#ss-panel [data-search-input]');
if (input) input.focus();
}, 320);
}
function closeSearchSidebar() {
document.getElementById('ss-panel').classList.remove('open');
document.getElementById('ss-backdrop').classList.remove('open');
document.body.style.position = '';
document.body.style.top = '';
document.body.style.width = '';
window.scrollTo(0, _ssScrollY);
}
// Hide recommended when typing, show when empty
document.addEventListener('DOMContentLoaded', function() {
var input = document.querySelector('#ss-panel [data-search-input]');
var rec = document.getElementById('ss-recommended');
if (!input || !rec) return;
input.addEventListener('input', function() {
if (input.value.trim().length > 0) {
rec.classList.add('hidden');
} else {
rec.classList.remove('hidden');
}
});
// Clear button also restores recommended
var clearBtn = document.querySelector('#ss-panel [data-search-clear]');
if (clearBtn) {
clearBtn.addEventListener('click', function() {
setTimeout(function() { rec.classList.remove('hidden'); }, 20);
});
}
});
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') closeSearchSidebar();
});
.favicon {display: block;}
.recharge-theme {
/* App */
--recharge-app-background: #F9F8F4;
--recharge-app-container: 1200px;
--recharge-app-vertical-padding: 32px;
/* Brand colors */
--recharge-color-brand: #467C99;
/* Tints */
--recharge-color-brand-120: #38637a;
--recharge-color-brand-20: #6b96ad;
--recharge-color-brand-40: #90b0c2;
--recharge-color-brand-60: #b5cbd6;
--recharge-color-brand-75: #d1dee6;
--recharge-color-brand-85: #e3ebf0;
/* Neutral */
--recharge-color-neutral: hsl(201, 35%, 7%);
--recharge-color-neutral-80: hsl(201, 7%, 25%);
--recharge-color-neutral-70: hsl(201, 5%, 35%);
--recharge-color-neutral-40: hsl(201, 3%, 63%);
--recharge-color-neutral-10: hsl(201, 2%, 91%);
/* Links */
--recharge-button-secondary: #467C99;
--recharge-button-secondary-120: #38637a;
--recharge-button-secondary-60: #90b0c2;
/* Images */
--recharge-images-ratio: 1;
/* Cards */
--recharge-cards-background: #FFFFFF;
--recharge-cards-border-color: RGBA(0,0,0,0);
/* Fonts */
--recharge-typography-scale: 16px;
--recharge-typography-size-1: calc(3 * var(--recharge-typography-scale));
--recharge-typography-size-2: calc(2.25 * var(--recharge-typography-scale));
--recharge-typography-size-3: calc(1.625 * var(--recharge-typography-scale));
--recharge-typography-size-4: calc(1.25 * var(--recharge-typography-scale));
--recharge-typography-size-5: calc(1 * var(--recharge-typography-scale));
--recharge-typography-size-6: calc(.875 * var(--recharge-typography-scale));
/** Text **/
--recharge-typography-light: #FFFFFF;
--recharge-typography-primary: var(--recharge-color-neutral);
--recharge-typography-secondary: var(--recharge-color-neutral-70);
/* Corners */
--recharge-corners-radius: 8px;
--recharge-button-border-radius: 8px;
/* Views */
--recharge-views-background: #F9F8F4;
/* Buttons */
--recharge-button-font-family: inherit;
--recharge-button-brand: var(--recharge-color-brand);
--recharge-button-color: #FFFFFF;
}
(function() {
var initialCartState = [];
var previousCartStateKey = 'previousCartState';
var removedItemsKey = 'removedItemsState';
var previousCartState = [];
try {
previousCartState = JSON.parse(localStorage.getItem(previousCartStateKey) || '[]');
} catch (e) {
previousCartState = [];
}
var removedItems = previousCartState.filter(function(prevItem) {
return !initialCartState.some(function(currItem) {
return currItem.id === prevItem.id;
});
});
if (removedItems.length) {
localStorage.setItem(removedItemsKey, JSON.stringify(removedItems));
}
localStorage.setItem(previousCartStateKey, JSON.stringify(initialCartState));
})();
(function() {
var productId = "8144660857015";
var productTitle = "Vegan Omega-3";
var productHandle = "vegan-omega-3";
var marketId = "21022965943";
var storageKey = 'oe_viewedProducts';
function trackViewedProducts() {
if (!productId) return;
var viewedProducts = [];
try {
viewedProducts = JSON.parse(localStorage.getItem(storageKey) || '[]');
} catch (e) {
viewedProducts = [];
}
viewedProducts = viewedProducts.filter(function(p) { return p.id !== productId; });
viewedProducts.unshift({
id: productId,
title: productTitle,
handle: productHandle,
viewedAt: new Date().toISOString()
});
viewedProducts = viewedProducts.slice(0, 50);
localStorage.setItem(storageKey, JSON.stringify(viewedProducts));
updateCartAttributes();
}
function updateCartAttributes() {
var viewedProducts = [];
try {
viewedProducts = JSON.parse(localStorage.getItem(storageKey) || '[]');
} catch (e) {
return;
}
var productIds = viewedProducts.map(function(p) { return p.id; }).slice(0, 10).join(',');
var cartAttributes = {};
if (productIds) cartAttributes['__upsell_recently_viewed_products'] = productIds;
if (marketId) cartAttributes['__upsell_market_id'] = marketId;
if (Object.keys(cartAttributes).length === 0) return;
fetch(window.Shopify.routes.root + 'cart/update.js', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ attributes: cartAttributes })
}).catch(function() {});
}
trackViewedProducts();
window.addEventListener('popstate', trackViewedProducts);
})();
window['ShopifyForms'] = {
...window['ShopifyForms'],
currentPageType: "product"
}; Price History
Loading...
- ${SEARCH_ICON} ${queries.map(q => this.renderQueryItem(q)).join('')}
