PageSourceSearch

https://woodsorrelstudios.com/cdn/shop/t/18/assets/product.add-to-cart.js?v=153565341879909331761788906318

js woodsorrelstudios.com collected 2026-10-10 01:09:45 UTC 5,579 bytes, 2 lines download raw bytes

1import{EVENTS}from"util.events";import{trapFocus,removeTrapFocus}from"util.a11y";const classes={isAdded:"is-added"};class AddToCart extends HTMLElement{connectedCallback(){this.qtySelector=this.querySelector("quantity-selector"),this.qtySelectorInput=this.qtySelector?.querySelector('input[name="quantity"]'),this.button=this.querySelector(".js-add-to-cart"),this.successMessage=this.querySelector(".js-added"),this.abortController=new AbortController,this.variantId=this.dataset.variantId,this.changingQuantity=!1,this.smallContainer=!1,this.activeElement=null,this.isHovering=!1,this.count=this.getAttribute("data-count")?parseInt(this.getAttribute("data-count")):0,this.container=this.closest(".product-grid-item"),this.debounceTimeout=null,this.pendingQuantity=null,!(!this.button||!this.qtySelector)&&(this.resizeObserver=new ResizeObserver(this.handleResize.bind(this)),!this.count&&this.container&&this.resizeObserver.observe(this.container),this.qtySelector.addEventListener("quantity:change",this.handleQuantityChange.bind(this),{signal:this.abortController.signal}),this.addEventListener("mouseover",()=>{this.isHovering=!0,this.open()},{signal:this.abortController.signal}),this.addEventListener("mouseout",()=>{this.isHovering=!1,this.close()},{signal:this.abortController.signal}),this.button.addEventListener("click",()=>{this.button.classList.contains("at-add-to-cart__button--add")&&(this.changeQuantity(1),this.qtySelectorInput.value=1),this.button.getAttribute("aria-expanded")=="false"?this.open():this.close()},{signal:this.abortController.signal}),this.addEventListener("focusout",evt=>(!this.contains(evt.relatedTarget)||!this.contains(evt.target))&&this.close(),{signal:this.abortController.signal}),this.addEventListener("keydown",evt=>evt.key==="Escape"&&this.close(),{signal:this.abortController.signal}),document.addEventListener(EVENTS.cartUpdated,this.handleCartUpdated.bind(this),{signal:this.abortController.signal}))}disconnectedCallback(){this.abortController.abort(),this.debounceTimeout&&clearTimeout(this.debounceTimeout)}open(){const currentQuantity=this.qtySelectorInput?parseInt(this.qtySelectorInput.value)||0:this.count;!this.button||currentQuantity>0||this.smallContainer||(this.button.setAttribute("aria-expanded","true"),this.classList.remove(classes.isAdded),this.contains(document.activeElement)&&this.qtySelectorInput.focus())}close(){const currentQuantity=this.qtySelectorInput?parseInt(this.qtySelectorInput.value)||0:this.count;!this.button||this.changingQuantity||currentQuantity>0||this.smallContainer||(this.button.setAttribute("aria-expanded","false"),this.activeElement&&this.activeElement.focus())}async handleQuantityChange({detail}){this.contains(document.activeElement)&&(this.activeElement=document.activeElement),this.changeQuantity(detail.qty)}changeQuantity(quantity){this.debounceTimeout&&clearTimeout(this.debounceTimeout),this.changingQuantity=!0,this.pendingQuantity=quantity,this.debounceTimeout=setTimeout(async()=>{const previousQuantity=this.qtySelectorInput?parseInt(this.qtySelectorInput.getAttribute("data-initial-value"))||0:this.count,body={updates:{[this.variantId]:this.pendingQuantity},sections:["cart-ajax"]};try{const response=await this.updateCart(body);this.handleProductAdded(response,this.pendingQuantity,previousQuantity)}catch(error){this.changingQuantity=!1,this.checkShouldClose(),console.error("Cart update failed:",error)}},100)}handleProductAdded(response,newQuantity,previousQuantity){if(this.dispatchEvent(new CustomEvent(EVENTS.ajaxProductAdded,{bubbles:!0,detail:{product:response,preventCartOpen:!0}})),previousQuantity==0&&newQuantity>0&&(this.classList.add(classes.isAdded),trapFocus(this.successMessage),setTimeout(()=>{this.handleCartDrawerChange()},3e3)),this.qtySelectorInput&&this.qtySelectorInput.setAttribute("data-initial-value",newQuantity),this.count=newQuantity,this.setAttribute("data-count",newQuantity),this.button){const isDisabled=newQuantity>0;this.button.disabled=isDisabled,this.button.setAttribute("aria-expanded",isDisabled?"true":"false")}this.changingQuantity=!1,this.checkShouldClose()}async updateCart(body){return fetch(`${window.Shopify.routes.root}cart/update.js`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(body)}).then(response=>{if(!response.ok)throw response;return response.json()})}handleCartDrawerChange(){this.classList.remove(classes.isAdded),removeTrapFocus(this.activeElement)}handleCartUpdated(evt){const cart=evt.detail?.cart;if(!cart)return;const cartItem=cart.items?.find(item=>item.variant_id===parseInt(this.variantId)),newQuantity=cartItem?cartItem.quantity:0;if(this.count=newQuantity,this.setAttribute("data-count",newQuantity),this.qtySelectorInput&&(this.qtySelectorInput.value=newQuantity,this.qtySelector.style.setProperty("--digit-count",`${newQuantity.toString().length}ch`),this.qtySelectorInput.setAttribute("data-initial-value",newQuantity)),this.button){const isDisabled=newQuantity>0;this.button.disabled=isDisabled,this.button.setAttribute("aria-expanded",isDisabled?"true":"false")}}checkShouldClose(){const currentQuantity=this.qtySelectorInput?parseInt(this.qtySelectorInput.value)||0:this.count;!this.isHovering&&currentQuantity===0&&!this.changingQuantity&&!this.smallContainer&&this.button?.setAttribute("aria-expanded","fal
1se")}handleResize(){this?.container?.offsetWidth<=235?this.smallContainer=!0:this.smallContainer=!1}}customElements.define("at-add-to-cart",AddToCart);
2//# sourceMappingURL=/cdn/shop/t/18/assets/product.add-to-cart.js.map?v=153565341879909331761788906318

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.