PageSourceSearch

https://whole30.com/wp-content/litespeed/js/33f67633ff8814158ab382d52ff90bd4.js?ver=0cc2a

js whole30.com collected 2026-10-02 06:15:53 UTC 11,849 bytes, 74 lines download raw bytes

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 &amp; 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.