PageSourceSearch

https://jessicasimpson.com/cdn/shop/t/480/assets/product-card-mini.js?v=45777099423053624101778002216

js jessicasimpson.com collected 2026-10-02 09:54:07 UTC 11,844 bytes, 2 lines download raw bytes

1import{CartAddEvent}from"@theme/events";const BOUND="data-pcm-bound",IMG_SEL=".product-card-mini__image:not(.product-card-mini__image--secondary)",productCache={};function initSplide(){document.querySelectorAll(".styled-with-splide:not(.is-initialized)").forEach(el=>{if(typeof Splide>"u")return;const{desktopColumns,mobileColumns,desktopPeek,mobilePeek,arrows,dots}=el.dataset,splide=new Splide(el,{type:"slide",perPage:parseInt(desktopColumns)||4,perMove:1,gap:"16px",arrows:arrows==="true",pagination:dots==="true",drag:!0,speed:400,padding:{right:`${parseInt(desktopPeek)||0}%`},slideRole:"",label:"Styled With",breakpoints:{768:{perPage:parseInt(mobileColumns)||2,gap:"12px",padding:{right:`${parseInt(mobilePeek)||0}%`}}}});splide.on("mounted",()=>{el.querySelectorAll(".splide__slide").forEach(s=>{s.removeAttribute("role"),s.setAttribute("role","listitem")});const list=el.querySelector(".splide__list");list&&(list.removeAttribute("role"),list.setAttribute("role","list"))}),splide.mount();const arrowsEl=el.querySelector(".splide__arrows");if(arrowsEl){const updateArrows=()=>{arrowsEl.style.display=splide.length<=splide.options.perPage?"none":""};updateArrows(),window.addEventListener("resize",updateArrows)}el.classList.add("is-initialized")})}function formatMoney(cents){return(cents/100).toLocaleString("en-US",{style:"currency",currency:"USD"})}function getATCLabel(available){const s=window.theme?.strings;return available?s?.add_to_cart??"Add to Cart":s?.sold_out??"Sold Out"}function updateCardPrice(card,variant){const wrapper=card.querySelector(".product-card-mini__price");if(!wrapper||!variant)return;const price=formatMoney(variant.price),hasCompare=variant.compare_at_price&&variant.compare_at_price>variant.price;let html='<div ref="priceContainer">';if(hasCompare){const comparePrice=formatMoney(variant.compare_at_price);html+=`<span role="group" class="price-group--compare"><span class="visually-hidden">Regular price\xA0</span><span class="compare-at-price">${comparePrice}</span></span><span role="group" class="price-group--sale"><span class="visually-hidden">Sale price\xA0</span><span class="price">${price}</span></span>`}else html+=`<span class="price">${price}</span>`;html+="</div>",wrapper.innerHTML=html}function fetchProductJSON(handle){return productCache[handle]?Promise.resolve(productCache[handle]):fetch(`/products/${handle}.js`).then(r=>r.json()).then(data=>(productCache[handle]=data,data))}function getOptionName(opt){return typeof opt=="string"?opt:opt.name||opt}function getCardVariants(card){if(card._variants)return card._variants;const el=card.querySelector(".product-card-mini__variants-json");if(!el)return null;try{card._variants=JSON.parse(el.textContent)}catch{return null}return card._variants}function rebuildCardOptions(card,product){const form=card.querySelector(".product-card-mini__form");if(!form)return;const optionNames=(product.options||[]).map(getOptionName),isDefault=product.variants.length<=1&&optionNames.length===1&&optionNames[0]==="Title",idInput=form.querySelector('input[name="id"]'),atcBtn=form.querySelector(".product-card-mini__atc");form.querySelectorAll(".product-card-mini__option[data-option-position]").forEach(el=>el.remove()),form.querySelector(".product-card-mini__variants-json")?.remove(),card._variants=null;const first=product.variants.find(v=>v.available)||product.variants[0];if(isDefault){idInput&&(idInput.value=first.id),atcBtn&&(atcBtn.disabled=!first.available,atcBtn.textContent=getATCLabel(first.available));return}const variantData=product.variants.map(({id,available,price,compare_at_price,option1,option2,option3})=>({id,available,price,compare_at_price,option1,option2,option3}));card._variants=variantData;const frag=document.createDocumentFragment();for(const[idx,name]of optionNames.entries()){if(name.toLowerCase()==="color")continue;const position=idx+1,optionKey=`option${position}`,fieldset=document.createElement("fieldset");fieldset.className="product-card-mini__option",fieldset.dataset.optionPosition=position;const legend=document.createElement("legend");legend.className="product-card-mini__option-label",legend.textContent=name,fieldset.appendChild(legend);const valuesDiv=document.createElement("div");valuesDiv.className="product-card-mini__option-values";const selectedValue=first[optionKey],seen=new Set;for(const v of product.variants){const val=v[optionKey];if(!val||seen.has(val))continue;seen.add(val);const isAvail=product.variants.some(vv=>vv[optionKey]===val&&vv.available),btn=document.createElement("button");btn.type="button",btn.className=`product-card-mini__pill${val===selectedValue?" active":""}${isAvail?"":" sold-out"}`,btn.dataset.optionPosition=position,btn.dataset.optionValue=val,btn.setAttribute("aria-label",`${name}: ${val}`),btn.textContent=val,valuesDiv.appendChild(btn)}fieldset.appendChild(valuesDiv),frag.appendChild(fieldset)}const jsonScript=document.createElement("script");jsonScript.type="application/json",jsonScript.className="product-card-mini__variants-json",jsonScript.textContent=JSON.stringify(variantData),frag.appendChild(jsonScript),form.insertBefore(frag,atcBtn),idInput&&(idInput.value=first.id),atcBtn&&(atcBtn.disabled=!first.available,atcBtn.textContent=getATCLabel(first.available))}function syncSwatchActive(card,handle){card.querySelectorAll(".product-card-mini__swatch-item").forEach(li=>{const btn=li.querySelector("[data-swatch-target]");li.classList.toggle("active",!!(btn&&btn.dataset.siblingHandle===handle))})}
1function openATCPanel(media){media&&(media.querySelector(".product-card-mini__atc-panel")?.classList.add("is-open"),media.querySelector(".product-card-mini__atc-trigger")?.classList.add("is-hidden"))}function closeATCPanel(panel){panel&&(panel.classList.remove("is-open"),panel.closest(".product-card-mini__media")?.querySelector(".product-card-mini__atc-trigger")?.classList.remove("is-hidden"))}function handleSwatchClick(swatchBtn){const card=swatchBtn.closest(".product-card-mini");if(!card)return;const{siblingHandle,siblingFeaturedImage:newSrc,siblingUrl:newUrl,siblingColorValue,siblingBadgeText,siblingBadgeHandle,siblingBadgeColor,siblingBadgeBg,siblingNoteCart,siblingNoteDisplay}=swatchBtn.dataset;syncSwatchActive(card,siblingHandle);const img=card.querySelector(IMG_SEL);if(img&&newSrc&&(img.src=newSrc,img.srcset=""),newUrl){const imageLink=card.querySelector(".product-card-mini__image-link"),titleLink=card.querySelector(".product-card-mini__title");imageLink&&(imageLink.href=newUrl),titleLink&&(titleLink.href=newUrl)}const secondaryImg=card.querySelector(".product-card-mini__image--secondary");secondaryImg&&(secondaryImg.style.display="none");const colorLabel=card.querySelector(".product-card-mini__color-value");colorLabel&&siblingColorValue&&(colorLabel.textContent=siblingColorValue);const media=card.querySelector(".product-card-mini__media");let badge=media?.querySelector(".product-badge");siblingBadgeText?(badge||(badge=document.createElement("div"),media.appendChild(badge)),badge.className=siblingBadgeHandle?`product-badge product-badge--${siblingBadgeHandle}`:"product-badge",badge.textContent=siblingBadgeText,badge.style.color=siblingBadgeColor||"#000000",badge.style.backgroundColor=siblingBadgeBg||"#ffffff",badge.style.display=""):badge&&(badge.style.display="none");let noteInput=card.querySelector('input[name="properties[Note]"]');siblingNoteCart?(noteInput||(noteInput=document.createElement("input"),noteInput.type="hidden",noteInput.name="properties[Note]",card.querySelector(".product-card-mini__form")?.appendChild(noteInput)),noteInput.value=siblingNoteCart):noteInput?.remove();const noteContainer=card.querySelector(".cart-persistent-note");noteContainer&&(noteContainer.innerHTML=siblingNoteDisplay?`<div class="cart-persistent-note__item">${siblingNoteDisplay}</div>`:""),newSrc&&(card.dataset.originalImage=newSrc),newUrl&&(card.dataset.originalUrl=newUrl),siblingHandle&&fetchProductJSON(siblingHandle).then(product=>{rebuildCardOptions(card,product);const titleEl=card.querySelector(".product-card-mini__title");titleEl&&(titleEl.textContent=product.title);const first=product.variants.find(v=>v.available)||product.variants[0];if(first&&updateCardPrice(card,first),secondaryImg&&product.media?.length>1){const src=product.media[1].src||product.media[1].preview_image?.src;src&&(secondaryImg.src=src,secondaryImg.srcset="",secondaryImg.style.display="")}}).catch(err=>{console.warn("ProductCardMini: failed to fetch sibling",siblingHandle,err)})}function handlePillClick(pill){const card=pill.closest(".product-card-mini");if(!card)return;pill.closest(".product-card-mini__option")?.querySelectorAll(".product-card-mini__pill").forEach(p=>p.classList.remove("active")),pill.classList.add("active");const variants=getCardVariants(card);if(!variants)return;const selected={};card.querySelectorAll(".product-card-mini__pill.active").forEach(p=>{selected[`option${p.dataset.optionPosition}`]=p.dataset.optionValue});const match=variants.find(v=>Object.keys(selected).every(k=>v[k]===selected[k]));if(!match)return;const idInput=card.querySelector('input[name="id"]'),atcBtn=card.querySelector(".product-card-mini__atc");idInput&&(idInput.value=match.id),atcBtn&&(atcBtn.disabled=!match.available,atcBtn.textContent=getATCLabel(match.available)),updateCardPrice(card,match)}function handleBlockClick(e){const t=e.target,trigger=t.closest(".product-card-mini__atc-trigger");if(trigger)return openATCPanel(trigger.closest(".product-card-mini__media"));const close=t.closest(".product-card-mini__atc-close");if(close)return closeATCPanel(close.closest(".product-card-mini__atc-panel"));const swatch=t.closest("[data-swatch-target]");if(swatch)return handleSwatchClick(swatch);const pill=t.closest(".product-card-mini__pill");
1if(pill)return handlePillClick(pill)}function handleFormSubmit(e){const form=e.target;if(!form.classList?.contains("product-card-mini__form"))return;e.preventDefault();const fd=new FormData(form),item={id:parseInt(fd.get("id")),quantity:1},props={};let hasProps=!1;fd.forEach((v,k)=>{const m=k.match(/^properties\[(.+)\]$/);m&&(props[m[1]]=v,hasProps=!0)}),hasProps&&(item.properties=props);const atcBtn=form.querySelector(".product-card-mini__atc");atcBtn&&(atcBtn.disabled=!0,atcBtn.textContent="Adding..."),fetch("/cart/add.js",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({items:[item]})}).then(r=>{if(!r.ok)throw new Error(r.status);return r.json()}).then(()=>{document.dispatchEvent(new CartAddEvent(null,null,{})),atcBtn&&(atcBtn.textContent="Added!",setTimeout(()=>{atcBtn.disabled=!1,atcBtn.textContent=getATCLabel(!0)},1500)),closeATCPanel(form.closest(".product-card-mini__atc-panel"))}).catch(err=>{console.error("ProductCardMini: cart add error",err),atcBtn&&(atcBtn.disabled=!1,atcBtn.textContent=getATCLabel(!0))})}function handleSwatchHover(e,useOriginal){const btn=e.target.closest(".product-card-mini__swatches [data-swatch-target]");if(!btn)return;const card=btn.closest(".product-card-mini");if(!card)return;const img=card.querySelector(IMG_SEL);if(!img)return;const src=useOriginal?card.dataset.originalImage:btn.dataset.siblingFeaturedImage;src&&(img.src=src,img.srcset="")}function bindBlock(block){block.hasAttribute(BOUND)||(block.setAttribute(BOUND,""),block.addEventListener("click",handleBlockClick),block.addEventListener("submit",handleFormSubmit),block.addEventListener("mouseenter",e=>handleSwatchHover(e,!1),!0),block.addEventListener("mouseleave",e=>handleSwatchHover(e,!0),!0))}export function init(){initSplide(),document.querySelectorAll(".product-block--styled-with").forEach(bindBlock)}init(),window.Shopify?.designMode&&document.addEventListener("shopify:section:load",init);
2//# sourceMappingURL=/cdn/shop/t/480/assets/product-card-mini.js.map?v=45777099423053624101778002216

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.