SPRING SALE: Enjoy up to 50% off your favourite products + FREE Flexy Paddle Brush (worth £10) when you spend £25!✨
-
SAVE 20%
Satin Heatless Curlers
Satin Heatless Curlers
Regular price
Regular price
£10.00Sale price £8.00Unit price / per
Save £2.00
Sale
SAVE 25%
2x Satin Pillowcase Bundle
2x Satin Pillowcase Bundle
Regular price
Regular price
£20.00Sale price £15.00Unit price / per
Save £5.00
Sale
SAVE 25%
Regular price
Regular price
£20.00Sale price £15.00Unit price / per
Save £5.00
Sale
Rejuvenating Overnight Cream
Rejuvenating Overnight Cream
Regular price
Regular price
£15.00Sale price £12.00Unit price / per
Save £3.00
Sale
Satin Pillowcase
Satin Pillowcase
Regular price
Regular price
£10.00Sale price £8.00Unit price / per
Save £2.00
Sale
Coco Blush Bath Salts
Coco Blush Bath Salts
Regular price
Regular price
£12.00Sale price £5.00Unit price / per
Save £7.00
Sale
NEW IN
Retinol Serum
Retinol Serum
Regular price
Regular price
£12.00Sale price £10.00Unit price / per
Save £2.00
Sale
` : `
{$_upsell_cart_drawer_product_title_$}{$_upsell_cart_drawer_product_price_$}
`; productInfoTemplate = productInfoTemplate.replaceAll('{$_upsell_cart_drawer_product_link_$}', `/products/${product.handle}`); const productTitle = (product.variants.length === 1 && product.variants[0].title !== 'Default Title') ? `${product.title}: ${product.variants[0].title}` : product.title; productInfoTemplate = productInfoTemplate.replaceAll('{$_upsell_cart_drawer_product_title_$}', productTitle); productInfoTemplate = productInfoTemplate.replaceAll('{$_upsell_cart_drawer_product_image_$}', product.images[0].src); productInfoTemplate = productInfoTemplate.replaceAll('{$_upsell_cart_drawer_product_price_$}', window.BOLD.common.Shopify.formatMoney(product.variants[0].price)); template = template.replaceAll('{$_upsell_cart_drawer_product_info_$}', productInfoTemplate); singleOfferContainer.innerHTML += template; if (product.upsell_offer_settings.show_qty_box || window.BOLD.cartDrawerWidget.showQuantityInput ) { let quantityTemplate = '
{$_upsell_cart_drawer_product_disclaimer_$}
'; const maxQuantity = product.upsell_offer_settings.disclaimer_qty || null; if (maxQuantity) { quantityTemplate = quantityTemplate.replaceAll('{$_cart_drawer_offer_max_quantity_$}', maxQuantity); } else { quantityTemplate = quantityTemplate.replaceAll('max="{$_cart_drawer_offer_max_quantity_$}"', ''); } if (product.upsell_offer_settings.disclaimer) { quantityTemplate = quantityTemplate.replaceAll('{$_upsell_cart_drawer_product_disclaimer_$}', product.upsell_offer_settings.disclaimer_text); } else { quantityTemplate = quantityTemplate.replaceAll('{$_upsell_cart_drawer_product_disclaimer_$}', ''); } singleOfferContainer.querySelector('.upsell-cart-drawer-quantity-container').innerHTML = quantityTemplate } if (product.variants.length > 1) { const variantsSelect = document.createElement('select'); variantsSelect.className = 'upsell_cart_drawer_variant_selector'; product.variants.map(function (variant) { let variantsTemplate = `
`; variantsTemplate = variantsTemplate.replaceAll("{$_upsell_cart_drawer_variant_title_$}", variant.title); variantsTemplate = variantsTemplate.replaceAll("{$_upsell_cart_drawer_variant_id_$}", variant.id); variantsTemplate = variantsTemplate.replaceAll("{$_upsell_cart_drawer_variant_price_$}", variant.price); variantsSelect.innerHTML += variantsTemplate; }); const variantContainer = singleOfferContainer.querySelector('.upsell_cart_drawer_variant_selector_container'); variantContainer.innerHTML = variantsSelect.outerHTML; } if (offerDetails.products.length > 1) { for (let i = 0; i < offerDetails.products.length; i++) { const variantsSelect = document.createElement('span'); variantsSelect.className = 'upsell_cart_drawer_progress_bar_circle' + (i === index ? '' : ' grey'); variantsSelect.innerHTML = '⬤'; singleOfferContainer.querySelector('.upsell_cart_drawer_progress_bar').innerHTML += variantsSelect.outerHTML; } } return singleOfferContainer.innerHTML; }); return filledTemplates; } function addCartDrawerEventListeners(offerDetails) { document.querySelectorAll('.cart-drawer-upsell-offer').forEach(function (productOffer) { const variantSelector = productOffer.querySelector('.upsell_cart_drawer_variant_selector'); const addToCartSelector = productOffer.querySelector('.product-offer-add-to-cart-button'); const quantitySelector = productOffer.querySelector('.upsell-cart-drawer-bold-quantity-input'); const priceSelector = productOffer.querySelector('.product-offer-price'); if (variantSelector) { variantSelector.addEventListener('change', function (event) { event.preventDefault(); // Get variant ID and Price const selectTarget = event.target; const selectedOption = selectTarget.options[selectTarget.selectedIndex]; const variantId = selectedOption.dataset['boldVariantId']; const variantPrice = selectedOption.dataset['boldVariantPrice']; // Update price display priceSelector.innerText = window.BOLD.common.Shopify.formatMoney(variantPrice); // Update add to cart event (to add correct variant ID) addToCartSelector.dataset['boldVariantId'] = variantId; }); } if (quantitySelector) { quantitySelector.addEventListener('change', function (event) { event.preventDefault(); const quantitySelect = event.target; const quantity = quantitySelect.value; addToCartSelector.dataset['boldQuantity'] = quantity; }); } addToCartSelector.addEventListener('click', function (event) { event.preventDefault(); const atc = event.currentTarget; const variantId = atc.dataset['boldVariantId']; const quantity = atc.dataset['boldQuantity']; const productId = atc.dataset['boldProductId']; const requestBody = { items: [ { id: parseInt(variantId), quantity: parseInt(quantity), productId: parseInt(productId), sections: "cart-items,cart-icon-bubble,cart-live-region-text,cart-footer" }]}; addItemToCart(requestBody, productId, offerDetails); }); }); const backArrow = document.querySelector('.product-offer-back-arrow'); if (backArrow) { backArrow.addEventListener('click', function (event) { event.preventDefault(); const upsellOffer = document.querySelector('.cart-drawer-upsell-offer:not(.hidden)'); upsellOffer.classList.add('hidden'); if (upsellOffer.previousElementSibling) { upsellOffer.previousElementSibling.classList.remove('hidden'); } else { upsellOffer.parentElement.lastElementChild.classList.remove('hidden'); } }); } const nextArrow = document.querySelector('.product-offer-next-arrow'); if (nextArrow) { nextArrow.addEventListener('click', function (event) { event.preventDefault(); const upsellOffer = document.querySelector('.cart-drawer-upsell-offer:not(.hidden)'); upsellOffer.classList.add('hidden'); if (upsellOffer.nextElementSibling) { upsellOffer.nextElementSibling.classList.remove('hidden'); } else { upsellOffer.parentElement.firstElementChild.classList.remove('hidden'); } }); } } function renderCartDrawerWidget(result) { const offerCarousels = document.querySelectorAll('.product-offer-carousel'); if (offerCarousels.length) { offerCarousels.forEach(function (offerCarousel) { offerCarousel.remove() }); } const widgetElement = document.createElement('div'); widgetElement.className = 'product-offer-carousel'; const containerElement = document.createElement('div'); containerElement.className = 'product-offer-container'; const renderedTemplate = fillCartDrawerTemplates(result); renderedTemplate.map(function(productOffer) { containerElement.innerHTML += productOffer; }); widgetElement.innerHTML += containerElement.outerHTML; if (result.products && result.products.length > 1) { const backArrowElement = document.createElement('div'); backArrowElement.className = 'product-offer-back-arrow'; backArrowElement.innerText = '<'; widgetElement.innerHTML += backArrowElement.outerHTML; const nextArrowElement = document.createElement('div'); nextArrowElement.className = 'product-offer-next-arrow'; nextArrowElement.innerText = '>'; widgetElement.innerHTML += nextArrowElement.outerHTML; } if (result.products && result.products.length > 0) { let placementElement = ''; const cartDrawerAnchor = getCartDrawerAnchor(); if (cartDrawerAnchor) { cartDrawerAnchor.insertAdjacentHTML('beforebegin', widgetElement.outerHTML); } } } function getCartDrawerAnchor() { if (false) { if (document.querySelector('bold-cart-drawer') || document.querySelector('.cart-drawer__footer')) { switch (window.BOLD.cartDrawerWidget.offerPosition) { case 'top': return document.querySelector('bold-cart-drawer-items').previousElementSibling; case 'middle': return document.querySelector('bold-cart-drawer-items'); case 'bottom': return document.querySelector('.cart-drawer__footer'); default: return document.querySelector('bold-cart-drawer-items'); } } } else { if (document.querySelector("cart-drawer-items") || document.querySelector(".cart-drawer__footer")) { switch (window.BOLD.cartDrawerWidget.offerPosition) { case 'top': return document.querySelector("cart-drawer-items").previousElementSibling; case 'middle': return document.querySelector("cart-drawer-items"); case 'bottom': return document.querySelector(".cart-drawer__footer"); default: return document.querySelector("cart-drawer-items"); } } } return null; } function fetchCartDrawerOfferData() { fetch('/cart.json') .then(function (response) { return response.json() }) .then(function (cartObject) { newCart = cartObject; const customCartDrawer = document.querySelector('bold-cart-drawer.bold-custom-cart-drawer'); if (customCartDrawer && typeof customCartDrawer.renderCustomCartDrawer === 'function') { customCartDrawer.renderCustomCartDrawer(); } if (cartObject && cartObject.items.length) { const shopDomain = Shopify.shop; const cartBody = { data: { cart: cartObject } }; fetch(`${window.BOLD.upsell.path}${shopDomain}/get_cart_drawer_offer`, { "headers": {"accept": "application/json"}, "body": JSON.stringify(cartBody), "method": "POST" }) .then(function(response) { return response.json() }) .then(function (result) { newOffer = result; //Fill Template if (result && JSON.stringify(newOffer) !== JSON.stringify(oldOffer)) { renderCartDrawerWidget(result); addCartDrawerEventListeners(result); } oldOffer = newOffer; }); } }); } document.addEventListener('BOLD_upsell_loaded', function () { clearInterval(isUpsellReady); BOLD.common.eventEmitter.on('BOLD_COMMON_cart_loaded', function () { if (Shopify.designMode) { renderCartDrawerWidget(MOCK_DATA); addCartDrawerEventListeners(MOCK_DATA); } else { if(getCartDrawerAnchor()) { fetchCartDrawerOfferData(); } } }); BOLD.common.eventEmitter.emit('BOLD_COMMON_cart_loaded'); });