PageSourceSearch

https://charmingcharlie.com/cdn/shop/t/407/assets/variant-picker.js?v=19621414781864386571755037574

js charmingcharlie.com collected 2026-09-25 14:09:07 UTC 9,495 bytes, 2 lines download raw bytes

1if(!customElements.get("variant-picker")){class VariantPicker extends HTMLElement{constructor(){super(),this.section=this.closest(".js-product"),this.productForm=this.section.querySelector(".js-product-form"),this.optionSelectors=this.querySelectorAll(".option-selector:not(.option-selector--custom)"),this.nativeSelector=document.getElementById(`variants-${this.section.dataset.section}`),this.data=this.getVariantData(),this.selectedOptions=this.getSelectedOptions(),this.variant=this.getSelectedVariant(),this.updateAvailability(),this.updateAddToCartButton(),this.addEventListener("change",this.handleVariantChange.bind(this)),this.applySearchParams(),this.setAttribute("loaded","")}handleVariantChange(evt){this.selectedOptions=this.getSelectedOptions(),this.variant=this.getSelectedVariant(),this.preSelection=!this.variant&&this.selectedOptions.find(o=>o===null)===null,this.updateUrl(evt),this.updateVariantInput(),this.updateAddToCartButton(),this.updateAvailability(),this.updatePrice(),this.updateBackorderText(),this.updatePickupAvailability(),this.updateSku(),this.updateBarcode(),VariantPicker.updateLabelText(evt),this.dispatchEvent(new CustomEvent("on:variant:change",{bubbles:!0,detail:{form:this.productForm,variant:this.variant,allVariants:this.data.variants,selectedOptions:this.selectedOptions}}))}updateAddToCartButton(){if(!this.productForm||this.selectedOptions.indexOf(null)>-1)return;this.addBtn=this.addBtn||this.productForm.querySelector('[name="add"]');const variantAvailable=this.variant&&this.variant.available,unavailableStr=this.variant?theme.strings.noStock:theme.strings.noVariant;this.addBtn.disabled=!variantAvailable,this.addBtn.textContent=variantAvailable?this.addBtn.dataset.addToCartText:unavailableStr}static updateOptionAvailability(optionEl,exists,available){const el=optionEl,unavailableText=exists?theme.strings.noStock:theme.strings.noVariant;if(el.classList.toggle("is-unavailable",!available),el.classList.toggle("is-nonexistent",!exists),optionEl.classList.contains("custom-select__option")){const em=el.querySelector("em");em&&(em.hidden=available),available||(em?em.textContent=unavailableText:el.innerHTML=`${el.innerHTML} <em class="pointer-events-none">${unavailableText}</em>`)}else available?el.nextElementSibling.removeAttribute("title"):el.nextElementSibling.title=unavailableText}updateAvailability(){if(this.dataset.availability==="off")return;const{availabilityMode}=this.dataset;let currVariant=this.variant;this.variant||(currVariant={options:this.selectedOptions}),availabilityMode==="selection"?(this.querySelectorAll(".js-option").forEach(optionEl=>{VariantPicker.updateOptionAvailability(optionEl,!1,!1)}),this.optionSelectors.forEach((selector,selectorIndex)=>
1{this.data.variants.forEach(variant=>{let matchCount=0;if(variant.options.forEach((option,optionIndex)=>{option===currVariant.options[optionIndex]&&optionIndex!==selectorIndex&&(matchCount+=1)}),matchCount===currVariant.options.length-1){const options=selector.querySelectorAll(".js-option"),optionEl=Array.from(options).find(opt=>selector.dataset.selectorType==="dropdown"?opt.dataset.value===variant.options[selectorIndex]:opt.value===variant.options[selectorIndex]);optionEl&&VariantPicker.updateOptionAvailability(optionEl,!0,variant.available)}})})):this.optionSelectors.forEach((selector,selectorIndex)=>{selector.querySelectorAll('.js-option:not([data-value=""])').forEach(option=>{const optionValue=selector.dataset.selectorType==="dropdown"?option.dataset.value:option.value;let variantsExist=!1,variantsAvailable=!1;this.data.variants.forEach(v=>{let matches=0;for(let i=0;i<selectorIndex;i+=1)(v.options[i]===this.selectedOptions[i]||this.selectedOptions[i]===null)&&(matches+=1);v.options[selectorIndex]===optionValue&&matches===selectorIndex&&(variantsExist=!0,v.available&&(variantsAvailable=!0))}),VariantPicker.updateOptionAvailability(option,variantsExist,variantsAvailable)})})}updateBackorderText(){if(this.backorder=this.backorder||this.section.querySelector(".backorder"),!this.backorder)return;let hideBackorder=!0;if(this.variant&&this.variant.available){const{inventory}=this.data.formatted[this.variant.id];if(this.variant.inventory_management&&inventory==="none"){const backorderProdEl=this.backorder.querySelector(".backorder__product"),prodTitleEl=this.section.querySelector(".product-title"),variantTitle=this.variant.title.includes("Default")?"":` - ${this.variant.title}`;backorderProdEl.textContent=`${prodTitleEl.textContent}${variantTitle}`,hideBackorder=!1}}this.backorder.hidden=hideBackorder}static updateLabelText(evt){const selector=evt.target.closest(".option-selector");if(selector.dataset.selectorType==="dropdown")return;const colorText=selector.querySelector(".js-color-text");colorText&&(colorText.textContent=evt.target.nextElementSibling.querySelector(".js-value").textContent)}updatePickupAvailability(){this.pickUpAvailability=this.pickUpAvailability||this.section.querySelector("pickup-availability"),this.pickUpAvailability&&(this.variant&&this.variant.available?this.pickUpAvailability.getAvailability(this.variant.id):(this.pickUpAvailability.removeAttribute("available"),this.pickUpAvailability.innerHTML=""))}updatePrice(){if(this.price=this.price||this.section.querySelector(".product-info__price .price"),!this.price)return;let{variant}=this;if(this.preSelection){variant=this.data.variants[0];for(let i=1;i<this.data.variants.length;i+=1)this.data.variants[i].price<variant.price&&(variant=this.data.variants[i])}if(variant){const priceCurrentEl=this.price.querySelector(".price__current"),priceWasEl=this.price.querySelector(".price__was"),unitPriceEl=this.price.querySelector(".unit-price");if(priceCurrentEl.innerHTML=this.data.formatted[variant.id].price,priceWasEl&&(priceWasEl.innerHTML=this.data.formatted[variant.id].compareAtPrice||""),variant.unit_price_measurement){const valueEl=this.price.querySelector(".unit-price__price"),unitEl=this.price.querySelector(".unit-price__unit"),value=variant.unit_price_measurement.reference_value,unit=variant.unit_price_measurement.reference_unit;valueEl.innerHTML=this.data.formatted[variant.id].unitPrice,unitEl.textContent=value===1?unit:`${value} ${unit}`,unitPriceEl.hidden=!1}else unitPriceEl&&(unitPriceEl.hidden=!0);this.price.classList.toggle("price--on-sale",variant.compare_at_price>variant.price),this.price.classList.toggle("price--sold-out",!variant.available&&!this.preSelection)}this.price.querySelector(".price__default").hidden=!this.variant&&!this.preSelection,this.price.querySelector(".price__no-variant").hidden=this.variant||this.preSelection;const from=this.price.querySelector(".price__from");from&&(from.hidden=!this.preSelection)}updateSku(){if(this.sku=this.sku||this.section.querySelector(".product-sku__value"),!this.sku)return;const skuAvailable=this.variant&&this.variant.sku;this.sku.textContent=skuAvailable?this.variant.sku:"",this.sku.parentNode.hidden=!skuAvailable}updateBarcode(){if(this.barcode=this.barcode||this.section.querySelector(".product-barco
1de__value"),!this.barcode)return;const barcodeAvailable=this.variant&&this.variant.barcode;this.barcode.textContent=barcodeAvailable?this.variant.barcode:"",this.barcode.parentNode.hidden=!barcodeAvailable}updateUrl(evt){if(!evt||evt.type!=="change"||this.dataset.updateUrl==="false")return;const url=this.variant?`${this.dataset.url}?variant=${this.variant.id}`:this.dataset.url;window.history.replaceState({},"",url)}updateVariantInput(){this.forms=this.forms||this.section.querySelectorAll(".js-product-form, .js-instalments-form"),this.forms.forEach(form=>{const input=form.querySelector('[name="id"]');input.value=this.variant?this.variant.id:"",input.dispatchEvent(new Event("change",{bubbles:!0}))})}getVariantData(){const dataEl=this.querySelector('[type="application/json"]');return JSON.parse(dataEl.textContent)}getSelectedOptions(){const selectedOptions=[];return this.optionSelectors.forEach(selector=>{if(selector.dataset.selectorType==="dropdown"){const selected=selector.querySelector('.custom-select__option[aria-selected="true"]');selectedOptions.push(selected&&selected.dataset.value!==""?selected.dataset.value:null)}else{const selected=selector.querySelector("input:checked");selectedOptions.push(selected?selected.value:null)}}),selectedOptions}getSelectedVariant(){return this.data.variants.find(v=>v.options.every((val,index)=>val===this.selectedOptions[index]))}applySearchParams(){const searchParams=new URLSearchParams(window.location.search);Array.from(searchParams.keys()).forEach(key=>{const value=searchParams.get(key),matchingOptionSelector=Array.from(this.optionSelectors).find(x=>x.dataset.option===key);if(matchingOptionSelector)if(matchingOptionSelector.dataset.selectorType==="dropdown"){const colorOptionDropdown=matchingOptionSelector.querySelector(`.custom-select__option[data-value="${value}"]`);colorOptionDropdown&&colorOptionDropdown.closest("custom-select").selectOption(colorOptionDropdown)}else{const matchingInput=matchingOptionSelector.querySelector(`input[value="${value}"]`);matchingInput&&(matchingOptionSelector.querySelector(".option-selector__label-value")&&(matchingOptionSelector.querySelector(".option-selector__label-value").textContent=value),matchingInput.checked=!0,matchingInput.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!1})))}})}}customElements.define("variant-picker",VariantPicker)}
2//# sourceMappingURL=/cdn/shop/t/407/assets/variant-picker.js.map?v=19621414781864386571755037574

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.