1const SHOP_URL=SHOPIFY_CONFIG.shopUrl,STOREFRONT_TOKEN=SHOPIFY_CONFIG.storefrontToken,drawer=document.getElementById("shopify-cart-drawer"),cartContent=drawer.querySelector(".cart-content"),checkoutBtn=document.getElementById("cart-checkout-btn"),cartWaiverLabel=document.getElementById("cart-waiver-label"),cartWaiverCheckbox=document.getElementById("cart-waiver-checkbox"),cartTermsSection=document.getElementById("cart-terms"),cartSubtotalEl=document.getElementById("cart-subtotal-amount"),cartCountEl=document.getElementById("cart-count"),emptyCartBtn=document.getElementById("cart-empty-btn"),headerCartBtn=document.getElementById("header-cart-btn"),headerCartBadge=document.getElementById("header-cart-badge");drawer.querySelector(".cart-close")?.addEventListener("click",()=>drawer.classList.remove("open")),emptyCartBtn?.addEventListener("click",()=>window.ShopifyCart.emptyCart());function updateHeaderBadge(t){headerCartBadge&&t>0&&(headerCartBadge.textContent=t)}headerCartBtn?.addEventListener("click",async()=>{const t=localStorage.getItem(CART_KEY);if(!t){renderCartDrawer({lines:{edges:[]},totalQuantity:0});return}const a=(await fetchShopify(` 2 query getCart($cartId: ID!) { 3 cart(id: $cartId) { ...CartFragment } 4 } 5 ${CART_FRAGMENT} 6 `,{cartId:t}))?.data?.cart;renderCartDrawer(a||{lines:{edges:[]},totalQuantity:0})});const CART_KEY="shopify_cart_id",CAPTURE_KEY="w30_compliance_capture";let termsConfigured=!1;const CART_FRAGMENT=` 7fragment CartFragment on Cart { 8 id 9 checkoutUrl 10 totalQuantity 11 cost { subtotalAmount { amount currencyCode } } 12 lines(first: 50) { 13 edges { 14 node { 15 id 16 quantity 17 attributes { key value } 18 merchandise { 19 ... on ProductVariant { 20 id 21 product { title } 22 image { url altText } 23 priceV2 { amount currencyCode } 24 } 25 } 26 } 27 } 28 } 29} 30`;async function fetchShopify(t,e={}){return(await fetch(SHOP_URL,{method:"POST",headers:{"Content-Type":"application/json","X-Shopify-Storefront-Access-Token":STOREFRONT_TOKEN},body:JSON.stringify({query:t,variables:e})})).json()}async function getOrCreateCart(){let t=localStorage.getItem(CART_KEY);if(t)return t;const a=(await fetchShopify("mutation { cartCreate { cart { id } } }"))?.data?.cartCreate?.cart?.id;return localStorage.setItem(CART_KEY,a),a}async function addToCart(t,e){const a=await getOrCreateCart();return(await fetchShopify(` 31 mutation addLines($cartId: ID!, $lines: [CartLineInput!]!) { 32 cartLinesAdd(cartId: $cartId, lines: $lines) { 33 cart { ...CartFragment } 34 } 35 } 36 ${CART_FRAGMENT} 37 `,{cartId:a,lines:[{quantity:1,merchandiseId:t,attributes:e}]}))?.data?.cartLinesAdd?.cart}async function updateCartLine(t,e){const a=localStorage.getItem(CART_KEY);return(await fetchShopify(` 38 mutation updateLines($cartId: ID!, $lines: [CartLineUpdateInput!]!) { 39 cartLinesUpdate(cartId: $cartId, lines: $lines) { 40 cart { ...CartFragment } 41 } 42 } 43 ${CART_FRAGMENT} 44 `,{cartId:a,lines:[{id:t,attributes:e}]}))?.data?.cartLinesUpdate?.cart}async function removeFromCart(t){const e=localStorage.getItem(CART_KEY);return(await fetchShopify(` 45 mutation removeLines($cartId: ID!, $lineIds: [ID!]!) { 46 cartLinesRemove(cartId: $cartId, lineIds: $lineIds) { 47 cart { ...CartFragment } 48 } 49 } 50 ${CART_FRAGMENT} 51 `,{cartId:e,lineIds:t}))?.data?.cartLinesRemove?.cart}async function emptyCart(){localStorage.removeItem(CART_KEY),renderCartDrawer({lines:{edges:[]},totalQuantity:0})}async function cartAttributesUpdate(t){const e=localStorage.getItem(CART_KEY);e&&await fetchShopify(` 52 mutation cartAttributesUpdate($cartId: ID!, $attributes: [AttributeInput!]!) { 53 cartAttributesUpdate(cartId: $cartId, attributes: $attributes) { 54 cart { id } 55 } 56 } 57 `,{cartId:e,attributes:t})}function formatMoney(t,e){return new Intl.NumberFormat("en-US",{style:"currency",currency:e||"USD"}).format(t)}window.ShopifyCart={addToCart,removeFromCart,emptyCart},cartWaiverCheckbox?.addEventListener("change",async()=>{cartWaiverCheckbox.checked?(await cartAttributesUpdate([{key:"WaiverAgreed",value:"true"}]),checkoutBtn&&checkoutBtn.removeAttribute("aria-disabled")):(await cartAttributesUpdate([{key:"WaiverAgreed",value:"false"}]),checkoutBtn&&checkoutBtn.setAttribute("aria-disabled","true"))});function phoneFormat(t){const e=t.replace(/\D/g,"").slice(0,10);let a=e;return e.length>3&&(a=e.slice(0,3)+"-"+e.slice(3)),e.length>6&&(a=e.slice(0,3)+"-"+e.slice(3,6)+"-"+e.slice(6)),a}
57const captureModal=document.querySelector(".purchase-capture-modal"),captureDateInput=captureModal?.querySelector(".purchase-capture-start-date"),captureMobileInput=captureModal?.querySelector(".purchase-capture-mobile"),captureHelper=captureModal?.querySelector(".purchase-capture-helper"),captureHeading=captureModal?.querySelector("h3"),captureSaveBtn=captureModal?.querySelector(".capture-save"),captureDateField=captureModal?.querySelector('[data-field="start-date"]'),captureMobileField=captureModal?.querySelector('[data-field="mobile"]');let activeBtn=null,activePurchaseItem=null,editingLineId=null;function getStoredCompliance(){return JSON.parse(sessionStorage.getItem(CAPTURE_KEY)||"{}")}function setStoredCompliance(t){sessionStorage.setItem(CAPTURE_KEY,JSON.stringify(t))}function openCaptureModal({showDate:t,showMobile:e,editMode:a=!1}){if(captureDateField&&(captureDateField.hidden=!t),captureMobileField&&(captureMobileField.hidden=!e),captureHeading&&(captureHeading.textContent=a?"Edit your details":"One last step"),captureSaveBtn&&(captureSaveBtn.textContent=a?"Save changes":"Continue"),t&&captureDateInput){const r=new Date;r.setDate(r.getDate()+1);const n=r.toISOString().split("T")[0];captureDateInput.min=n,captureDateInput.value||(captureDateInput.value=n)}
57captureModal.hidden=!1}function closeCaptureModal(){captureModal.hidden=!0,editingLineId=null,captureHeading&&(captureHeading.textContent="One last step"),captureSaveBtn&&(captureSaveBtn.textContent="Continue"),captureDateField&&(captureDateField.hidden=!0),captureMobileField&&(captureMobileField.hidden=!0)}captureModal?.querySelector(".purchase-item__calendar-icon")?.addEventListener("click",()=>{captureDateInput?.showPicker?.()}),captureMobileInput?.addEventListener("input",t=>{t.target.value=phoneFormat(t.target.value)}),captureModal?.querySelector(".capture-save")?.addEventListener("click",async()=>{const t=captureDateInput?.value,e=captureMobileInput?.value;if(editingLineId){if(!t&&!e)return alert("Please provide at least a start date or phone number.");if(e&&e.replace(/\D/g,"").length!==10)return alert("Phone must be 10 digits.");const a=editingLineId;closeCaptureModal();const r=await updateCartLine(a,[...t?[{key:"W30StartDate",value:t}]:[],...e?[{key:"MobileNumber",value:e}]:[]]);renderCartDrawer(r)}else{if(!t)return alert("Please select a start date.");if(e.replace(/\D/g,"").length!==10)return alert("Phone must be 10 digits.");setStoredCompliance({...getStoredCompliance(),startDate:t,mobile:e}),closeCaptureModal();const a=await addToCart(activeBtn.dataset.variantId,[...t?[{key:"W30StartDate",value:t}]:[],...e?[{key:"MobileNumber",value:e}]:[]]);renderCartDrawer(a)}}),captureModal?.querySelector(".capture-cancel")?.addEventListener("click",()=>{closeCaptureModal()}),document.querySelectorAll(".purchase-item__thumb").forEach(t=>{t.addEventListener("click",()=>{const e=t.closest(".purchase-item__image-wrapper"),a=e?.querySelector(".purchase-item__image");a&&(a.src=t.dataset.src,a.alt=t.dataset.alt),e?.querySelectorAll(".purchase-item__thumb").forEach(r=>r.classList.remove("purchase-item__thumb--active")),t.classList.add("purchase-item__thumb--active")})}),document.querySelectorAll(".variant-select").forEach(t=>{t.addEventListener("change",()=>{const e=t.value,a=t.selectedOptions[0]?.dataset.price,r=t.closest(".purchase-item, .shop-product__content-col");r?.querySelectorAll(".purchase-item__btn").forEach(n=>{n.dataset.variantId=e}),a&&r?.querySelectorAll(".purchase-item__price, .shop-product__price").forEach(n=>{n.textContent=a+" USD"})})}),document.querySelectorAll(".purchase-item__btn").forEach(t=>{const e=t.closest(".purchase-item");t.addEventListener("click",async()=>{const a=e?.dataset.isSms==="true"||t.dataset.isSms==="true",r=getStoredCompliance();if(a&&(!r.startDate||!r.mobile)){activeBtn=t,activePurchaseItem=e,openCaptureMod
57al({showDate:!0,showMobile:!0});return}const n=await addToCart(t.dataset.variantId,[...r.startDate?[{key:"W30StartDate",value:r.startDate}]:[],...r.mobile?[{key:"MobileNumber",value:r.mobile}]:[]]);renderCartDrawer(n)})});function renderCartDrawer(t){if(cartContent.innerHTML="",!t?.lines?.edges?.length){cartContent.innerHTML='<div class="cart-empty">Your cart is empty.</div>',cartCountEl.textContent="",updateHeaderBadge(0),emptyCartBtn&&(emptyCartBtn.style.display="none"),cartTermsSection&&(cartTermsSection.style.display="none"),cartSubtotalEl&&(cartSubtotalEl.textContent=formatMoney(0)),checkoutBtn&&checkoutBtn.setAttribute("aria-disabled","true"),drawer.classList.add("open");return}const e=t.totalQuantity||t.lines.edges.length;cartCountEl.textContent=e>=0?`(${e})`:"0",updateHeaderBadge(e),emptyCartBtn&&(emptyCartBtn.style.display=""),cartTermsSection&&(cartTermsSection.style.display=""),cartWaiverCheckbox&&(cartWaiverCheckbox.checked=!1),checkoutBtn&&checkoutBtn.setAttribute("aria-disabled","true");const r=document.querySelector(".purchase-collection")?.dataset.waiverLabel||'I have read and agreed with the <a href="https://whole30.com/course-waiver/" target="_blank" rel="noopener">Course Waiver</a> and <a href="https://whole30.com/terms-and-conditions/" target="_blank" rel="noopener">Terms & Conditions</a>';cartWaiverLabel&&(cartWaiverLabel.innerHTML=r),t.lines.edges.forEac
57h(({node:c})=>{const i=document.createElement("div");i.className="cart-item";const u=c.merchandise.image,d=c.attributes||[],o=d.find(l=>l.key==="W30StartDate")?.value,s=d.find(l=>l.key==="MobileNumber")?.value,m=!!o,p=!!s,y=s||o;i.innerHTML=` 58 <img class="cart-item-image" src="${u?.url||""}" alt=""> 59 <div class="cart-item-details"> 60 <div class="cart-item-name">${c.merchandise.product.title}</div> 61 <div class="cart-item-price">${c.quantity} x $${parseFloat(c.merchandise.priceV2.amount).toFixed(2)}</div> 62 ${o?`<div class="cart-item-meta"><strong>Start Date:</strong>${o}</div>`:""} 63 ${s?`<div class="cart-item-meta"><strong>Mobile:</strong>${s}</div>`:""} 64 <div class="cart-item-actions"> 65 ${y?'<button class="cart-item-edit">Edit</button>':""} 66 <button class="cart-item-remove">Remove</button> 67 </div> 68 </div> 69 `,i.querySelector(".cart-item-remove").onclick=async()=>{const l=await removeFromCart([c.id]);sessionStorage.removeItem(CAPTURE_KEY),renderCartDrawer(l)},i.querySelector(".cart-item-edit")?.addEventListener("click",()=>{editingLineId=c.id,captureDateInput&&(captureDateInput.value=o||""),captureMobileInput&&(captureMobileInput.value=s||""),openCaptureMod
69al({showDate:m,showMobile:p,editMode:!0})}),cartContent.appendChild(i)});const n=t.cost?.subtotalAmount;cartSubtotalEl&&(cartSubtotalEl.textContent=n?formatMoney(n.amount,n.currencyCode):""),checkoutBtn&&t.checkoutUrl&&(checkoutBtn.href=t.checkoutUrl),drawer.classList.add("open")}checkoutBtn?.addEventListener("click",t=>{t.preventDefault(),checkoutBtn.getAttribute("aria-disabled")!=="true"&&(window.location.href=checkoutBtn.href)}),(async()=>{const t=localStorage.getItem(CART_KEY);if(!t)return;const e=await fetchShopify(` 70 query getCart($cartId: ID!) { 71 cart(id: $cartId) { id totalQuantity } 72 } 73 `,{cartId:t});updateHeaderBadge(e?.data?.cart?.totalQuantity||0)})() 74;
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.