PageSourceSearch

https://ocs.ca/cdn/shop/t/1088/assets/ocs-product-card.js?v=182103926277094710961789390938

js ocs.ca collected 2026-10-02 19:32:13 UTC 13,684 bytes, 2 lines download raw bytes

1if(!customElements.get("ocs-product-card")){const OCS_PRODUCT_CARD_PROPERTY_KEYS=["_item_id","_item_category","_item_category2","_item_category3","_item_brand","_ontario_grown","_craft","_price_drop","_new","_item_list_name"];class OcsProductCard extends HTMLElement{static#listLabelMatchesKind(declaredKind,itemListName){if(typeof itemListName!="string")return!1;const moreItemsPrefix="More Items to Consider - ";switch(declaredKind){case"more_items":return itemListName.startsWith(moreItemsPrefix)&&itemListName.slice(moreItemsPrefix.length).trim().length>0;case"recently_viewed":return itemListName==="Recently viewed";default:return!1}}#currentVariantId=null;#selectedAnalyticsMetadata=null;#selectedAnalyticsListValid=!1;#selectedAnalyticsOriginValid=!1;connectedCallback(){this.#currentVariantId=this.getAttribute("data-variant-id"),this.#selectedAnalyticsMetadata=null,this.#selectedAnalyticsListValid=!1,this.#selectedAnalyticsOriginValid=!1;const activeSwatch=this.querySelector(".ocs-card--swatch-active");activeSwatch&&this.#synchronizeAnalyticsSnapshot(activeSwatch),this.addEventListener("click",this.handleClick)}disconnectedCallback(){this.removeEventListener("click",this.handleClick)}get variantId(){return this.#currentVariantId}set variantId(id){this.#currentVariantId=id,this.setAttribute("data-variant-id",id)}handleClick=e=>{if(!(e.target instanceof Element))return;const swatch=e.target.closest('[data-action="select-variant"]');if(swatch){e.preventDefault(),e.stopPropagation(),this.selectVariant(swatch);return}const cartBtn=e.target.closest('[data-action="add-to-cart"]');if(cartBtn&&!cartBtn.disabled){e.preventDefault(),e.stopPropagation(),this.addToCart(cartBtn);return}e.target.closest('a[href*="/products/"]')&&this.#publishViewItem()};#publishViewItem(){const analyticsApi=window.OCSAnalyticsEvents,snapshot=this.#selectedAnalyticsMetadata;if(!(!snapshot||!analyticsApi||typeof analyticsApi.createViewItemPayload!="function"||typeof analyticsApi.publishOcsAnalyticsEvent!="function")&&this.#selectedAnalyticsOriginValid)try{const readProperty=(key,fallback)=>{const input=this.querySelector(`[name="properties[${key}]"]`);return(input&&"value"in input?String(input.value):"")||fallback};let itemAvailability;snapshot.variantInStore==="true"?itemAvailability="In-Store Only":snapshot.variantAvailable==="false"?itemAvailability="Out of Stock":snapshot.variantAvailable==="true"&&(itemAvailability="In-Stock");const payload=analyticsApi.createViewItemPayload({itemId:readProperty("_item_id",snapshot.itemId),brand:readProperty("_item_brand",snapshot.brand),category:readProperty("_item_category",snapshot.category),category2:readProperty("_item_category2",snapshot.category2),category3:readProperty("_item_category3",snapshot.category3),ontarioGrown:readProperty("_ontario_grown",snapshot.ontarioGrown),craft:readProperty("_craft",snapshot.craft),priceDrop:readProperty("_price_drop",snapshot.priceDrop),new:readProperty("_new",snapshot.new),itemName:snapshot.itemName,itemVariant:snapshot.itemVariant,priceCents:snapshot.priceCents,itemAvailability,index:Number.isInteger(Number(this.dataset.ocsItemIndex))&&Number(this.dataset.ocsItemIndex)>0?Number(this.dataset.ocsItemIndex):void 0,itemListName:readProperty("_item_list_name",snapshot.itemListName)||void 0},this.#analyticsLocation());if(!payload)return;analyticsApi.publishOcsAnalyticsEvent("ocs:view_item",payload)}catch{}}#analyticsLocation(){return this.dataset.ocsLocation||"PDP"}#synchronizeAnalyticsSnapshot(swatch){const rawAnalyticsMetadata={itemId:swatch.dataset.itemId,itemName:swatch.dataset.itemName,brand:swatch.dataset.itemBrand,itemVariant:swatch.dataset.itemVariant,category:swatch.dataset.itemCategory,category2:swatch.dataset.itemCategory2,category3:swatch.dataset.itemCategory3,ontarioGrown:swatch.dataset.ontarioGrown,craft:swatch.dataset.craft,priceCents:swatch.dataset.variantPrice,compareAtCents:swatch.dataset.variantComparePrice,variantStatus:swatch.dataset.variantStatus,variantAvailable:swatch.dataset.variantAvailable,variantInStore:swatch.dataset.variantInStore,itemListName:swatch.dataset.itemListName};this.#selectedAnalyticsMetadata=rawAnalyticsMetadata;const listPairMatches=OcsProductCard.#listLabelMatchesKind(this.dataset.ocsOriginKind,rawAnalyticsMetadata.itemListName);this.#selectedAnalyticsOriginValid=rawAnalyticsMetadata.itemListName===void 0||listPairMatches;const analyticsApi=window.OCSAnalyticsEvents,normalizedProperties=new FormData;let persistenceSucceeded=!1;if(analyticsApi&&typeof analyticsApi.setCartLineProperties=="function"){const persistenceMetadata=listPairMatches?rawAnalyticsMetadata:{...rawAnalyticsMetadata,itemListName:void 0};try{persistenceSucceeded=analyticsApi.setCartLineProperties(normalizedProperties,persistenceMetadata)}catch{}}this.#selectedAnalyticsListValid=persistenceSucceeded&&(rawAnalyticsMetadata.itemListName===void 0||listPairMatches&&normalizedProperties.get("properties[_item_list_name]")===rawAnalyticsMetadata.itemListName);for(const key of OCS_PRODUCT_CARD_PROPERTY_KEYS){const input=this.querySelector(`[name="properties[${key}]"]`);input&&"value"in input&&(input.value=normalizedProperties.get(`properties[${key}]`)||"")}}selectVariant(swatch){const container=swatch.closest("[data-swatches]");container&&container.querySelectorAll('[data-action="select-variant"]').forEach(s=>s.classList.remove("ocs-card--swatch-active")),swatch.classList.add("ocs-card--swatch-active");const variantId=swatch.dataset.variantId||"",price=parseInt(swatch.dataset.variantPrice||"0",10),priceFormatted=swatch.dataset.variantPriceFormatted||"",rawCompare=swatch.dataset.variantComparePrice,comparePrice=rawCompare?parseInt(rawCompare,10):null,comparePriceFormatted=swatch.dataset.variantComparePriceFormatted||"",hasDiscount=!!(comparePrice&&comparePrice>price),isAvailable=swatch.dataset.variantAvailable==="true",isInStore=swatch.dataset.variantInStore==="true",variantPpu
1=swatch.dataset.variantPpu||"",variantUom=swatch.dataset.variantUom||"";this.variantId=variantId;const variantInput=this.querySelector("[data-variant-input]");variantInput&&"value"in variantInput&&(variantInput.value=variantId),this.#synchronizeAnalyticsSnapshot(swatch);const priceB=this.querySelector("[data-price] b");priceB&&(priceB.textContent=priceFormatted,priceB.classList.toggle("ocs-card--price-sale",hasDiscount));const striked=this.querySelector('[class*="price-striked"]');striked&&(hasDiscount&&comparePriceFormatted?(striked.textContent=comparePriceFormatted,striked.style.display=""):(striked.textContent="",striked.style.display="none"));const saveBadge=this.querySelector('[class*="save-badge"]');if(saveBadge)if(hasDiscount&&comparePrice){const percent=Math.round((comparePrice-price)/comparePrice*100),template=saveBadge.dataset.saveTemplate;saveBadge.textContent=template?template.replace("__PERCENT__",String(percent)):`Save ${percent}%`,saveBadge.style.display="",saveBadge.closest("p")?.removeAttribute("hidden")}else{saveBadge.style.display="none";const container2=saveBadge.closest("p");container2&&!container2.querySelector('[class*="ppu"]')&&container2.setAttribute("hidden","")}const priceDropBadge=this.querySelector(".ocs-card--badge-pricedrop");if(priceDropBadge){priceDropBadge.style.display=hasDiscount?"":"none";const badgesContainer=priceDropBadge.closest(".ocs-card--badges");if(badgesContainer){const hasNewBadge=!!badgesContainer.querySelector(".ocs-card--badge-new");badgesContainer.style.display=hasDiscount||hasNewBadge?"":"none"}}const btn=this.querySelector('[data-action="add-to-cart"]');if(btn){const textEl=btn.querySelector('[class*="cart-button-text"]'),state=isInStore?"in-store":isAvailable?"add-to-cart":"sold-out",labelText=this.querySelector(`[data-label="${state}"]`)?.textContent?.trim()||"";btn.dataset.variantId=variantId,btn.classList.remove("ocs-card--cart-button__in-store","ocs-card--cart-button__oos","ocs-button--primary","ocs-button--solid-grey"),btn.removeAttribute("data-state"),btn.disabled=!1,textEl&&(labelText&&(textEl.textContent=labelText),textEl.style.visibility="",textEl.style.opacity=""),labelText&&btn.setAttribute("aria-label",labelText),isInStore?(btn.classList.add("ocs-button--solid-grey","ocs-card--cart-button__in-store"),btn.setAttribute("data-state","in-store"),btn.disabled=!0):isAvailable?(btn.classList.add("ocs-button--primary"),this.ensureCartButtonSpinner(btn)):(btn.classList.add("ocs-button--solid-grey","ocs-card--cart-button__oos"),btn.setAttribute("data-state","sold-out"),btn.disabled=!0)}const ppuEl=this.querySelector('[class*="--ppu"]'),metaLine=ppuEl?.closest('[class*="--meta-line"]');ppuEl&&(!isInStore&&variantPpu&&variantUom?(ppuEl.textContent=`(${variantPpu} / ${variantUom})`,ppuEl.style.display="",metaLine?.removeAttribute("hidden")):(ppuEl.textContent="",ppuEl.style.display="none",metaLine&&(metaLine.querySelector('[class*="save-badge"]:not([style*="display: none"]):not([style*="display:none"])')||metaLine.setAttribute("hidden",""))))}ensureCartButtonSpinner(btn){let spinner=btn.querySelector(".ocs-card--cart-button-spinner");const spinnerHTML='<svg width="20" height="20" viewBox="0 0 20 20" fill="none" aria-hidden="true"><circle cx="10" cy="10" r="8" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-dasharray="50.26" stroke-dashoffset="25.13" /></svg>';spinner||(btn.insertAdjacentHTML("beforeend",`<span class="ocs-card--cart-button-spinner" data-spinner>${spinnerHTML}</span>`),spinner=btn.querySelector(".ocs-card--cart-button-spinner")),spinner&&!spinner.querySelector("svg")&&(spinner.innerHTML=spinnerHTML)}async addToCart(btn){const variantId=this.variantId||btn.dataset.variantId,form=this.querySelector("form");if(!variantId||!form)return;const textEl=btn.querySelector('[class*="cart-button-text"]'),originalText=textEl?.textContent||"";let hasError=!1;this.ensureCartButtonSpinner(btn),textEl&&(textEl.style.visibility="",textEl.style.opacity="");const isUnavailableState=()=>{const state=btn.getAttribute("data-state");return state==="sold-out"||state==="in-store"||btn.classList.contains("ocs-card--cart-button__oos")||btn.classList.contains("ocs-card--cart-button__in-store")};btn.disabled=!0,btn.classList.add("ocs-card--cart-button__loading");try{const formData=new FormData(form);formData.set("id",variantId);const quantity=formData.get("quantity")||"1",itemCount=parseInt(String(quantity),10)||1,analyticsApi=window.OCSAnalyticsEvents;let analyticsPayload=null;if(this.#selectedAnalyticsMetadata&&analyticsApi&&typeof analyticsApi.setCartLineProperties=="function"&&typeof analyticsApi.createAddToCartPayload=="function"&&typeof analyticsApi.publishOcsAnalyticsEvent=="function"){const rawItem={...this.#selectedAnalyticsMetadata,itemAvailability:this.#selectedAnalyticsMetadata.variantInStore==="true"?"In-Store Only":this.#selectedAnalyticsMetadata.variantAvailable==="false"?"Out of Stock":this.#selectedAnalyticsMetadata.variantAvailable==="true"?"In-Stock":"",quantity},persistenceItem=this.#selectedAnalyticsListValid?rawItem:{...rawItem,itemListName:void 0};try{if(typeof formData.delete=="function")for(const key of OCS_PRODUCT_CARD_PROPERTY_KEYS)formData.delete(`properties[${key}]`);analyticsApi.setCartLineProperties(formData,persistenceItem);const builtPayload=analyticsApi.createAddToCartPayload([rawItem],this.#analyticsLocation());
1analyticsPayload=this.#selectedAnalyticsOriginValid?builtPayload:null}catch{analyticsPayload=null}}const sectionIds=[...document.querySelectorAll("cart-items-component[data-section-id]")].map(el=>el.dataset.sectionId);sectionIds.length&&(formData.append("sections",sectionIds.join(",")),formData.append("sections_url",window.location.pathname));const res=await fetch(window.Shopify.routes.root+"cart/add.js",{method:"POST",body:formData}),data=await res.json();if(res.ok){if(analyticsPayload)try{analyticsApi.publishOcsAnalyticsEvent("ocs:add_to_cart",analyticsPayload)}catch{}let lineItem=data;if(!lineItem||typeof lineItem.price!="number"||!lineItem.title)try{const cart=await(await fetch(window.Shopify.routes.root+"cart.js")).json(),selectedVariantId=Number(variantId);lineItem=cart.items?.find(item=>item.variant_id===selectedVariantId)||lineItem}catch{}document.dispatchEvent(new CustomEvent("cart:update",{bubbles:!0,detail:{resource:lineItem,sourceId:`ocs-product-card-${variantId}`,data:{source:"product-form-component",itemCount,variantId,sections:data?.sections||{}}}}));let toastHandled=!1;const toast=document.querySelector("ocs-cart-toast-component");if(toast&&typeof toast.showForItem=="function"&&lineItem&&typeof lineItem.price=="number"&&lineItem.title&&(toast.showForItem(lineItem),toastHandled=!0),!toastHandled){const drawer=document.querySelector("ocs-cart-drawer-component, cart-drawer-component");drawer&&(typeof drawer.open=="function"?drawer.open():typeof drawer.showDialog=="function"&&drawer.showDialog())}}else hasError=!0}catch(err){console.error("Add to cart error:",err),hasError=!0}finally{if(btn.classList.remove("ocs-card--cart-button__loading"),textEl&&(textEl.style.visibility="",textEl.style.opacity=""),isUnavailableState()||(btn.disabled=!1),hasError&&!isUnavailableState()){const errLabel=this.querySelector('[data-label="error"]');btn.classList.add("ocs-card--cart-button__error"),textEl&&(textEl.textContent=errLabel?.textContent?.trim()||originalText,textEl.style.visibility="",textEl.style.opacity=""),setTimeout(()=>{btn.classList.remove("ocs-card--cart-button__error"),textEl&&!isUnavailableState()&&(textEl.textContent=originalText)},2e3)}}}}customElements.define("ocs-product-card",OcsProductCard)}
2//# sourceMappingURL=/cdn/shop/t/1088/assets/ocs-product-card.js.map?v=182103926277094710961789390938

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.