1(()=>{const STYLE=` 2html.itb-hide-amp-gift #slidecarthq .free-gifts .free-gifts-body .slick-wrapper{display:none!important} 3 4#slidecarthq .free-gifts-header span{font-size:1.15rem;font-weight:700;color:#253D41} 5 6#itb-add-travel-card{display:flex;gap:16px;align-items:stretch;padding:12px 0;border-top:1px solid #eee} 7#itb-add-travel-card.item{margin:0} 8#itb-add-travel-card .itb-media{flex:0 0 auto;display:flex;align-items:center} 9#itb-add-travel-card .itb-media img{width:84px;height:84px;object-fit:contain} 10#itb-add-travel-card .itb-body{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;gap:6px} 11#itb-add-travel-card .itb-title{font-weight:600;margin:0;width:100%;line-height:1} 12#itb-add-travel-card .itb-sub{opacity:.6;margin:0;font-size:14px;color:rgba(0,0,0,.6);line-height:1} 13#itb-add-travel-card .itb-tagline{margin:0;font-size:14px;color:#777544;line-height:1} 14#itb-add-travel-card .itb-action-row{display:flex;align-items:center;justify-content:space-between;margin-top:auto;gap:.5rem} 15#itb-add-travel-card .itb-price-row{display:flex;gap:.4rem;align-items:baseline} 16#itb-add-travel-card .itb-price-now{font-weight:700;font-size:1rem;color:#000} 17#itb-add-travel-card .itb-price-was{font-size:.85rem;color:#9a9a9a;text-decoration:line-through;font-weight:400} 18#itb-add-travel-card .itb-add-btn{ 19 background:#fff;border:1px solid #B0B0B0;color:#000; 20 font-size:.9rem;font-weight:700;text-transform:uppercase; 21 padding:.4rem .85rem;border-radius:0;cursor:pointer;letter-spacing:.02em 22} 23#itb-add-travel-card .itb-add-btn:hover{background:#f5f5f5} 24#itb-add-travel-card .itb-add-btn[disabled]{opacity:.6;cursor:not-allowed} 25`;function addStyle(){if(document.getElementById("itb-add-travel-style"))return;const s=document.createElement("style");s.id="itb-add-travel-style",s.textContent=STYLE,document.head.appendChild(s)}function toggleAmpGift(hide=!0){document.documentElement.classList.toggle("itb-hide-amp-gift",!!hide)}function container(){return document.querySelector("#slidecarthq .free-gifts .free-gifts-body")}let CART_CACHE=null,CART_FETCH_PROMISE=null;async function getCart(force=!1){return!force&&CART_CACHE?CART_CACHE:CART_FETCH_PROMISE||(CART_FETCH_PROMISE=fetch("/cart.js",{cache:"no-store",credentials:"same-origin"}).then(r=>r.ok?r.json():{items:[]}).then(c=>(CART_CACHE=c,c)).catch(()=>({items:[]})).finally(()=>{CART_FETCH_PROMISE=null}),CART_FETCH_PROMISE)}
25function invalidateCart(){CART_CACHE=null}function cartHasGiftType(cart,type){return!cart||!Array.isArray(cart.items)?!1:cart.items.some(it=>it&&it.properties&&it.properties._amp_gift===type)}async function refreshSlideCart(){await new Promise(resolve=>{if(typeof window.SLIDECART_UPDATE=="function"){let done=!1;try{window.SLIDECART_UPDATE(()=>{done=!0,resolve()})}catch{resolve();return}setTimeout(()=>{done||resolve()},800)}else resolve()}),["cart:updated","itb:cart:refresh"].forEach(ev=>{try{document.dispatchEvent(new CustomEvent(ev,{bubbles:!0,cancelable:!0}))}catch{}})}function cartHas50ml(cart){return!cart||!Array.isArray(cart.items)?!1:cart.items.some(it=>{const t=(it.variant_title||it.title||"").toLowerCase(),opts=it.options||it.variant_options||[],o1=String(opts[0]||"").toLowerCase();return t.includes("50ml")||o1.includes("50ml")})}function is50mlItem(it){const t=(it.variant_title||it.title||"").toLowerCase(),opts=it.options||it.variant_options||[],o1=String(opts[0]||"").toLowerCase();return t.includes("50ml")||o1.includes("50ml")}function isTravelVariant(v){const t=(v.title||"").toLowerCase(),opts=v.options||[],o1=String(opts[0]||"").toLowerCase();return t.includes("10ml")||o1.includes("10ml")||t.includes("travel")||o1.includes("travel")}function formatMoney(pence){return"\xA3"+(pence/100).toFixed(2)}const PRODUCT_CACHE={};async function getProductByHandle(handle){if(!handle)return null;if(PRODUCT_CACHE[handle])return PRODUCT_CACHE[handle];try{const r=await fetch("/products/"+encodeURIComponent(handle)+".js",{cache:"no-store",credentials:"same-origin"});if(!r.ok)return null;const p=await r.json();return PRODUCT_CACHE[handle]=p,p}catch{return null}}async function findTravelData(cart){if(!cart||!Array.isArray(cart.items))return null;const items=cart.items.slice().reverse();for(const item of items){if(!is50mlItem(item))continue;const handle=item.handle;if(!handle)continue;const product=await getProductByHandle(handle);
25if(!product||!Array.isArray(product.variants))continue;const travel=product.variants.find(isTravelVariant);if(!travel)continue;const wasP=travel.price,nowP=Math.round(wasP*.6);return{mainTitle:product.title,mainProductId:product.id,travelVariantId:travel.id,priceNow:formatMoney(nowP),priceWas:formatMoney(wasP)}}return null}let CURRENT_DATA=null;async function ensureCard(){const host=container();if(!host)return;const cart=await getCart();if(cartHasGiftType(cart,"travel40")){const existing=document.getElementById("itb-add-travel-card");existing&&existing.remove(),CURRENT_DATA=null;return}if(!cartHas50ml(cart)){const existing=document.getElementById("itb-add-travel-card");existing&&existing.remove(),CURRENT_DATA=null;return}const data=await findTravelData(cart);if(!data||!data.travelVariantId){const existing=document.getElementById("itb-add-travel-card");existing&&existing.remove(),CURRENT_DATA=null;return}CURRENT_DATA=data;let el=document.getElementById("itb-add-travel-card");if(el&&el.classList.add("item"),!el)el=document.createElement("div"),el.id="itb-add-travel-card",el.classList.add("item"),el.innerHTML=` 26 <div class="itb-media"> 27 <img src="https://cdn.shopify.com/s/files/1/0653/7091/5035/files/100ffm.jpg" alt="Add the travel size"/> 28 </div> 29 <div class="itb-body"> 30 <div class="itb-title">Add the travel size, 40% off</div> 31 <div class="itb-sub">Size: 10ml Perfume</div> 32 <div class="itb-tagline">Same scent, yours for just 15 more</div> 33 <div class="itb-action-row"> 34 <button type="button" class="itb-add-btn">ADD +</button> 35 <div class="itb-price-row"> 36 <span class="itb-price-now">${data.priceNow||""}</span> 37 <span class="itb-price-was">${data.priceWas||""}</span> 38 </div> 39 </div> 40 </div>`,el.querySelector(".itb-add-btn").addEventListener("click",onAddClick);else{const now=el.querySelector(".itb-price-now"),was=el.querySelector(".itb-price-was");now&&(now.textContent=data.priceNow||""),was&&(was.textContent=data.priceWas||"")}el.parentElement!==host&&host.prepend(el)}async function onAddClick(e){e.preventDefault();const btn=e.currentTarget,data=CURRENT_DATA;if(!(!data||!data.travelVariantId)){btn.setAttribute("disabled","true"),btn.textContent="ADDING\u2026";try{if(!(await fetch("/cart/add.js",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({items:[{id:Number(data.travelVariantId),quantity:1,properties:{_amp_gift:"travel40"}}]}),cache:"no-store",credentials:"same-origin"})).ok)throw new Error("add.js failed");invalidateCart(),await refreshSlideCart()}catch(err){console.error("[AddTheTravelSize] add failed",err)}finally{btn.removeAttribute("disabled"),btn.textContent="ADD +"}}}function waitForElm(sel){return new Promise(resolve=>{const e=document.querySelector(sel);if(e)return resolve(e);const mo=new MutationObserver(()=>{const n=document.querySelector(sel);n&&(mo.disconnect(),resolve(n))});mo.observe(document.documentElement,{childList:!0,subtree:!0})})}const debounce=(fn,t=60)=>{let id;return(...a)=>{clearTimeout(id),id=setTimeout(()=>fn(...a),t)}};function reattach(){document.querySelector("#slidecarthq .free-gifts .free-gifts-body")&&(addStyle(),invalidateCart(),ensureCard())}function boot(){addStyle(),toggleAmpGift(!0),ensureCard()}waitForElm("#slidecarthq .free-gifts .free-gifts-body").then(()=>{reattach();const target=document.querySelector("#slidecarthq .free-gifts .free-gifts-body");new MutationObserver(debounce(reattach,60)).observe(target,{childList:!0,subtree:!0})}),["shopify:section:load","itb:cart:refresh","cart:updated","cart:refresh","cart:changed","SLIDECARTHQ:updated"].forEach(evt=>{const handler=()=>{invalidateCart(),reattach()};document.addEventListener(evt,handler,{passive:!0}),window.addEventListener(evt,handler,{passive:!0})}),(function(){(sel=>new Promise(r=>{const e=document.querySelector(sel);if(e)return r(e);const mo=new MutationObserver(()=>{const n=document.querySelector(sel);n&&(mo.disconnect(),r(n))});mo.observe(document.documentElement,{childList:!0,subtree:!0})}
40))("#slidecarthq").then(drawer=>{let t;new MutationObserver(()=>{clearTimeout(t),t=setTimeout(()=>{reattach()},120)}).observe(drawer,{childList:!0,subtree:!0})})})(),boot()})(); 41//# sourceMappingURL=/cdn/shop/t/43/assets/AddTheTravelSize.js.map?v=172970130807628943941780072733
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.