Back to Compare
Buy

Momentous
Recovery Vanilla 15 Servings
PricePrice
£2.800

Momentous
Flavour
Momentous
eBay
£48.22
Price History
Loading...
Description
Recovery is a balanced protein powder containing both protein and carbohydrates designed to fuel rapid recovery from strenuous workouts. Recovery is…
Ingredients
Chocolate:
Truly Grass Fed™ Whey Protein Isolate, L-Glutamine, D-Ribose, Dimagnesium Malate, L-Carnitine Tartrate, ProHydrolase® (protease enzyme blend)
Other Ingredients: Cocoa, Dextrose, Rice Maltodextrin, Natural Flavors, Guar Gum, Salt, Potassium Citrate, Sunflower Lecithin, Silica, Steviol Glycosides.
Contains: Milk
Vanilla:
Truly Grass Fed™ Whey Protein Isolate, L-Glutamine, D-Ribose, Dimagnesium Malate, L-Carnitine Tartrate, ProHydrolase® (protease enzyme blend)
Other Ingredients: Dextrose, Natural Flavors, Rice Maltodextrin, Guar Gum, Potassium Citrate, Sunflower Lecithin, Silica, Steviol Glycosides.
Contains: Milk
Recovery starts with grass-fed Whey Protein Isolate, sourced from european grass-fed cows raised in a natural, traceable, and sustainable environment. It’s paired with 10g of carbohydrates from dextrose and rice maltodextrin to support recovery without overloading the formula with sugar.
Additional recovery support comes from:
L-Glutamine for muscle recovery and gut support
L-Carnitine Tartrate for exercise recovery support
DiMagnesium Malate for muscle and metabolic support
Potassium + sodium for electrolyte replenishment
ProHydrolase® to support protein digestion and absorption
Onset Time & Expected Results
When to use
Post-workout, immediately after training or high-intensity exercise.
Onset time
Supports recovery right away; noticeable improvements typically within 2–4 weeks of consistent use.
Expected results
Reduced muscle soreness and fatigue
Faster recovery between sessions
Improved post-workout energy replenishment
Better support for muscle repair and performance
Clinical Research & 3rd Party Test Results
There are 5 credible reviews and studies related to this product:
The impact of dietary protein supplementation on recovery from resistance exercise-induced muscle damage: A systematic review with meta-analysis
Timing and distribution of protein ingestion during prolonged recovery from resistance exercise alters myofibrillar protein synthesis
Dietary protein for athletes: From requirements to optimum adaptation
Rapid aminoacidemia enhances myofibrillar protein synthesis and anabolic intramuscular signaling responses after resistance exercise
The Influence of Oral L-Glutamine Supplementation on Muscle Strength Recovery and Soreness Following Unilateral Knee Extension Eccentric Exercise
Build Your Stack
Best Seller
{const lazyImages = window.lazyImages = window.lazyImages || []
const el = document.querySelector("#image2127")
if(el && window.lazyImageFn) window.lazyImageFn(el);
else if(el) lazyImages.push(el)
}
4.7
Rated 4.7 out of 5 stars
3,092
{"averageRating":"4.7","reviewCount":3092}
Whey Protein Isolate
Supports lean muscle mass and recovery*
High in leucine to build and repair muscle faster*
No gums, fillers, or artificial sweeteners
£34.50
£46.00
Add to Bag
Whey Protein Isolate
Flavor:
ChocolateVanillaUnflavoredStrawberry
Subscribe & Save 25%
£
34.50
£ 46.00
Out of Stock Protection
10% off future deliveries
Cancel or reschedule anytime
Experience long-term results
Delivery every 1 month
Delivery every 2 months
Delivery every 3 months
One-time Purchase
£ 46.00
£
46.00
£ 46.00
£
46.00
Sorry, We are currently out of stock!
Estimated to be back in stock:
Add to Bag
Notify me when available
View Full Details
.first-hidden {
display: none;
}
Whey Protein Isolate
Flavor:
ChocolateVanillaUnflavoredStrawberry
Subscribe & Save 25%
£
34.50
£ 46.00
Out of Stock Protection
10% off future deliveries
Cancel or reschedule anytime
Experience long-term results
Delivery every 1 month
Delivery every 2 months
Delivery every 3 months
One-time Purchase
£ 46.00
£
46.00
£ 46.00
£
46.00
Sorry, We are currently out of stock!
Estimated to be back in stock:
Add to Bag
Notify me when available
View Full Details
.first-hidden {
display: none;
}
Upgraded Formula
{const lazyImages = window.lazyImages = window.lazyImages || []
const el = document.querySelector("#image2755")
if(el && window.lazyImageFn) window.lazyImageFn(el);
else if(el) lazyImages.push(el)
}
4.9
Rated 4.9 out of 5 stars
3,664
{"averageRating":"4.9","reviewCount":3664}
Creatine - 90 Servings
New Signature Spec creatine standard
Ultrafine powder for exceptional mixability
Unrivaled 6-stage testing & certification
£24.75
£33.00
Add to Bag
Creatine - 90 Servings
Subscribe & Save 25%
£
24.75
£ 33.00
Out of Stock Protection
10% off future deliveries
Cancel or reschedule anytime
Experience long-term results
Delivery every 3 months
Delivery every 2 months
Delivery every 1 month
One-time Purchase
£ 33.00
£
33.00
£ 33.00
£
33.00
Sorry, We are currently out of stock!
Estimated to be back in stock:
Add to Bag
Notify me when available
View Full Details
.first-hidden {
display: none;
}
Creatine - 90 Servings
Subscribe & Save 25%
£
24.75
£ 33.00
Out of Stock Protection
10% off future deliveries
Cancel or reschedule anytime
Experience long-term results
Delivery every 3 months
Delivery every 2 months
Delivery every 1 month
One-time Purchase
£ 33.00
£
33.00
£ 33.00
£
33.00
Sorry, We are currently out of stock!
Estimated to be back in stock:
Add to Bag
Notify me when available
View Full Details
.first-hidden {
display: none;
}
Best Seller
{const lazyImages = window.lazyImages = window.lazyImages || []
const el = document.querySelector("#image6845")
if(el && window.lazyImageFn) window.lazyImageFn(el);
else if(el) lazyImages.push(el)
}
4.8
Rated 4.8 out of 5 stars
1,090
{"averageRating":"4.8","reviewCount":1090}
Collagen Peptides
10g collagen + 5g FORTIGEL® for soft tissue strength
Includes Vitamin C to support collagen synthesis
Supports mobility, skin elasticity, and resilience
£30.00
£40.00
Add to Bag
Collagen Peptides
Subscribe & Save 25%
£
30.00
£ 40.00
Out of Stock Protection
10% off future deliveries
Cancel or reschedule anytime
Experience long-term results
Delivery every 1 month
Delivery every 2 months
Delivery every 3 months
One-time Purchase
£ 40.00
£
40.00
£ 40.00
£
40.00
Sorry, We are currently out of stock!
Estimated to be back in stock:
Add to Bag
Notify me when available
View Full Details
.first-hidden {
display: none;
}
Collagen Peptides
Subscribe & Save 25%
£
30.00
£ 40.00
Out of Stock Protection
10% off future deliveries
Cancel or reschedule anytime
Experience long-term results
Delivery every 1 month
Delivery every 2 months
Delivery every 3 months
One-time Purchase
£ 40.00
£
40.00
£ 40.00
£
40.00
Sorry, We are currently out of stock!
Estimated to be back in stock:
Add to Bag
Notify me when available
View Full Details
.first-hidden {
display: none;
}
{const lazyImages = window.lazyImages = window.lazyImages || []
const el = document.querySelector("#image2369")
if(el && window.lazyImageFn) window.lazyImageFn(el);
else if(el) lazyImages.push(el)
}
4.8
Rated 4.8 out of 5 stars
201
{"averageRating":"4.8","reviewCount":201}
Fuel
Slow-burning energy with no spike or crash
3:1 carb ratio lowers risk of GI distress
Essential electrolytes hydrate + combat cramping
£22.50
£30.00
Add to Bag
Fuel
Flavor:
Passion Orange GuavaMangoStrawberry LimeCherry Berry
Subscribe & Save 25%
£
22.50
£ 30.00
Out of Stock Protection
10% off future deliveries
Cancel or reschedule anytime
Experience long-term results
Delivery every 1 month
Delivery every 2 months
Delivery every 3 months
One-time Purchase
£ 30.00
£
30.00
£ 30.00
£
30.00
Sorry, We are currently out of stock!
Estimated to be back in stock:
Add to Bag
Notify me when available
View Full Details
.first-hidden {
display: none;
}
Fuel
Flavor:
Passion Orange GuavaMangoStrawberry LimeCherry Berry
Subscribe & Save 25%
£
22.50
£ 30.00
Out of Stock Protection
10% off future deliveries
Cancel or reschedule anytime
Experience long-term results
Delivery every 1 month
Delivery every 2 months
Delivery every 3 months
One-time Purchase
£ 30.00
£
30.00
£ 30.00
£
30.00
Sorry, We are currently out of stock!
Estimated to be back in stock:
Add to Bag
Notify me when available
View Full Details
.first-hidden {
display: none;
}
{const lazyImages = window.lazyImages = window.lazyImages || []
const el = document.querySelector("#image443")
if(el && window.lazyImageFn) window.lazyImageFn(el);
else if(el) lazyImages.push(el)
}
4.5
Rated 4.5 out of 5 stars
364
{"averageRating":"4.5","reviewCount":364}
Vital Aminos
13 amino acids including all 9 essential aminos
Supports muscle repair, recovery, and metabolic function
Helps maintain consistent performance over time
£27.00
£36.00
Add to Bag
Vital Aminos
Subscribe & Save 25%
£
27.00
£ 36.00
Out of Stock Protection
10% off future deliveries
Cancel or reschedule anytime
Experience long-term results
Delivery every 1 month
Delivery every 2 months
Delivery every 3 months
One-time Purchase
£ 36.00
£
36.00
£ 36.00
£
36.00
Sorry, We are currently out of stock!
Estimated to be back in stock:
Add to Bag
Notify me when available
View Full Details
.first-hidden {
display: none;
}
Vital Aminos
Subscribe & Save 25%
£
27.00
£ 36.00
Out of Stock Protection
10% off future deliveries
Cancel or reschedule anytime
Experience long-term results
Delivery every 1 month
Delivery every 2 months
Delivery every 3 months
One-time Purchase
£ 36.00
£
36.00
£ 36.00
£
36.00
Sorry, We are currently out of stock!
Estimated to be back in stock:
Add to Bag
Notify me when available
View Full Details
.first-hidden {
display: none;
}
.product-carousel .swiper-slide {
flex-shrink: 0;
}
@media (min-width: 768px) {
.product-carousel .swiper-wrapper {
display: flex;
gap: 1rem;
overflow-x: auto;
scrollbar-width: none;
-ms-overflow-style: none;
}
.product-carousel .swiper-wrapper::-webkit-scrollbar {
display: none;
}
}
#shopify-section-template--20282424131767__horizontal_line_hMFxBL {
padding-top: 0px;
padding-bottom: 10px;
}
@media (max-width: 1023px) {
#shopify-section-template--20282424131767__horizontal_line_hMFxBL {
padding-top: 0px;
padding-bottom: 10px;
}
}
Frequently Asked Questions
What is a recovery supplement?
A recovery supplement is designed to support the body after exercise by helping repair muscle tissue and replenish energy stores. These supplements often include protein, carbohydrates, or both, depending on the type of training.
How is this different than grass-fed whey protein?
Recovery differs from whey protein by providing both protein and carbohydrates. While whey protein primarily supports muscle repair, Recovery also includes carbohydrates to help replenish glycogen stores used during longer or more intense training sessions.
This makes Recovery especially useful after endurance workouts or high-volume training.
Do I need carbohydrates after a workout?
After longer or more intense workouts, carbohydrates can help replenish glycogen stores used during exercise. Pairing carbohydrates with protein is commonly recommended to support both energy restoration and muscle recovery.
When should I take Recovery?
Recovery is typically taken after training, especially following longer endurance workouts or high-volume sessions. It is designed to be consumed shortly after exercise as part of a post-workout nutrition routine.
Who is Recovery best for?
Recovery is designed for endurance athletes and active individuals who perform longer or more demanding training sessions. It is commonly used to support post-workout muscle repair and energy replenishment.
Can I use Recovery after every workout?
Recovery can be used after workouts, especially those that are longer in duration or higher in intensity. For shorter or lower-intensity sessions, protein alone may be sufficient depending on overall nutrition.
Why is taking Recovery important?
Recovery is designed to support the post-workout window, when the body is replenishing energy and repairing muscle tissue. By providing both protein and carbohydrates, it helps support muscle recovery while restoring energy used during training.
This can help prepare the body for subsequent workouts and training days.
Is Recovery better than protein after workouts?
Protein supports muscle repair after exercise, while a recovery supplement that includes both protein and carbohydrates can also help restore energy levels. The best option depends on the duration and intensity of training.
Can I use Recovery as a meal replacement?
Recovery is a post-workout recovery supplement designed to support muscle repair and replenish energy after training. It is not intended to replace a complete meal.
For best results, Recovery should be used after exercise and followed by a balanced meal within a few hours.
Is Momentous Recovery NSF Certified for Sport®?
Every finished batch of Recovery is certified through NSF Certified for Sport®, a respected independent program that verifies label accuracy and screens for hundreds of banned substances. If a batch fails to meet these independent standards, it does not ship. We also take transparency a step further by publishing third-party test results via Light Labs on individual product pages and making Certificates of Analysis (COAs) available for every batch.
4.8
Rated 4.8 out of 5 stars
Based on 260 reviews
5 Rated out of 5 stars
230
Total 5 star reviews: 230 4 Rated out of 5 stars
22
Total 4 star reviews: 22 3 Rated out of 5 stars
3
Total 3 star reviews: 3 2 Rated out of 5 stars
2
Total 2 star reviews: 2 1 Rated out of 5 stars
3
Total 1 star reviews: 3
97%would recommend these products
Reviews Summary
Generated by AI from 100 most recent customer reviews
Last updated 4 months ago
Customers say this recovery protein powder tastes great, with many describing the chocolate flavor as rich and smooth like hot chocolate, while the vanilla pairs well with fruits. Users report it mixes easily with water or milk without clumps and is gentle on the stomach. Many athletes appreciate the protein-to-carb ratio for post-workout recovery, noting reduced muscle soreness and improved energy levels. The convenient travel packets are frequently praised for portability. Common feedback includes faster recovery times, less fatigue after workouts, and effectiveness for endurance activities like cycling and running. Some users mention it helps with sleep quality. A few note it works better with milk than water, and one reviewer experienced digestive issues.
Read More
Customers Talked About
Taste
Recovery
Mixing
Performance
Nutrition
Filters
Write a Review (Opens in a new window)
260 reviews
Sort Most RecentPhotos & VideosMost HelpfulHighest RatingOldestLowest RatingLeast Helpful
FM
Florentino M.
Verified Buyer
Product Standouts Ease of Use, Trust and Transparency
Yesterday
Product Standouts Ease of Use, Trust and Transparency
Reviewing
Recovery
Rated 5 out of 5 stars
Great recovery for 2 a days
I train jiujitsu then immediately lift . This has greatly improved my recovery! I mix this with creatine
Read MoreRead more about this review
Was this helpful?Yes, this review from Florentino M. was helpful. 0 people voted yesNo, this review from Florentino M. was not helpful. 0 people voted no
I
Irving
1 month ago
Reviewing
Recovery
Rated 4 out of 5 stars
4 Stars
I like the product, I think I need to understand my bady more now they im over 40. Plus things are not recovering as fast as I thought. Overall the product is great but not like the ones I had in the past.
Read MoreRead more about this review
Was this helpful?Yes, this review from Irving was helpful. 0 people voted yesNo, this review from Irving was not helpful. 0 people voted no
L
Lura
1 month ago
Reviewing
Recovery
Rated 5 out of 5 stars
5 Stars
I am a F age 44 experiencing fatigue after training/lifting and this has helped ease my recovery. I love this brand,I always feel the effects of their products in my body. 10/10
Read MoreRead more about this review
Was this helpful?Yes, this review from Lura was helpful. 0 people voted yesNo, this review from Lura was not helpful. 0 people voted no
JE
James E.
Verified Buyer
Product Standouts Results, Ease of Use, Taste + Texture
2 months ago
Product Standouts Results, Ease of Use, Taste + Texture
Reviewing
Recovery
Rated 5 out of 5 stars
Worth including in your daily nutrition
I am in my upper 50's with life things that have kept me from a regular exercise routine for quite a while, but i have been for the last 27 weeks consistently doing strength training 5 days a week. Since using this about a half hour after completing my daily routine i have noticed that aches or soreness are very minimal and i am able to go at it the next day. I use the whey protein as well and i am happy with that but the recovery mix with the creatine and fiber+ do help me to feel better fast. I have even used it after a hard stretch of outdoor chores and it helps then too.
Read MoreRead more about this review
Was this helpful?Yes, this review from James E. was helpful. 1 person voted yesNo, this review from James E. was not helpful. 0 people voted no
CM
Charis M.
Verified Buyer
2 months ago
Reviewing
Recovery
Rated 5 out of 5 stars
Recovery that tastes as good as it works!
Taste was great! This is not always the case. I find the best test is “how does it taste with water” and this passes that test! The chocolate was delicious! The texture was none existent so that was a huge plus. Often times you have good taste but the texture is bad and this was the opposite. Great taste and texture is not an issue at all.
I do see a huge difference in soreness recovery time.
Read MoreRead more about this review
Was this helpful?Yes, this review from Charis M. was helpful. 1 person voted yesNo, this review from Charis M. was not helpful. 0 people voted no
Loading...
Loading...
Show More
{"areReviewsGrouped":true,"chatAssistant":{"reviewCount":260},"media":[],"productAttributes":[],"questionCount":0,"reviewAggregate":{"dateUpdated":"2026-07-21T05:57:49.268Z","mediaCount":0,"productAttributeCount":[{"title":"Product Standouts","type":"multi-value","options":[{"title":"Ease of Use","count":3},{"title":"Taste + Texture","count":2},{"title":"Results","count":2},{"title":"Trust and Transparency","count":2}]}],"productId":"shopify-6843815690423","productName":"Recovery","ratingAndReviewCount":260,"ratingAndReviewCountByLevel":{"level1Count":3,"level2Count":2,"level3Count":3,"level4Count":22,"level5Count":230},"ratingAndReviewValuesTotal":1254,"ratingCount":0,"ratingCountByLevel":{},"ratingValuesTotal":0,"recommendationCount":252,"replyCount":2,"replyWordsTotal":131,"reviewCount":260,"reviewCountByLevel":{"level1Count":3,"level2Count":2,"level3Count":3,"level4Count":22,"level5Count":230},"reviewRatingValuesTotal":1254,"reviewWordsTotal":6490,"subscriberId_productId":"72adcf9f-ede7-4232-8bc6-db71fceaf77c:shopify-6843815690423","subscriberId":"72adcf9f-ede7-4232-8bc6-db71fceaf77c"},"reviews":[{"subscriberId":"72adcf9f-ede7-4232-8bc6-db71fceaf77c","reviewId":"289c93af-f217-41a5-9b34-367f3f1d0704","subscriberId_productId":"72adcf9f-ede7-4232-8bc6-db71fceaf77c:shopify-6843815690423","productId":"shopify-6843815690423","body":"I train jiujitsu then immediately lift . This has greatly improved my recovery! I mix this with creatine","dateCreated":"2026-07-21T05:57:48.141Z","dateUpdated":"2026-07-21T05:57:48.141Z","helpfulCount":0,"isRecommended":true,"languageCode":"en","productAttributes":[{"title":"Product Standouts","type":"multi-value","value":["Ease of Use","Trust and Transparency"]}],"productHandle":"recovery-grass-fed-whey-isolate","productImageUrl":"https://cdn.shopify.com/s/files/1/1400/2351/files/Recovery_HERO-Vanilla_x280.png?v=1778013998","productName":"Recovery","productUrl":"//www.livemomentous.com/products/recovery-grass-fed-whey-isolate","productVariantName":"Vanilla","rating":5,"reviewer":{"displayName":"Florentino M.","isVerified":true},"isIncentivized":false,"status":"approved","title":"Great recovery for 2 a days ","unhelpfulCount":0,"variantId":"40138118332599"},{"subscriberId":"72adcf9f-ede7-4232-8bc6-db71fceaf77c","reviewId":"8be97331-59d0-41c4-8e26-444344d29bc1","subscriberId_productId":"72adcf9f-ede7-4232-8bc6-db71fceaf77c:shopify-6843815690423","productId":"shopify-6843815690423","body":"I like the product, I think I need to understand my bady more now they im over 40. Plus things are not recovering as fast as I thought. Overall the product is great but not like the ones I had in the past.","dateCreated":"2026-06-16T00:44:07.000Z","dateUpdated":"2026-06-16T00:44:07.000Z","externalProvider":"shopify-shop","helpfulCount":0,"isRecommended":true,"languageCode":"en","productHandle":"recovery-grass-fed-whey-isolate","productImageUrl":"https://cdn.shopify.com/s/files/1/1400/2351/files/Recovery_HERO-Chocolate_x280.png?v=1778013999","productName":"Recovery","productUrl":"//www.livemomentous.com/products/recovery-grass-fed-whey-isolate","productVariantName":"Chocolate","rating":4,"reviewer":{"displayName":"Irving"},"isIncentivized":false,"status":"approved","title":"4 Stars","unhelpfulCount":0,"variantId":"40138118299831"},{"subscriberId":"72adcf9f-ede7-4232-8bc6-db71fceaf77c","reviewId":"81140e7a-5a99-4ee6-a61a-8f7d9242f1b7","subscriberId_productId":"72adcf9f-ede7-4232-8bc6-db71fceaf77c:shopify-6843815690423","productId":"shopify-6843815690423","body":"I am a F age 44 experiencing fatigue after training/lifting and this has helped ease my recovery. I love this brand,I always feel the effects of their products in my body. 10/10","dateCreated":"2026-06-06T12:11:26.000Z","dateUpdated":"2026-06-06T12:11:26.000Z","externalProvider":"shopify-shop","helpfulCount":0,"isRecommended":true,"languageCode":"en","productHandle":"recovery-grass-fed-whey-isolate","productImageUrl":"https://cdn.shopify.com/s/files/1/1400/2351/files/Recovery_HERO-Vanilla_x280.png?v=1778013998","productName":"Recovery","productUrl":"//www.livemomentous.com/products/recovery-grass-fed-whey-isolate","productVariantName":"Vanilla","rating":5,"reviewer":{"displayName":"Lura"},"isIncentivized":false,"status":"approved","title":"5 Stars","unhelpfulCount":0,"variantId":"40138118332599"},{"subscriberId":"72adcf9f-ede7-4232-8bc6-db71fceaf77c","reviewId":"2bb2af0c-9c6d-48eb-9125-e6e6fb65a044","subscriberId_productId":"72adcf9f-ede7-4232-8bc6-db71fceaf77c:shopify-6843815690423","productId":"shopify-6843815690423","body":"I am in my upper 50's with life things that have kept me from a regular exercise routine for quite a while, but i have been for the last 27 weeks consistently doing strength training 5 days a week. Since using this about a half hour after completing my daily routine i have noticed that aches or soreness are very minimal and i am able to go at it the next day. I use the whey protein as well and i am happy with that but the recovery mix with the creatine and fiber+ do help me to feel better fast. I have even used it after a hard stretch of outdoor chores and it helps then too. ","dateCreated":"2026-05-21T22:30:24.322Z","dateUpdated":"2026-05-21T22:30:24.322Z","helpfulCount":1,"isRecommended":true,"languageCode":"en","productAttributes":[{"title":"Product Standouts","type":"multi-value","value":["Results","Ease of Use","Taste + Texture"]}],"productHandle":"recovery-grass-fed-whey-isolate","productImageUrl":"https://cdn.shopify.com/s/files/1/1400/2351/files/Recovery_HERO-Vanilla_x280.png?v=1778013998","productName":"Recovery","productUrl":"//www.livemomentous.com/products/recovery-grass-fed-whey-isolate","productVariantName":"Vanilla","rating":5,"reviewer":{"displayName":"James E.","isVerified":true},"isIncentivized":false,"status":"approved","title":"Worth including in your daily nutrition","unhelpfulCount":0,"variantId":"40138118332599"},{"subscriberId":"72adcf9f-ede7-4232-8bc6-db71fceaf77c","reviewId":"0f2be369-576e-4525-8af3-c64f02a84490","subscriberId_productId":"72adcf9f-ede7-4232-8bc6-db71fceaf77c:shopify-6843815690423","productId":"shopify-6843815690423","body":"Taste was great! This is not always the case. I find the best test is “how does it taste with water” and this passes that test! The chocolate was delicious! The texture was none existent so that was a huge plus. Often times you have good taste but the texture is bad and this was the opposite. Great taste and texture is not an issue at all. \n\nI do see a huge difference in soreness recovery time. ","dateCreated":"2026-05-21T01:09:36.995Z","dateUpdated":"2026-05-21T01:09:36.995Z","helpfulCount":1,"isRecommended":true,"languageCode":"en","productHandle":"recovery-grass-fed-whey-isolate","productImageUrl":"https://cdn.shopify.com/s/files/1/1400/2351/files/Recovery_HERO-Chocolate_x280.png?v=1778013999","productName":"Recovery","productUrl":"//www.livemomentous.com/products/recovery-grass-fed-whey-isolate","productVariantName":"Chocolate","rating":5,"reviewer":{"displayName":"Charis M.","isVerified":true},"isIncentivized":false,"status":"approved","title":"Recovery that tastes as good as it works!","unhelpfulCount":0,"variantId":"40138118299831"}],"reviewsKeywords":{"keywordTopics":[{"keywords":[{"name":"taste","occurrences":52},{"name":"flavor","occurrences":12},{"name":"sweetness","occurrences":4},{"name":"chocolate flavor","occurrences":3},{"name":"flavors","occurrences":2},{"name":"vanilla","occurrences":2},{"name":"vanilla flavor","occurrences":2},{"name":"aftertaste","occurrences":1},{"name":"chocolate","occurrences":1}],"topic":"Taste"},{"keywords":[{"name":"recovery","occurrences":20},{"name":"post-workout","occurrences":3},{"name":"muscle recovery","occurrences":1},{"name":"post workout","occurrences":1},{"name":"workout recovery","occurrences":1},{"name":"soreness","occurrences":1}],"topic":"Recovery"},{"keywords":[{"name":"mixing","occurrences":9},{"name":"mixability","occurrences":8},{"name":"texture","occurrences":8},{"name":"dissolves","occurrences":2},{"name":"consistency","occurrences":2},{"name":"dissolving","occurrences":1}],"topic":"Mixing"},{"keywords":[{"name":"workout","occurrences":8},{"name":"effectiveness","occurrences":6},{"name":"energy","occurrences":3},{"name":"workouts","occurrences":3},{"name":"performance","occurrences":2},{"name":"training","occurrences":2},{"name":"energy levels","occurrences":1},{"name":"workout performance","occurrences":1}],"topic":"Performance"},{"keywords":[{"name":"protein","occurrences":9},{"name":"carbs","occurrences":3},{"name":"macros","occurrences":2},{"name":"nutrition","occurrences":2},{"name":"sugar content","occurrences":2},{"name":"ingredients","occurrences":2},{"name":"added sugars","occurrences":1},{"name":"protein quality","occurrences":1}],"topic":"Nutrition"},{"keywords":[{"name":"digestion","occurrences":5},{"name":"digestibility","occurrences":4},{"name":"cramps","occurrences":1},{"name":"gut disruption","occurrences":1}],"topic":"Digestion"},{"keywords":[{"name":"portability","occurrences":5},{"name":"versatility","occurrences":5},{"name":"convenience","occurrences":3},{"name":"preparation","occurrences":2},{"name":"ease of use","occurrences":1},{"name":"travel","occurrences":1},{"name":"travel packs","occurrences":1}],"topic":"Convenience"}],"languageCode":"en"},"reviewsNextUrl":"https://api.okendo.io/v1/stores/72adcf9f-ede7-4232-8bc6-db71fceaf77c/products/shopify-6843815690423/reviews?limit=5&orderBy=date%20desc&lastEvaluated=%7B%22dateCreated%22%3A%222026-05-21T01%3A09%3A36.995Z%22%2C%22reviewId%22%3A%220f2be369-576e-4525-8af3-c64f02a84490%22%2C%22subscriberId_collectionId%22%3A%2272adcf9f-ede7-4232-8bc6-db71fceaf77c%3A896e9ae6-bd59-4ab0-8b66-0a2884095552%22%7D","reviewsSummary":{"body":"Customers say this recovery protein powder tastes great, with many describing the chocolate flavor as rich and smooth like hot chocolate, while the vanilla pairs well with fruits. Users report it mixes easily with water or milk without clumps and is gentle on the stomach. Many athletes appreciate the protein-to-carb ratio for post-workout recovery, noting reduced muscle soreness and improved energy levels. The convenient travel packets are frequently praised for portability. Common feedback includes faster recovery times, less fatigue after workouts, and effectiveness for endurance activities like cycling and running. Some users mention it helps with sleep quality. A few note it works better with milk than water, and one reviewer experienced digestive issues.","contributingReviewCount":100,"dateGenerated":"2026-02-26T00:08:06.464Z","datePublished":"2026-02-26T05:05:21.785Z","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": "Recovery",
"url": "https:\/\/www.livemomentous.com\/products\/recovery-grass-fed-whey-isolate",
"image":"https:\/\/www.livemomentous.com\/cdn\/shop\/files\/Recovery_HERO-Chocolate.png?v=1778013999\u0026width=1000","description": "Momentous Recovery is a performance-focused post-workout formula designed to optimize muscle repair, replenish glycogen stores, and reduce exercise-induced soreness. Featuring a clinically supported 2:1 ratio of fast-acting carbohydrates to grass-fed whey protein, plus amino acids and electrolytes, it delivers comprehensive recovery support in one simple shake.\nIdeal for endurance athletes, strength trainers, and anyone serious about recovery, this formula helps your body rebuild and rehydrate efficiently—so you can train consistently and perform at your best.","sku": "850243008598","brand": {
"@type": "Brand",
"name": "Momentous"
},"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "260",
"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": "850243008598","gtin12": "850243008598","itemCondition": "https://schema.org/NewCondition",
"availability": "https://schema.org/InStock",
"price": 42.0,
"priceCurrency": "GBP",
"url": "https:\/\/www.livemomentous.com\/products\/recovery-grass-fed-whey-isolate?variant=40138118299831","priceSpecification": [
{
"@type": "UnitPriceSpecification",
"price": 42.0,
"priceCurrency": "GBP",
"name": "One-Time Purchase"
},
{
"@type": "UnitPriceSpecification",
"price": 31.5,
"priceCurrency": "GBP",
"name": "Delivery every 1 month",
"validForMemberTier": {
"@type": "MemberProgramTier",
"@id": "#momentous-subscriber",
"name": "Subscriber"
}
}
],"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"@id": "#momentous-return-policy"
}
},
{
"@type": "Offer","sku": "850243008789","gtin12": "850243008789","itemCondition": "https://schema.org/NewCondition",
"availability": "https://schema.org/InStock",
"price": 42.0,
"priceCurrency": "GBP",
"url": "https:\/\/www.livemomentous.com\/products\/recovery-grass-fed-whey-isolate?variant=40138118332599","priceSpecification": [
{
"@type": "UnitPriceSpecification",
"price": 42.0,
"priceCurrency": "GBP",
"name": "One-Time Purchase"
},
{
"@type": "UnitPriceSpecification",
"price": 31.5,
"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": "Protein",
"item": "https:\/\/www.livemomentous.com\/collections\/protein"
},
{
"@type": "ListItem",
"position": 3,
"name": "Recovery",
"item": "https:\/\/www.livemomentous.com\/products\/recovery-grass-fed-whey-isolate"
}
]
}
]
.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 = `
We’ll notify you when the product is back in stock!
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 = '40138118299831';
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;}
window['ShopifyForms'] = {
...window['ShopifyForms'],
currentPageType: "product"
};
(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 = "6843815690423";
var productTitle = "Recovery";
var productHandle = "recovery-grass-fed-whey-isolate";
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);
})();
.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;
} Price History
Loading...
${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 = '40138118299831';
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;}
window['ShopifyForms'] = {
...window['ShopifyForms'],
currentPageType: "product"
};
(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 = "6843815690423";
var productTitle = "Recovery";
var productHandle = "recovery-grass-fed-whey-isolate";
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);
})();
.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;
} Price History
Loading...
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;}
window['ShopifyForms'] = {
...window['ShopifyForms'],
currentPageType: "product"
};
(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 = "6843815690423";
var productTitle = "Recovery";
var productHandle = "recovery-grass-fed-whey-isolate";
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);
})();
.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;
} 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;}
window['ShopifyForms'] = {
...window['ShopifyForms'],
currentPageType: "product"
};
(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 = "6843815690423";
var productTitle = "Recovery";
var productHandle = "recovery-grass-fed-whey-isolate";
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);
})();
.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;
} 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;}
window['ShopifyForms'] = {
...window['ShopifyForms'],
currentPageType: "product"
};
(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 = "6843815690423";
var productTitle = "Recovery";
var productHandle = "recovery-grass-fed-whey-isolate";
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);
})();
.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;
} 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('')}
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;}
window['ShopifyForms'] = {
...window['ShopifyForms'],
currentPageType: "product"
};
(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 = "6843815690423";
var productTitle = "Recovery";
var productHandle = "recovery-grass-fed-whey-isolate";
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);
})();
.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;
}
Price History
Loading...
