PageSourceSearch

https://pupford.com/cdn/shop/t/104/assets/pupford-cart-drawer-custom.js?v=11428371644885896061790618900

js pupford.com collected 2026-10-01 14:39:07 UTC 58,473 bytes, 45 lines download raw bytes

1(function(){if(window.__PUPFORD_NATIVE_CART_CUSTOM_LOADED__)return;window.__PUPFORD_NATIVE_CART_CUSTOM_LOADED__=!0;const CUSTOM_MOUNT_SELECTOR="#pupford-cart-rewards, #pupford-cart-upsell, #pupford-cart-checkout",observedPerksMounts=new WeakSet;let drawerStateObserver=null,drawerContentObserver=null,renderScheduled=!1,renderForce=!1,renderOptions={bypassCooldown:!1},renderInFlight=!1,renderInFlightForce=!1,renderRetryQueued=!1,suppressObserver=!1,lastKnownCart=null,fallbackUpsellState={key:"",candidate:null,promise:null},lastCartFetchAt=0,lastDrawerSectionRefreshAt=0,lastFetchErrorAt=0,recoDiscountRateCache=0,recoDiscountRateFetchPromise=null,recoDiscountRateFetchedAt=0;const CART_FETCH_COOLDOWN_MS=1200,DRAWER_SECTION_REFRESH_COOLDOWN_MS=1200,CART_FETCH_ERROR_LOG_COOLDOWN_MS=8e3,CART_FETCH_RETRY_LIMIT=4,RECO_DISCOUNT_FETCH_COOLDOWN_MS=2e3;function isCartDebugEnabled(){try{const params=new URLSearchParams(window.location.search);return params.get("cart_debug")==="1"?window.localStorage?.setItem("PUPFORD_CART_DEBUG","1"):params.get("cart_debug")==="0"&&window.localStorage?.removeItem("PUPFORD_CART_DEBUG"),window.localStorage?.getItem("PUPFORD_CART_DEBUG")==="1"}catch{return!1}}function summarizeCart(cart){return!cart||typeof cart!="object"?{type:typeof cart}:{itemCount:cart.item_count,totalPrice:cart.total_price,itemsLength:Array.isArray(cart.items)?cart.items.length:void 0,hasSections:!!cart.sections,sectionKeys:cart.sections?Object.keys(cart.sections):[]}}function cartDebug(label,detail={}){if(!isCartDebugEnabled())return;const event={label,t:Math.round(performance.now()),drawerActive:isDrawerActive(),suppressObserver,renderScheduled,renderForce,renderInFlight,renderRetryQueued,...detail};window.__pupfordCartDebugEvents=window.__pupfordCartDebugEvents||[],window.__pupfordCartDebugEvents.push(event),window.__pupfordCartDebugEvents.length>200&&window.__pupfordCartDebugEvents.shift(),console.log("[Pupford cart debug]",label,event)}function getConfig(){return window.PUPFORD_CART_CONFIG||{}}function getUpsellProducts(){const products=getConfig().upsellProducts;return Array.isArray(products)?products:[]}function getCartProductRecommendations(){const recommendations=getConfig().cartProductRecommendations;return Array.isArray(recommendations)?recommendations:[]}function escapeHtml(value){return String(value||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function normalizeProductPath(url){if(!url)return"";try{return new URL(url,window.location.origin).pathname}catch{const raw=String(url).trim();return raw?raw.startsWith("/")?raw:"/"+raw.replace(/^\.\//,""):""}}function normalizeVariantId(value){const raw=String(value??"").trim();if(!raw)return"";if(/^\d+$/.test(raw))return raw;const gidMatch=raw.match(/\/(\d+)(?:\?.*)?$/);return gidMatch?gidMatch[1]:""}function formatCentsAsMoney(cents,currencyCode){const amount=Number(cents||0)/100,currency=String(currencyCode||window.Shopify?.currency?.active||"USD");try{return new Intl.NumberFormat(void 0,{style:"currency",currency}).format(amount)}catch{return`$${amount.toFixed(2)}`}}function delay(ms){return new Promise(resolve=>setTimeout(resolve,ms))}function normalizeCartState(cart){if(!cart||typeof cart!="object")return null;const items=Array.isArray(cart.items)?cart.items:[],itemCountFromItems=items.reduce((sum,item)=>sum+Number(item?.quantity||0),0);return{...cart,items,currency:String(cart.currency||window.Shopify?.currency?.active||"USD"),total_price:Number(cart.total_price||0),item_count:Number(cart.item_count||itemCountFromItems||0)}}function getInitialCartState(){return normalizeCartState(getConfig().cartState||null)}function parseReviewCount(value){if(value==null||value==="")return 0;if(typeof value=="number"&&Number.isFinite(value))return Math.max(0,Math.round(value));const match=String(value).replace(/,/g,"").trim().toLowerCase().match(/(\d+(?:\.\d+)?)\s*([km])?/);if(!match)return 0;const numeric=Number(match[1]);if(!Number.isFinite(numeric))return 0;const multiplier=match[2]==="m"?1e6:match[2]==="k"?1e3:1;return Math.max(0,Math.round(numeric*multiplier))}function formatReviewCount(value){const count=parseReviewCount(value);if(!count)return"";if(count>=1e3){const thousands=count/1e3,rounded=thousands>=100?Math.round(thousands):Math.round(thousands*10)/10;return`${Number.isInteger(rounded)?String(rounded):String(rounded).replace(/\.0$/,"")}k+`}return`${count}+`}function buildDisplayTitle(baseTitle,suffixRaw){const title=String(baseTitle||"").trim();if(!title)return"";const suffix=String(suffixRaw||"").trim();if(!suffix)return title;const suffixLabel=` - ${suffix}`;
1return title.endsWith(suffixLabel)?title.slice(0,-suffixLabel.length).trim():title}function normalizeSizeLabel(value){const label=String(value||"").trim();return!label||/^default title$/i.test(label)?"":label}function getTitleSuffixFromConfig(productId,handle){const config=getConfig(),byId=config?.titleSuffixByProductId||{},byHandle=config?.titleSuffixByHandle||{},suffixFromId=byId&&productId?byId[String(productId)]:"";if(suffixFromId)return String(suffixFromId).trim();const suffixFromHandle=byHandle&&handle?byHandle[String(handle)]:"";return String(suffixFromHandle||"").trim()}function getReviewCountFromConfig(productId,handle){const config=getConfig(),byId=config?.reviewCountByProductId||{},byHandle=config?.reviewCountByHandle||{},fromId=byId&&productId?byId[String(productId)]:"";return fromId!=null&&String(fromId).trim()!==""?fromId:byHandle&&handle?byHandle[String(handle)]:""}function getFallbackVariantSizeLabel(product,variant){if(!product||!variant)return"";const sizeIndex=(Array.isArray(product.options)?product.options.map(name=>String(name||"")):[]).findIndex(name=>name.trim().toLowerCase()==="size");let value="";return sizeIndex===0&&(value=variant.option1),sizeIndex===1&&(value=variant.option2),sizeIndex===2&&(value=variant.option3),value||(value=variant.title),normalizeSizeLabel(value)}function getCartKey(cart){return(Array.isArray(cart?.items)?cart.items:[]).map(item=>{const variantId=normalizeVariantId(item?.variant_id||item?.variantId||item?.id||""),productId=String(item?.product_id||"").trim();return`${variantId||productId}:${Number(item?.quantity||0)}`}).sort().join("|")}function parseDiscountRate(value){if(value==null||value==="")return 0;const raw=String(value).trim();if(!raw)return 0;const match=raw.match(/-?\d+(?:\.\d+)?/);if(!match)return 0;const numeric=Number(match[0]);return!Number.isFinite(numeric)||numeric<=0?0:numeric<=1?Math.max(0,Math.min(1,numeric)):Math.max(0,Math.min(1,numeric/100))}function getRecommendationDiscountRate(cart){const configRate=parseDiscountRate(getConfig()?.recommendationDiscountPercent);if(configRate>0)return configRate;const attributes=cart?.attributes&&typeof cart.attributes=="object"?cart.attributes:{},knownKeys=["_cart_reco_discount_pct","_pupford_reco_discount_pct","_pupford_recommendation_discount_pct","pupford_reco_discount_pct","pupford_recommendation_discount_pct","reco_discount_pct","recommendation_discount_pct","_reco_discount_pct","_pupford_reco_discount_percent","pupford_reco_discount_percent","reco_discount_percent","recommendation_discount_percent"];for(const key of knownKeys){const rate=parseDiscountRate(attributes[key]);if(rate>0)return rate}for(const[key,value]of Object.entries(attributes)){const keyLc=String(key||"").toLowerCase();if(!/reco|recommend/.test(keyLc)||!/discount|pct|percent|rate/.test(keyLc))continue;const rate=parseDiscountRate(value);if(rate>0)return rate}return 0}function toCssPixels(value,fallbackPx){const numeric=Number(value);return Number.isFinite(numeric)?`${numeric}px`:fallbackPx}function toCssPercent(value,fallbackPercent){const numeric=Number(value);return Number.isFinite(numeric)?`${numeric}%`:fallbackPercent}function normalizeFlexAlign(value){const raw=String(value||"").trim().toLowerCase();return raw==="start"||raw==="top"||raw==="flex-start"?"flex-start":raw==="end"||raw==="bottom"||raw==="flex-end"?"flex-end":"center"}function applyRecommendationBadgeStyles(mount){if(!mount)return;const badge=getConfig()?.recommendationBadge||{},badgeMobile=getConfig()?.recommendationBadgeMobile||{},reviewsBadge=getConfig()?.recommendationReviews||{},cta=getConfig()?.recommendationCta||{};mount.style.setProperty("--pupford-reco-badge-bg",String(badge.backgroundColor||"#ddf3e6")),mount.style.setProperty("--pupford-reco-badge-color",String(badge.textColor||"#2e7d4c")),mount.style.setProperty("--pupford-reco-badge-border-color",String(badge.borderColor||"#d9d1d1")),mount.style.setProperty("--pupford-reco-badge-border-width",toCssPixels(badge.borderWidth,"1px")),mount.style.setProperty("--pupford-reco-badge-font-size",toCssPixels(badge.fontSize,"14px")),mount.style.setProperty("--pupford-reco-badge-font-we
1ight",String(badge.fontWeight||"700")),mount.style.setProperty("--pupford-reco-badge-min-height",toCssPixels(badge.minHeight,"22px")),mount.style.setProperty("--pupford-reco-badge-padding-x",toCssPixels(badge.paddingX,"10px")),mount.style.setProperty("--pupford-reco-badge-padding-y",toCssPixels(badge.paddingY,"0px")),mount.style.setProperty("--pupford-reco-badge-top",toCssPixels(badge.topOffset,"0px")),mount.style.setProperty("--pupford-reco-badge-right",toCssPixels(badge.rightOffset,"0px")),mount.style.setProperty("--pupford-reco-badge-radius-tl",toCssPixels(badge.radiusTopLeft,"0px")),mount.style.setProperty("--pupford-reco-badge-radius-tr",toCssPixels(badge.radiusTopRight,"10px")),mount.style.setProperty("--pupford-reco-badge-radius-br",toCssPixels(badge.radiusBottomRight,"0px")),mount.style.setProperty("--pupford-reco-badge-radius-bl",toCssPixels(badge.radiusBottomLeft,"10px")),mount.style.setProperty("--pupford-reco-badge-mobile-font-size",toCssPixels(badgeMobile.fontSize,"var(--pupford-reco-badge-font-size)")),mount.style.setProperty("--pupford-reco-badge-mobile-min-height",toCssPixels(badgeMobile.minHeight,"var(--pupford-reco-badge-min-height)")),mount.style.setProperty("--pupford-reco-badge-mobile-padding-x",toCssPixels(badgeMobile.paddingX,"var(--pupford-reco-badge-padding-x)")),mount.style.setProperty("--pupford-reco-badge-mobile-padding-y",toCssPixels(badgeMobile.paddingY,"var(--pupford-reco-badge-padding-y)")),mount.style.setProperty("--pupford-reco-badge-mobile-top",toCssPixels(badgeMobile.topOffset,"var(--pupford-reco-badge-top)")),mount.style.setProperty("--pupford-reco-badge-mobile-right",toCssPixels(badgeMobile.rightOffset,"var(--pupford-reco-badge-right)")),mount.style.setProperty("--pupford-reco-rating-font-size",toCssPixels(reviewsBadge.fontSize,"11px")),mount.style.setProperty("--pupford-reco-rating-padding-x",toCssPixels(reviewsBadge.paddingX,"8px")),mount.style.setProperty("--pupford-reco-rating-padding-y",toCssPixels(reviewsBadge.paddingY,"4px")),mount.style.setProperty("--pupford-reco-rating-gap",toCssPixels(reviewsBadge.gap,"4px")),mount.style.setProperty("--pupford-reco-rating-star-size",toCssPixels(reviewsBadge.starSize,"11px")),mount.style.setProperty("--pupford-reco-rating-mobile-font-size",toCssPixels(reviewsBadge.mobileFontSize,"var(--pupford-reco-rating-font-size)")),mount.style.setProperty("--pupford-reco-rating-mobile-padding-x",toCssPixels(reviewsBadge.mobilePaddingX,"var(--pupford-reco-rating-padding-x)")),mount.style.setProperty("--pupford-reco-rating-mobile-padding-y",toCssPixels(reviewsBadge.mobilePaddingY,"var(--pupford-reco-rating-padding-y)")),mount.style.setProperty("--pupford-reco-rating-mobile-gap",toCssPixels(reviewsBadge.mobileGap,"var(--pupford-reco-rating-gap)")),mount.style.setProperty("--pupford-reco-rating-mobile-star-size",toCssPixels(reviewsBadge.mobileStarSize,"var(--pupford-reco-rating-star-size)")),mount.style.setProperty("--pupford-reco-cta-width",toCssPercent(cta.widthPercent,"100%")),mount.style.setProperty("--pupford-reco-cta-font-size",toCssPixels(cta.fontSize,"14px")),mount.style.setProperty("--pupford-reco-cta-mobile-font-size",toCssPixels(cta.mobileFontSize,"var(--pupford-reco-cta-font-size)")),mount.style.setProperty("--pupford-reco-cta-padding-x",toCssPixels(cta.paddingX,"16px")),mount.style.setProperty("--pupford-reco-cta-padding-y",toCssPixels(cta.paddingY,"0px"))}function applyLineItemImageStyles(elements){const inner=elements?.inner;if(!inner)return;const image=getConfig()?.lineItemImage||{};inner.style.setProperty("--pupford-cart-line-image-size-desktop",toCssPixels(image.sizeDesktop,"108px")),inner.style.setProperty("--pupford-cart-line-image-column-desktop",toCssPixels(image.columnDesktop,"108px")),inner.style.setProperty("--pupford-cart-line-image-size-mobile",toCssPixels(image.sizeMobile,"108px")),inner.style.setProperty("--pupford-cart-line-image-column-mobile",toCssPixels(image.columnMobile,"108px")),inner.style.setProperty("--pupford-cart-line-image-align-y",normalizeFlexAlign(image.verticalAlign))}function fetchRecommendationDiscountRate(){const now=Date.now();return recoDiscountRateFetchedAt>
10&&now-recoDiscountRateFetchedAt<RECO_DISCOUNT_FETCH_COOLDOWN_MS?Promise.resolve(recoDiscountRateCache):recoDiscountRateFetchPromise||(recoDiscountRateFetchPromise=fetch("/cart.js",{headers:{Accept:"application/json"},credentials:"same-origin"}).then(response=>response.ok?response.json():null).then(cart=>{const rate=getRecommendationDiscountRate(cart||{});return cart&&(recoDiscountRateCache=rate,recoDiscountRateFetchedAt=Date.now()),rate||0}).catch(()=>0).finally(()=>{recoDiscountRateFetchPromise=null}),recoDiscountRateFetchPromise)}function parseMoneyToCents(value){const raw=String(value||"").replace(/\u00a0/g," ").trim();if(!raw)return 0;const cleaned=raw.replace(/[^0-9.,-]/g,"");if(!cleaned)return 0;const separators=[...cleaned.matchAll(/[.,]/g)];let normalized=cleaned.replace(/[.,]/g,"");if(separators.length){const lastSeparatorIndex=separators[separators.length-1].index,decimalDigits=cleaned.slice(lastSeparatorIndex+1).replace(/\D/g,""),integerDigits=cleaned.slice(0,lastSeparatorIndex).replace(/\D/g,"");decimalDigits.length>0&&decimalDigits.length<=2?normalized=`${integerDigits||"0"}.${decimalDigits.padEnd(2,"0").slice(0,2)}`:normalized=cleaned.replace(/[.,]/g,"")}const numeric=Number(normalized);return Number.isFinite(numeric)?Math.max(0,Math.round(numeric*100)):0}function buildCartStateFromLiveDrawer(){const rows=Array.from(document.querySelectorAll("#CartDrawer-CartItems .cart-item")),currency=String(getConfig()?.cartState?.currency||window.Shopify?.currency?.active||"USD");if(!rows.length)return normalizeCartState({item_count:0,total_price:0,currency,items:[]});const items=rows.map(row=>{const quantityInput=row.querySelector(".quantity__input"),quantity=Math.max(0,Number(quantityInput?.value||0)),variantId=normalizeVariantId(quantityInput?.dataset?.quantityVariantId||row.dataset.variantId||row.querySelector(".cart-remove-button")?.dataset?.variantId||""),discountedPriceElement=row.querySelector(".cart-item__discounted-prices .secondary-color-dark.price")||row.querySelector(".cart-item__discounted-prices .price--end:not(.cart-item__old-price)"),regularPriceElement=row.querySelector(".cart-item__price-wrapper > .secondary-color-dark.price")||row.querySelector(".cart-item__price-wrapper > .price--end:not(.cart-item__old-price)"),oldPriceElement=row.querySelector(".cart-item__old-price"),finalLineCents=parseMoneyToCents(discountedPriceElement?.textContent||regularPriceElement?.textContent||""),originalLineCandidate=parseMoneyToCents(oldPriceElement?.textContent||""),originalLineCents=originalLineCandidate>0?originalLineCandidate:finalLineCents,finalUnitCents=quantity>0?Math.round(finalLineCents/quantity):0;return{quantity,product_id:String(row.dataset.productId||"").trim(),handle:String(row.dataset.handle||"").trim(),url:String(row.dataset.productUrl||"").trim(),variant_id:variantId,final_price:finalUnitCents,line_price:originalLineCents,final_line_price:finalLineCents,original_line_price:originalLineCents}}),itemCount=items.reduce((sum,item)=>sum+Number(item.quantity||0),0),totalCents=items.reduce((sum,item)=>sum+Number(item.final_line_price||0),0);return normalizeCartState({item_count:itemCount,total_price:totalCents,currency,items})}function getFiveStarSvgMarkup(){const starSvg='<svg class="offer-cta-v2__star-svg" viewBox="0 0 576 512" aria-hidden="true" focusable="false"><path d="M316.9 18C311.6 7 300.4 0 288.1 0s-23.4 7-28.8 18L195 150.3 51.4 171.5c-12 1.8-22 10.2-25.7 21.7s-.7 24.2 7.9 32.7L137.8 329 113.2 474.7c-2 12 3 24.2 12.9 31.3s23 8 33.8 2.3l128.3-68.5 128.3 68.5c10.8 5.7 23.9 4.9 33.8-2.3s14.9-19.3 12.9-31.3L438.5 329 542.7 225.9c8.6-8.5 11.7-21.2 7.9-32.7s-13.7-19.9-25.7-21.7L381.2 150.3 316.9 18z"></path></svg>';return`${starSvg}${starSvg}${starSvg}${starSvg}${starSvg}`}function getDrawerElements(){const drawer=document.querySelector("cart-drawer"),drawerRoot=drawer?.querySelector("#CartDrawer")||document.getElementById("CartDrawer"),inner=drawerRoot?.querySelector(".drawer__inner"),scroll=inner?.querySelector(".pupford-cart-drawer-scroll"),cartItems=inner?.querySelector("#CartDrawer-CartItems"),rows=cartItems?Array.from(cartItems.querySelectorAll(".cart-item")):[],cartItemsWrapper=cartItems?.querySelector(".drawer__cart-items-wrapper")||null,drawerItems=inner?.querySelector("cart-drawer-items")||null,footer=inner?.querySelector(".drawer__footer")||null;return{drawer,drawerRoot,inner,scroll,cartItems,rows,cartItemsWrapper,drawerItems,footer}}function updateCartBubble(cart){const itemCount=Number(cart?.item_count||0),cartIcon=document.getElementById("cart-icon-bubble");if(!cartIcon)return;let cartCount=cartIcon.querySelector(".cart-count");itemCount>0?(cartCount||(cartCount=document.createElement("div"),cartCount.className="
1cart-count",cartIcon.appendChild(cartCount)),cartCount.innerHTML=`<span aria-hidden="true">${itemCount}</span><span class="visually-hidden">${itemCount} items</span>`):cartCount&&cartCount.remove()}function updateDrawerHeading(cart,elements){const heading=elements?.inner?.querySelector(".drawer__heading");if(!heading)return;const count=Number(cart?.item_count||0);heading.textContent=count>0?`CART ${count}`:"CART"}function syncDrawerEmptyState(cart,elements){const isEmpty=Number(cart?.item_count||0)===0,drawer=elements?.drawer||null,drawerItems=elements?.drawerItems||null;drawer&&drawer.classList.toggle("is-empty",isEmpty),drawerItems&&drawerItems.classList.toggle("is-empty",isEmpty)}function computeOriginalSubtotalCents(cart){const items=Array.isArray(cart?.items)?cart.items:[],finalTotalCents=Number(cart?.total_price||0);if(!items.length)return finalTotalCents;const computed=items.reduce((sum,item)=>{const originalLine=Number(item?.original_line_price||0),compareAtLine=Number(item?.compare_at_line_price||0),candidate=Math.max(originalLine,compareAtLine);return Number.isFinite(candidate)?sum+candidate:sum},0),domOldPriceSum=Array.from(document.querySelectorAll("#CartDrawer-CartItems .cart-item .cart-item__old-price")).map(node=>parseMoneyToCents(node?.textContent||"")).filter(value=>Number.isFinite(value)&&value>0).reduce((sum,value)=>sum+value,0);return domOldPriceSum>finalTotalCents?domOldPriceSum:computed>0?computed:finalTotalCents}function renderCartLineEnhancements(cart,elements){const rows=elements.rows,items=Array.isArray(cart?.items)?cart.items:[];if(!rows.length)return;const starsMarkup=getFiveStarSvgMarkup();rows.forEach((row,index)=>{const details=row.querySelector(".cart-item__details"),title=row.querySelector(".cart-item__name"),item=items[index],rowSuffix=row.dataset.titleSuffix||"",baseTitle=String(title?.textContent||"").trim(),formattedTitle=buildDisplayTitle(baseTitle,rowSuffix);title&&formattedTitle&&(title.textContent=formattedTitle);const countLabel=formatReviewCount(row.dataset.reviewCount||"");let ratingMount=row.querySelector(".pupford-cart-line-review");countLabel&&details&&title?(ratingMount||(ratingMount=document.createElement("div"),ratingMount.className="pupford-cart-line-review",details.insertBefore(ratingMount,title)),ratingMount.innerHTML=`
2          <span class="pupford-cart-line-review__stars">${starsMarkup}</span>
3          <span class="pupford-cart-line-review__count">${escapeHtml(countLabel)}</span>
4          <span class="pupford-cart-line-review__word">Reviews</span>
5        `):ratingMount&&ratingMount.remove();const quantityInfo=details?.querySelector('[headers="CartDrawer-ColumnQuantity"]'),totals=row.querySelector(".cart-item__totals");if(details&&quantityInfo&&totals){let purchaseRow=details.querySelector(".pupford-cart-line__purchase-row");if(!purchaseRow){purchaseRow=document.createElement("div"),purchaseRow.className="pupford-cart-line__purchase-row";const sellingPlan=details.querySelector(".pupford-cart-line-plan"),discounts=details.querySelector(".discounts");sellingPlan?.parentNode===details?details.insertBefore(purchaseRow,sellingPlan):discounts?.parentNode===details?details.insertBefore(purchaseRow,discounts):details.appendChild(purchaseRow)}purchaseRow.appendChild(quantityInfo),purchaseRow.appendChild(totals)}const linePlan=details?.querySelector(".pupford-cart-line-plan")||row.querySelector(".pupford-cart-line-plan");linePlan&&linePlan.parentNode!==row&&row.appendChild(linePlan),linePlan&&(linePlan.hidden=!1,linePlan.removeAttribute("aria-hidden"),linePlan.style.removeProperty("display"));const isFreeLine=item?Number(item?.final_price||0)===0:!1;row.classList.toggle("qty-btns-hidden",isFreeLine),row.classList.add("pupford-line-enhanced")})}function isLastKnownCartCompatible(cart,elements){const rows=Array.isArray(elements?.rows)?elements.rows:[],items=Array.isArray(cart?.items)?cart.items:[];if(!rows.length||!items.length||rows.length!==items.length)return!1;for(let index=0;index<rows.length;index+=1){const rowProductId=String(rows[index]?.dataset?.productId||"").trim(),itemProductId=String(items[index]?.product_id||"").trim();if(!rowProductId||!itemProductId||rowProductId!==itemProductId)return!1;const rowVariantId=normalizeVariantId(rows[index]?.dataset?.variantId||rows[index]?.querySelector(".quantity__input")?.dataset?.quantityVariantId||rows[index]?.querySelector(".cart-remove-button")?.dataset?.variantId||""),itemVariantId=normalizeVariantId(items[index]?.variant_id||items[index]?.variantId||items[index]?.id||"");if(rowVariantId&&itemVariantId&&rowVariantId!==itemVariantId)return!1}return!0}function mountAppCartPerks(cart,elements){const header=elements.inner?.querySelector(".drawer__header");if(!header)return;let mount=elements.inner.querySelector("[data-discounts-app-cart-perks-mount]");mount||(mount=document.createElement("div"),mount.id="pupford-cart-rewards",mount.setAttribute("data-discounts-app-cart-perks-mount",""),header.insertAdjacentElement("afterend",mount));const preparePresentation=()=>{const widget=mount.querySelector("[data-discounts-app-cart-perks]");if(!widget)return;const stops=widget.children[2]?.children,fill=widget.children[1]?.firstElementChild;if(fill&&stops?.length===3){const firstStop=parseFloat(stops[1].style.left),progress=parseFloat(fill.style.width);if(firstStop>0&&firstStop<100&&Number.isFinite(progress)){const visualProgress=progress<=firstStop?progress/firstStop*50:50+(progress-firstStop)/(100-firstStop)*50;widget.style.setProperty("--pupford-tier-fill",Math.min(100,visualProgress)+"%")}}widget.setAttribute("data-pupford-perks-ready","")};observedPerksMounts.has(mount)||(new MutationObserver(preparePresentation).observe(mount,{childList:!0,subtree:!0}),observedPerksMounts.add(mount)),preparePresentation()}function buildThemeDrawerRecommendations(cart,rows){const cartItems=Array.isArray(cart?.items)?cart.items:[],cartPaths=new Set,cartHandles=new Set,cartProductIds=new Set,cartVariantIds=new Set,seenRecommendations=new Set;
5cartItems.forEach(item=>{const pathFromHandle=item?.handle?`/products/${String(item.handle).trim()}`:"",pathFromUrl=normalizeProductPath(item?.url||item?.product_url||""),normalizedPath=pathFromHandle||pathFromUrl;normalizedPath&&cartPaths.add(normalizedPath);const handle=String(item?.handle||item?.product_handle||"").trim();handle&&cartHandles.add(handle);const productId=String(item?.product_id||"").trim();productId&&cartProductIds.add(productId);const variantId=normalizeVariantId(item?.variant_id||item?.variantId||item?.id||"");variantId&&cartVariantIds.add(variantId)});function normalizeCandidate(raw){if(!raw)return null;const baseTitle=String(raw.title||"").trim(),path=normalizeProductPath(raw.path||raw.url||"");if(!baseTitle||!path)return null;const productId=String(raw.productId||raw.product_id||"").trim(),handleFromPath=path.startsWith("/products/")?path.replace("/products/","").split(/[?#]/)[0]:"",handle=String(raw.handle||handleFromPath||"").trim(),variantId=normalizeVariantId(raw.variantId||raw.variant_id||raw.id||"");if(path&&cartPaths.has(path)||handle&&cartHandles.has(handle)||productId&&cartProductIds.has(productId)||variantId&&cartVariantIds.has(variantId))return null;const recommendationKey=`${path}|${productId}|${handle}|${variantId}`.toLowerCase();if(seenRecommendations.has(recommendationKey))return null;seenRecommendations.add(recommendationKey);const resolvedSuffix=String(raw.titleSuffix||getTitleSuffixFromConfig(productId,handle)||"").trim(),resolvedReviews=raw.reviewsCountRaw||getReviewCountFromConfig(productId,handle)||"",resolvedSizeLabel=normalizeSizeLabel(raw.sizeLabel);return{title:buildDisplayTitle(baseTitle,resolvedSuffix),handle,productId,path,image:String(raw.image||"").trim(),price:String(raw.price||"").trim(),oldPrice:String(raw.oldPrice||"").trim(),reviewsCountRaw:resolvedReviews,variantId,sizeLabel:resolvedSizeLabel}}const configuredHeading=rows.map(row=>String(row.dataset.recommendationHeading||"").trim()).find(Boolean),configuredHeadingFromConfig=getCartProductRecommendations().map(entry=>String(entry?.heading||"").trim()).find(Boolean);for(const entry of getCartProductRecommendations()){const recommendation=entry?.recommendation;if(!recommendation||typeof recommendation!="object")continue;const candidate=normalizeCandidate({title:recommendation.title,handle:recommendation.handle,productId:recommendation.productId,path:recommendation.path||(recommendation.handle?`/products/${recommendation.handle}`:""),image:recommendation.image,price:recommendation.price,oldPrice:recommendation.oldPrice,reviewsCountRaw:recommendation.reviewsCountRaw,variantId:recommendation.variantId,titleSuffix:recommendation.titleSuffix,sizeLabel:recommendation.sizeLabel});if(candidate)return{sectionTitle:configuredHeading||configuredHeadingFromConfig||"You May Also Like",products:[candidate]}}for(const row of rows){const candidate=normalizeCandidate({title:row.dataset.recommendationTitle,handle:row.dataset.recommendationHandle,productId:row.dataset.recommendationProductId,path:row.dataset.recommendationPath,image:row.dataset.recommendationImage,price:row.dataset.recommendationPrice,oldPrice:row.dataset.recommendationOldPrice,reviewsCountRaw:row.dataset.recommendationReviewCount,variantId:row.dataset.recommendationVariantId,titleSuffix:row.dataset.recommendationTitleSuffix,sizeLabel:row.dataset.recommendationSizeLabel});if(candidate)return{sectionTitle:configuredHeading||"You May Also Like",products:[candidate]}}for(const defaultProduct of getUpsellProducts()){const candidate=normalizeCandidate(defaultProduct);if(candidate)return{sectionTitle:"You May Also Like",products:[candidate]}}return{sectionTitle:"You May Also Like",products:[]}}function requestFallbackUpsell(cart){const items=Array.isArray(cart?.items)?cart.items:[],key=getCartKey(cart);if(!key)return Promise.resolve(null);if(fallbackUpsellState.key!==key&&(fallbackUpsellState={key,candidate:null,promise:null}),fallbackUpsellState.candidate)return Promise.resolve(fallbackUpsellState.candidate);if(fallbackUpsellState.promise)return fallbackUpsellState.promise;const firstProductId=String(items[0]?.product_id||"").trim();if(!firstProductId)return Promise.resolve(null);const cartProductIds=new Set(items.map(item=>
5String(item?.product_id||"").trim()).filter(Boolean)),cartHandles=new Set(items.map(item=>String(item?.handle||"").trim()).filter(Boolean)),cartVariantIds=new Set(items.map(item=>normalizeVariantId(item?.variant_id||item?.variantId||item?.id||"")).filter(Boolean)),currency=cart?.currency||window.Shopify?.currency?.active||"USD";return fallbackUpsellState.promise=fetch(`/recommendations/products.json?product_id=${encodeURIComponent(firstProductId)}&limit=12&intent=related`,{headers:{Accept:"application/json"},credentials:"same-origin"}).then(response=>response.ok?response.json():null).then(data=>{const fallbackProduct=(Array.isArray(data?.products)?data.products:[]).find(product=>{const productId2=String(product?.id||"").trim(),handle2=String(product?.handle||"").trim();return!productId2||!handle2||cartProductIds.has(productId2)||cartHandles.has(handle2)?!1:Array.isArray(product?.variants)&&product.variants.length>0});if(!fallbackProduct)return fallbackUpsellState.candidate=null,null;const variants=Array.isArray(fallbackProduct.variants)?fallbackProduct.variants:[],variant=variants.find(entry=>entry?.available&&!cartVariantIds.has(normalizeVariantId(entry?.id||"")))||variants.find(entry=>!cartVariantIds.has(normalizeVariantId(entry?.id||"")))||null;if(!variant)return fallbackUpsellState.candidate=null,null;const priceCents=Number(variant.price||fallbackProduct.price||0),compareCents=Number(variant.compare_at_price||fallbackProduct.compare_at_price||0),productId=String(fallbackProduct.id||"").trim(),handle=String(fallbackProduct.handle||"").trim(),candidate={title:buildDisplayTitle(String(fallbackProduct.title||"").trim(),getTitleSuffixFromConfig(productId,handle)),handle,productId,path:`/products/${handle}`,image:String(fallbackProduct.featured_image||"").trim(),price:formatCentsAsMoney(priceCents,currency),oldPrice:compareCents>priceCents?formatCentsAsMoney(compareCents,currency):"",reviewsCountRaw:getReviewCountFromConfig(productId,handle)||"",variantId:normalizeVariantId(variant.id||""),sizeLabel:getFallbackVariantSizeLabel(fallbackProduct,variant)};return fallbackUpsellState.candidate=candidate,candidate}).catch(()=>null).finally(()=>{fallbackUpsellState.promise=null}),fallbackUpsellState.promise}function renderCustomUpsell(cart,elements){const inner=elements.inner,scroll=elements.scroll;if(!inner||!scroll)return;const cartItemCount=Number(cart?.item_count||0);let mount=inner.querySelector("#pupford-cart-upsell"),recommendationState=buildThemeDrawerRecommendations(cart,elements.rows),item=recommendationState.products[0];const cartKey=getCartKey(cart);if(!item&&fallbackUpsellState.key===cartKey&&fallbackUpsellState.candidate&&(recommendationState={sectionTitle:recommendationState.sectionTitle||"You May Also Like",products:[fallbackUpsellState.candidate]},item=fallbackUpsellState.candidate),!item&&cartItemCount>0&&requestFallbackUpsell(cart).then(candidate=>{!candidate||!isDrawerActive()||scheduleRender(!1)}),!item||cartItemCount<1){mount?.remove();return}mount||(mount=document.createElement("div"),mount.id="pupford-cart-upsell",mount.className="pupford-cart-upsell-wrap"),applyRecommendationBadgeStyles(mount),elements.drawerItems?(mount.parentNode!==scroll||mount.previousElementSibling!==elements.drawerItems)&&elements.drawerItems.insertAdjacentElement("afterend",mount):mount.parentNode!==scroll&&scroll.appendChild(mount);const reviewCountLabel=formatReviewCount(item.reviewsCountRaw),starsMarkup=getFiveStarSvgMarkup();let ctaPrice=String(item.price||"").trim(),ctaOldPrice="";const hasCartAttributes=cart?.attributes&&typeof cart.attributes=="object";let recommendationDiscountRate=getRecommendationDiscountRate(cart);if(hasCartAttributes&&(recoDiscountRateCache=recommendationDiscountRate,recoDiscountRateFetchedAt=Date.now()),!(recommendationDiscountRate>0)&&recoDiscountRateCache>0&&(recommendationDiscountRate=recoDiscountRateCache),!hasCartAttributes&&!(recommendationDiscountRate>0)&&fetchRecommendationDiscountRate().then(rate=>{rate>0&&isDrawerActive()&&scheduleRender(!1)}),recommendationDiscountRate>0){const baseCents=parseMoneyToCents(ctaPrice);if(baseCents>0){const discountedCents=Math.max(0,baseCents-Math.floor(baseCents*Math.min(1,recommendationDiscountRate)+1e-7));discountedCents<baseCents&&(ctaPrice=formatCentsAsMoney(discountedCents,cart?.currency),ctaOldPrice=formatCentsAsMoney(baseCents,cart?.currency))}}
5const discountPercentRaw=recommendationDiscountRate>0?recommendationDiscountRate*100:0,discountPercentRounded=Math.round(discountPercentRaw*10)/10,discountPercentLabel=Number.isInteger(discountPercentRounded)?String(discountPercentRounded):String(discountPercentRounded).replace(/\.0$/,""),discountBadgeMarkup=recommendationDiscountRate>0?`<span class="pupford-cart-upsell__discount-badge">Save ${escapeHtml(discountPercentLabel)}%</span>`:"",ctaPriceMarkup=ctaPrice?` | ${escapeHtml(ctaPrice)}${ctaOldPrice?` <span class="pupford-cart-upsell__cta-old-price">${escapeHtml(ctaOldPrice)}</span>`:""}`:"",recommendationMetaText=normalizeSizeLabel(item.sizeLabel)?`Size: ${normalizeSizeLabel(item.sizeLabel)}`:"Quantity: 1 Bag";mount.innerHTML=`
6      <h3 class="pupford-cart-upsell-wrap__title">${escapeHtml(recommendationState.sectionTitle)}</h3>
7      <div class="pupford-cart-upsell">
8        <div class="pupford-cart-upsell__card">
9          ${discountBadgeMarkup}
10          <a class="pupford-cart-upsell__image-link" href="${escapeHtml(item.path)}">
11            ${item.image?`<img class="pupford-cart-upsell__image" src="${escapeHtml(item.image)}" alt="${escapeHtml(item.title)}">`:""}
12          </a>
13          <div class="pupford-cart-upsell__content">
14            <div class="pupford-cart-upsell__rating">
15              <span class="pupford-cart-upsell__rating-stars">${starsMarkup}</span>
16              ${reviewCountLabel?`<span class="pupford-cart-upsell__rating-count">${escapeHtml(reviewCountLabel)}</span>`:""}
17              <span class="pupford-cart-upsell__rating-word">Reviews</span>
18            </div>
19            <a class="pupford-cart-upsell__name" href="${escapeHtml(item.path)}">${escapeHtml(item.title)}</a>
20            <p class="pupford-cart-upsell__meta">${escapeHtml(recommendationMetaText)}</p>
21            <button
22              type="button"
23              class="pupford-cart-upsell__cta"
24              data-variant-id="${escapeHtml(item.variantId||"")}"
25              data-product-id="${escapeHtml(item.productId||"")}"
26              data-product-handle="${escapeHtml(item.handle||"")}"
27            >ADD TO CART${ctaPriceMarkup}</button>
28          </div>
29        </div>
30      </div>
31    `}function renderCustomCheckout(cart,elements){const inner=elements.inner;if(!inner)return;let mount=inner.querySelector("#pupford-cart-checkout");mount?mount.parentNode!==inner&&inner.appendChild(mount):(mount=document.createElement("div"),mount.id="pupford-cart-checkout",mount.className="pupford-cart-checkout",inner.appendChild(mount));const checkoutLockIconOffsetY=Number(getConfig().checkoutLockIconOffsetY);Number.isFinite(checkoutLockIconOffsetY)?mount.style.setProperty("--pupford-cart-checkout-lock-offset-y",`${checkoutLockIconOffsetY}px`):mount.style.removeProperty("--pupford-cart-checkout-lock-offset-y");const finalTotalCents=Number(cart?.total_price||0),originalTotalCents=computeOriginalSubtotalCents(cart),subtotal=formatCentsAsMoney(finalTotalCents,cart?.currency),subtotalOriginal=formatCentsAsMoney(originalTotalCents,cart?.currency),showSubtotalStrikeout=originalTotalCents>finalTotalCents,hasItems=Number(cart?.item_count||0)>0,lockIconMarkup=getConfig().checkoutLockIconUrl?`<img class="pupford-cart-checkout__lock-image" src="${escapeHtml(getConfig().checkoutLockIconUrl)}" alt="" loading="lazy">`:'<svg class="pupford-cart-checkout__lock-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path fill="currentColor" d="M17 10h-1V8a4 4 0 1 0-8 0v2H7a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-7a2 2 0 0 0-2-2zm-6 0V8a2 2 0 1 1 4 0v2h-4z"></path></svg>',promiseIconMarkup=getConfig().promiseIconUrl?`<img class="pupford-cart-checkout__promise-icon-image" src="${escapeHtml(getConfig().promiseIconUrl)}" alt="" loading="lazy">`:'<span class="pupford-cart-checkout__promise-icon-fallback" aria-hidden="true">P</span>',checkoutMarkup=`
32      <div class="pupford-cart-checkout__row">
33        <span class="pupford-cart-checkout__label">Subtotal</span>
34        <span class="pupford-cart-checkout__subtotal-wrap">
35          <span class="pupford-cart-checkout__subtotal">${escapeHtml(subtotal)}</span>
36          ${showSubtotalStrikeout?`<span class="pupford-cart-checkout__subtotal-old">${escapeHtml(subtotalOriginal)}</span>`:""}
37        </span>
38      </div>
39      <button type="button" class="pupford-cart-checkout__cta" data-checkout-url="/checkout" ${hasItems?"":'aria-disabled="true"'}>
40        <span class="pupford-cart-checkout__lock" aria-hidden="true">${lockIconMarkup}</span>SECURE CHECKOUT
41      </button>
42      <p class="pupford-cart-checkout__promise-title">${promiseIconMarkup}<span>30 Day Guarantee</span></p>
43      <p class="pupford-cart-checkout__promise-text pupford-cart-checkout__promise-text--ghost" aria-hidden="true">&nbsp;</p>
44    `;mount.innerHTML=checkoutMarkup;const cta=mount.querySelector(".pupford-cart-checkout__cta");cta&&cta.addEventListener("click",event=>{if(!hasItems){event.preventDefault();return}const url=String(cta.getAttribute("data-checkout-url")||"/checkout").trim()||"/checkout";window.location.href=url})}function syncCheckoutLayout(elements){const scroll=elements.scroll,checkout=elements.inner?.querySelector("#pupford-cart-checkout");if(!scroll)return;if(!checkout){scroll.style.setProperty("--pupford-cart-scroll-padding-bottom","0px");return}const checkoutHeight=Math.max(0,Math.ceil(checkout.getBoundingClientRect().height));scroll.style.setProperty("--pupford-cart-scroll-padding-bottom",`${checkoutHeight+32}px`)}function refreshDrawerSection(force=!1,options={}){const expectedItemCount=Math.max(0,Number(options?.expectedItemCount||0)),now=Date.now();if(cartDebug("custom.refreshDrawerSection.start",{force,expectedItemCount,sinceLastRefresh:now-lastDrawerSectionRefreshAt,stack:new Error().stack}),!force&&now-lastDrawerSectionRefreshAt<DRAWER_SECTION_REFRESH_COOLDOWN_MS)return cartDebug("custom.refreshDrawerSection.skip-cooldown"),Promise.resolve(buildCartStateFromLiveDrawer());lastDrawerSectionRefreshAt=now;const cartUrl=window.routes?.cart_url||"/cart",separator=cartUrl.includes("?")?"&":"?",sectionUrl=`${cartUrl}${separator}section_id=cart-drawer&_=${now}`;return fetch(sectionUrl,{credentials:"same-origin",cache:"no-store",headers:{Accept:"text/html"}}).then(response=>response.text()).then(responseText=>{const html=new DOMParser().parseFromString(responseText,"text/html"),sourceCartItems=html.querySelector("cart-drawer-items"),sourceRows=sourceCartItems?Array.from(sourceCartItems.querySelectorAll(".cart-item")):[];if(expectedItemCount>0&&sourceRows.length===0)return null;const selectors=["cart-drawer-items",".drawer__footer"],shouldRestoreObserver=!suppressObserver;shouldRestoreObserver&&(suppressObserver=!0);try{selectors.forEach(selector=>{const targetElement=document.querySelector(selector),sourceElement=html.querySelector(selector);if(targetElement&&sourceElement){const equal=targetElement.isEqualNode(sourceElement);cartDebug("custom.refreshDrawerSection.compare",{selector,equal,targetLength:targetElement.outerHTML.length,sourceLength:sourceElement.outerHTML.length}),equal||(cartDebug("custom.refreshDrawerSection.replace",{selector}),targetElement.replaceWith(sourceElement))}})}finally{shouldRestoreObserver&&requestAnimationFrame(()=>{suppressObserver=!1})}return buildCartStateFromLiveDrawer()})}function reportFetchFailure(error){const now=Date.now();now-lastFetchErrorAt<CART_FETCH_ERROR_LOG_COOLDOWN_MS||(lastFetchErrorAt=now,console.error("Pupford native cart render failed:",error))}function fetchCart(attempt=0){return fetch("/cart.js",{headers:{Accept:"application/json"},credentials:"same-origin"}).then(response=>{if(!response.ok){const status=Number(response.status||0);if(status===429||status>=500&&status<=599){if(attempt<CART_FETCH_RETRY_LIMIT){const waitMs=180*(attempt+1);return delay(waitMs).then(()=>fetchCart(attempt+1))}return null}return null}return String(response.headers.get("content-type")||"").toLowerCase().includes("application/json")?response.json().then(cart=>normalizeCartState(cart)):null})}function fetchFreshCartAfterMutation(previousCart){const previousKey=getCartKey(previousCart||{}),previousCount=Number(previousCart?.item_count||0);return fetchCart().then(cart=>{if(!cart)return null;const nextKey=getCartKey(cart),nextCount=Number(cart?.item_count||0);return nextKey!==previousKey||nextCount!==previousCount?cart:delay(220).then(()=>fetchCart())})}function updateClosedCartState(cart){const normalized=normalizeCartState(cart);return normalized?(lastKnownCart=normalized,updateCartBubble(normalized),!0):!1}function fetchClosedCartState(){return fetchCart().then(cart=>(cart&&updateClosedCartState(cart),cart))}function isDrawerActive(){const drawer=document.querySelector("cart-drawer");return!!(drawer&&drawer.classList.contains("active"))}function needsDrawerSectionSync(cart,elements){const items=Array.isArray(cart?.items)?cart.items:[],rows=Array.isArray(elements?.rows)?elements.rows:[];return!items.length&&!rows.length?!1:!items.length&&rows.length||items.length&&!rows.length?!0:!isLastKnownCartCompatible(cart,elements)}function renderFromCart(cart){const normalizedCart=normalizeCartState(cart);
44if(!normalizedCart){cartDebug("custom.renderFromCart.skip-invalid",{cart:summarizeCart(cart)});return}cartDebug("custom.renderFromCart.start",{cart:summarizeCart(normalizedCart),stack:new Error().stack}),lastKnownCart=normalizedCart;const elements=getDrawerElements();if(!elements.inner||!elements.scroll){cartDebug("custom.renderFromCart.skip-missing-elements",{hasInner:!!elements.inner,hasScroll:!!elements.scroll});return}syncDrawerEmptyState(normalizedCart,elements),suppressObserver=!0;try{updateDrawerHeading(normalizedCart,elements),applyLineItemImageStyles(elements),renderCartLineEnhancements(normalizedCart,elements),mountAppCartPerks(normalizedCart,elements),renderCustomUpsell(normalizedCart,elements),renderCustomCheckout(normalizedCart,elements),syncCheckoutLayout(elements),requestAnimationFrame(()=>{syncCheckoutLayout(getDrawerElements()),suppressObserver=!1}),updateCartBubble(normalizedCart),clearDrawerNeedsRefresh()}catch(error){throw suppressObserver=!1,error}}function fetchCartAndRender(forceRender,options){const config=options||{};if(cartDebug("custom.fetchCartAndRender.start",{forceRender,options:config,lastKnownCart:summarizeCart(lastKnownCart),stack:new Error().stack}),!forceRender&&!isDrawerActive()){cartDebug("custom.fetchCartAndRender.skip-inactive-not-forced");return}if(lastKnownCart&&!forceRender){const elements=getDrawerElements();isLastKnownCartCompatible(lastKnownCart,elements)&&(cartDebug("custom.fetchCartAndRender.render-last-known"),renderFromCart(lastKnownCart))}if(!forceRender){cartDebug("custom.fetchCartAndRender.stop-not-forced");return}if(renderInFlight){forceRender&&!renderInFlightForce&&(renderRetryQueued=!0),cartDebug("custom.fetchCartAndRender.skip-in-flight",{requestedForce:forceRender,inFlightForce:renderInFlightForce,retryQueued:renderRetryQueued});return}if(!config.bypassCooldown){const now=Date.now();if(now-lastCartFetchAt<CART_FETCH_COOLDOWN_MS){cartDebug("custom.fetchCartAndRender.skip-cooldown",{sinceLastFetch:now-lastCartFetchAt});return}lastCartFetchAt=now}renderInFlight=!0,renderInFlightForce=forceRender,fetchCart().then(cart=>{if(cartDebug("custom.fetchCartAndRender.fetch-result",{cart:summarizeCart(cart)}),cart){const elements=getDrawerElements();if(needsDrawerSectionSync(cart,elements)){const expectedItemCount=Math.max(0,Number(cart?.item_count||0));return cartDebug("custom.fetchCartAndRender.needs-section-sync",{expectedItemCount,cart:summarizeCart(cart)}),refreshDrawerSection(!0,{expectedItemCount}).then(sectionCart=>{if(cartDebug("custom.fetchCartAndRender.section-sync-result",{sectionCart:summarizeCart(sectionCart)}),sectionCart){renderFromCart(sectionCart);return}if(expectedItemCount>0)return delay(180).then(()=>refreshDrawerSection(!0,{expectedItemCount})).then(retryCart=>{renderFromCart(retryCart||cart)}).catch(()=>{renderFromCart(cart)});renderFromCart(cart)}).catch(()=>{cartDebug("custom.fetchCartAndRender.section-sync-error-render-cart"),renderFromCart(cart)})}cartDebug("custom.fetchCartAndRender.render-fetched-cart"),renderFromCart(cart);return}return cartDebug("custom.fetchCartAndRender.fetch-empty-refresh-section"),refreshDrawerSection(!0).then(sectionCart=>sectionCart?(renderFromCart(sectionCart),!0):!1).catch(()=>!1).then(didRenderFromSection=>{if(didRenderFromSection)return;const liveDrawerCart=buildCartStateFromLiveDrawer();if(liveDrawerCart){renderFromCart(liveDrawerCart);return}if(lastKnownCart){const elements=getDrawerElements();isLastKnownCartCompatible(lastKnownCart,elements)&&renderFromCart(lastKnownCart)}})}).catch(error=>reportFetchFailure(error)).finally(()=>{renderInFlight=!1,renderInFlightForce=!1,renderRetryQueued&&(renderRetryQueued=!1,cartDebug("custom.fetchCartAndRender.run-queued-retry"),scheduleRender(!0,{bypassCooldown:!0}))})}function scheduleRender(forceRender,options={}){if(cartDebug("custom.scheduleRender.request",{forceRender,options,stack:new Error().stack}),forceRender&&(renderForce=!0),options.bypassCooldown&&(renderOptions.bypassCooldown=!0),renderScheduled){cartDebug("custom.scheduleRender.already-scheduled");return}renderScheduled=!0,requestAnimationFrame(()=>
44{renderScheduled=!1;const useForce=renderForce;renderForce=!1;const useOptions=renderOptions;renderOptions={bypassCooldown:!1},cartDebug("custom.scheduleRender.flush",{useForce,useOptions}),fetchCartAndRender(useForce,useOptions)})}function handleUpsellClick(event){const cta=event.target.closest(".pupford-cart-upsell__cta");if(!cta)return;const variantId=normalizeVariantId(cta.dataset.variantId||"");if(!variantId)return;cta.disabled=!0;const previousCart=lastKnownCart;let sectionCartSnapshot=null;const addParams=new URLSearchParams({id:variantId,quantity:"1","properties[_pupford_source]":"cart_recommendation","properties[_pupford_source_context]":"cart_drawer","properties[_pupford_source_variant_id]":String(variantId)}),recommendationProductId=String(cta.dataset.productId||"").trim(),recommendationHandle=String(cta.dataset.productHandle||"").trim();recommendationProductId&&addParams.set("properties[_pupford_source_product_id]",recommendationProductId),recommendationHandle&&addParams.set("properties[_pupford_source_handle]",recommendationHandle),fetch("/cart/add.js",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"},body:addParams.toString()}).then(response=>response.ok?response.json():response.text().then(text=>{throw new Error(text||`Cart add failed with status ${response.status}`)})).then(()=>refreshDrawerSection(!0)).then(sectionCart=>(sectionCartSnapshot=sectionCart||null,sectionCartSnapshot&&renderFromCart(sectionCartSnapshot),fetchFreshCartAfterMutation(previousCart))).then(cart=>{if(cart){renderFromCart(cart);return}sectionCartSnapshot||scheduleRender(!0,{bypassCooldown:!0})}).catch(error=>{console.error("Pupford native cart upsell add failed:",error)}).finally(()=>{cta.disabled=!1})}function handleSellingPlanChange(event){const select=event.target.closest(".pupford-cart-line-plan__select");if(!select)return;event.preventDefault(),event.stopPropagation(),typeof event.stopImmediatePropagation=="function"&&event.stopImmediatePropagation();const line=Number(select.dataset.lineIndex||0);if(!line)return;const quantityInput=select.closest(".cart-item")?.querySelector(".quantity__input"),quantity=Math.max(1,Number(quantityInput?.value||1)),selectedPlan=String(select.value||"").trim();applySellingPlanChange({line,quantity,sellingPlanId:selectedPlan,control:select})}function handleSellingPlanUpgradeClick(event){const button=event.target.closest(".pupford-cart-line-plan__upgrade");if(!button)return;event.preventDefault(),event.stopPropagation(),typeof event.stopImmediatePropagation=="function"&&event.stopImmediatePropagation();const line=Number(button.dataset.lineIndex||0),sellingPlanId=String(button.dataset.sellingPlanId||"").trim();if(!line||!sellingPlanId)return;const quantityInput=button.closest(".cart-item")?.querySelector(".quantity__input"),quantity=Math.max(1,Number(quantityInput?.value||1));applySellingPlanChange({line,quantity,sellingPlanId,control:button})}function applySellingPlanChange({line,quantity,sellingPlanId,control}){if(!line)return;const params=new URLSearchParams;params.set("line",String(line)),params.set("quantity",String(Math.max(1,Number(quantity||1)))),params.set("selling_plan",String(sellingPlanId||"").trim());let cartFromChange=null;control&&(control.disabled=!0),fetch("/cart/change.js",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"},credentials:"same-origin",body:params.toString()}).then(response=>response.ok?response.json():response.text().then(text=>{throw new Error(text||`Cart selling plan change failed with status ${response.status}`)})).then(cart=>(cartFromChange=normalizeCartState(cart),refreshDrawerSection(!0))).then(sectionCart=>{const nextCart=cartFromChange||sectionCart||null;if(!nextCart){scheduleRender(!0,{bypassCooldown:!0});return}lastKnownCart=nextCart,renderFromCart(nextCart)}).catch(error=>{console.error("Pupford native cart selling plan change failed:",error),scheduleRender(!0,{bypassCooldown:!0})}).finally(()=>{control&&(control.disabled=!1)})}function initDrawerStateObserver(){drawerStateObserver&&(drawerStateObserver.disconnect(),drawerStateObserver=null);const drawer=document.querySelector("cart-drawer");drawer&&(drawerStateObserver=new MutationObserver(mutations=>{for(const mutation of mutations){if(mutation.type!=="attributes"||mutation.attributeName!=="class")continue;const wasActive=String(mutation.oldValue||"").split(/\s+/).includes("active"),isActive=drawer.classList.contains("active");if(!wasActive&&isActive){const forceRefresh=drawerNeedsRefresh();cartDebug("custom.drawerStateObserver.opened",{forceRefresh}),scheduleRender(forceRefresh,forceRefresh?{bypassCooldown:!0}:void 0)}}}),drawerStateObserver.observe(drawer,{attributes:!0,attributeFilter:["class"],attributeOldValue:!0}))}function initDrawerContentObserver(){drawerContentObserver&&(drawerContentObserver.disconnect(),drawerContentObserver=null);const inner=document.querySelector("#CartDrawer .drawer__inner");inner&&(drawerContentObserver=new MutationObserver(mutations=>{if(!suppressObserver)for(const mutation of mutations){if(mutation.type!=="childList")continue;if([...mutation.addedNodes,...mutation.removedNodes].some(node=>node instanceof Element?node.matches("cart-drawer-items, .drawer__contents, .cart-item")?!0:!!node.querySelector("cart-drawer-items, .drawer__contents, .cart-item"):!1)){cartDebug("custom.drawerContentObserver.content-change",{addedNodes:mutation.addedNodes.length,removedNodes:mutation.removedNodes.length}),scheduleRender(!0,{bypassCooldown:!0});return}}}),drawerContentObserver.observe(inner,{childList:!0,subtree:!0}))}function drawerNeedsRefresh(){return Date.now()<Number(window.__pupfordCartDrawerNeedsRefreshUntil||0)}
44function clearDrawerNeedsRefresh(){window.__pupfordCartDrawerNeedsRefreshUntil=0}function initialize(){document.body.addEventListener("click",handleUpsellClick),document.body.addEventListener("click",handleSellingPlanUpgradeClick,!0),document.addEventListener("change",handleSellingPlanChange,!0),lastKnownCart=getInitialCartState(),typeof window.subscribe=="function"&&window.PUB_SUB_EVENTS?.cartUpdate&&window.subscribe(window.PUB_SUB_EVENTS.cartUpdate,event=>{const rawCart=event?.cartData||null,eventSource=String(event?.source||"");if(cartDebug("custom.pubsub.cartUpdate",{eventSource,cart:summarizeCart(rawCart)}),eventSource==="product-form"&&rawCart?.sections?.["cart-drawer"]){cartDebug("custom.pubsub.cartUpdate.skip-product-form-sections");return}if(!rawCart||!Array.isArray(rawCart.items)){if(!isDrawerActive()){cartDebug("custom.pubsub.cartUpdate.closed-fetch-state"),fetchClosedCartState().catch(()=>{});return}cartDebug("custom.pubsub.cartUpdate.schedule-invalid-cart"),scheduleRender(!0,{bypassCooldown:!0});return}const fromEvent=normalizeCartState(rawCart);if(!fromEvent){if(!isDrawerActive()){cartDebug("custom.pubsub.cartUpdate.closed-fetch-state-normalize-failed"),fetchClosedCartState().catch(()=>{});return}cartDebug("custom.pubsub.cartUpdate.schedule-normalize-failed"),scheduleRender(!0,{bypassCooldown:!0});return}if(!isDrawerActive()){cartDebug("custom.pubsub.cartUpdate.closed-update-state",{cart:summarizeCart(fromEvent)}),updateClosedCartState(fromEvent);return}lastKnownCart=fromEvent;try{renderFromCart(fromEvent)}catch{scheduleRender(!0,{bypassCooldown:!0})}}),document.addEventListener("pupford:cart-state",event=>{if(event?.detail?.source==="cart-items"&&typeof window.subscribe=="function"&&window.PUB_SUB_EVENTS?.cartUpdate)return;const rawCart=event?.detail?.cart||null;if(cartDebug("custom.event.pupford-cart-state",{cart:summarizeCart(rawCart)}),!rawCart||!Array.isArray(rawCart.items)){if(!isDrawerActive()){cartDebug("custom.event.pupford-cart-state.closed-fetch-state-invalid"),fetchClosedCartState().catch(()=>{});return}cartDebug("custom.event.pupford-cart-state.schedule-invalid"),scheduleRender(!0,{bypassCooldown:!0});return}const fromEvent=normalizeCartState(rawCart);if(!fromEvent){if(!isDrawerActive()){cartDebug("custom.event.pupford-cart-state.closed-fetch-state-normalize-failed"),fetchClosedCartState().catch(()=>{});return}cartDebug("custom.event.pupford-cart-state.schedule-normalize-failed"),scheduleRender(!0,{bypassCooldown:!0});return}if(!isDrawerActive()){cartDebug("custom.event.pupford-cart-state.closed-update-state",{cart:summarizeCart(fromEvent)}),updateClosedCartState(fromEvent);return}lastKnownCart=fromEvent,suppressObserver=!0,renderFromCart(fromEvent),requestAnimationFrame(()=>{suppressObserver=!1})}),document.addEventListener("pupford:cart-drawer-rendered",event=>{const rawCart=event?.detail?.cart||null;cartDebug("custom.event.cart-drawer-rendered",{source:event?.detail?.source,cart:summarizeCart(rawCart)});const fromEvent=normalizeCartState(rawCart),liveDrawerCart=buildCartStateFromLiveDrawer(),cartToRender=(Array.isArray(rawCart?.items)&&Number.isFinite(rawCart?.total_price)?fromEvent:null)||liveDrawerCart;if(!cartToRender){if(!isDrawerActive()){cartDebug("custom.event.cart-drawer-rendered.closed-fetch-state-no-cart"),fetchClosedCartState().catch(()=>{});return}cartDebug("custom.event.cart-drawer-rendered.schedule-no-cart"),scheduleRender(!0,{bypassCooldown:!0});return}if(!isDrawerActive()){cartDebug("custom.event.cart-drawer-rendered.closed-update-state",{cart:summarizeCart(cartToRender)}),updateClosedCartState(cartToRender);return}lastKnownCart=cartToRender,suppressObserver=!0,renderFromCart(cartToRender),requestAnimationFrame(()=>{suppressObserver=!1})});const tryOpenDrawer=trigger=>{const drawer=document.querySelector("cart-drawer");if(drawer&&!drawer.classList.contains("active")){if(typeof drawer.open=="function"){cartDebug("custom.tryOpenDrawer.open-method",{trigger:trigger?`${trigger.tagName?.toLowerCase?.()||"element"}${trigger.id?`#${trigger.id}`:""}${trigger.className?`.${String(trigger.className).trim().replace(/\s+/g,".")}`:""}`:void 0}),drawer.open(trigger);return}cartDebug("custom.tryOpenDrawer.class-fallback"),drawer.classList.add("animate","active"),document.body.classList.add("overflow-hidden")}},cartIcon=document.getElementById("cart-icon-bubble");if(cartIcon){const openFromIconEvent=event=>{cartDebug("custom.cart-icon.open-event",{eventType:event.type,isTrusted:event.isTrusted}),event.preventDefault(),event.stopPropagation(),typeof event.stopImmediatePropagation=="function"&&event.stopImmediatePropagation(),tryOpenDrawer(cartIcon),document.documentElement.dispatchEvent(new CustomEvent("theme:cart-drawer:open")),setTimeout(()=>{scheduleRender(!1)},0)},handleCaptureIconEvent=event=>{const target=event.target;target instanceof Element&&target.closest("#cart-icon-bubble")&&openFromIconEvent(event)};window.addEventListener("click",handleCaptureIconEvent,!0),window.addEventListener("keydown",event=>{const target=event.target;if(!(target instanceof Element)||!target.closest("#cart-icon-bubble"))return;const code=String(event.code||"").toUpperCase();
44code!=="SPACE"&&code!=="ENTER"||openFromIconEvent(event)},!0),cartIcon.addEventListener("click",event=>{openFromIconEvent(event)}),cartIcon.addEventListener("keydown",event=>{const code=String(event.code||"").toUpperCase();(code==="SPACE"||code==="ENTER")&&openFromIconEvent(event)})}document.body.addEventListener("click",event=>{const target=event.target;target instanceof Element&&target.closest("cart-drawer")&&target.closest(".pupford-cart-upsell__cta")&&setTimeout(()=>scheduleRender(!1),180)}),document.documentElement.addEventListener("theme:cart-drawer:open",()=>{const forceRefresh=drawerNeedsRefresh();cartDebug("custom.event.theme-cart-drawer-open",{forceRefresh}),scheduleRender(forceRefresh,forceRefresh?{bypassCooldown:!0}:void 0)}),document.body.addEventListener("cart:updated",event=>{const eventCart=normalizeCartState(event?.detail?.cart||null);if(cartDebug("custom.event.cart-updated"),eventCart){if(!isDrawerActive()){cartDebug("custom.event.cart-updated.closed-update-event-cart",{cart:summarizeCart(eventCart)}),updateClosedCartState(eventCart);return}lastKnownCart=eventCart,suppressObserver=!0,renderFromCart(eventCart),requestAnimationFrame(()=>{suppressObserver=!1});return}if(!isDrawerActive()){cartDebug("custom.event.cart-updated.closed-fetch-state"),fetchClosedCartState().catch(()=>{});return}scheduleRender(!0,{bypassCooldown:!0})}),initDrawerStateObserver(),initDrawerContentObserver(),cartDebug("custom.initialize.schedule-initial-render"),scheduleRender(!1)}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",initialize):initialize(),window.addEventListener("resize",()=>{const elements=getDrawerElements();syncCheckoutLayout(elements)})})();
45//# sourceMappingURL=/cdn/shop/t/104/assets/pupford-cart-drawer-custom.js.map?v=11428371644885896061790618900

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.