PageSourceSearch

https://shop.angel.com/cdn/shop/t/143/assets/cart-drawer.js?v=151635685220100947421769709132

js angel.com collected 2026-09-24 08:43:37 UTC 11,940 bytes, 2 lines download raw bytes

1function hasUtmParameters(){return Array.from(new URLSearchParams(window.location.search).keys()).some(param=>param.toLowerCase().startsWith("utm_"))}function updateCartIcon(){fetch(window.Shopify.routes.root+"?section_id=cart-icon-bubble").then(response=>response.text()).then(responseText=>{const newIcon=new DOMParser().parseFromString(responseText,"text/html").querySelector("#cart-icon-bubble"),existingIcon=document.querySelector("#cart-icon-bubble");newIcon&&existingIcon&&(existingIcon.innerHTML=newIcon.innerHTML,bindCartIconClickHandler(existingIcon))}).catch(e=>console.error("Error updating cart icon:",e))}function bindCartIconClickHandler(cartIcon){cartIcon&&(cartIcon.removeEventListener("click",cartIconClickHandler),cartIcon.addEventListener("click",cartIconClickHandler))}function cartIconClickHandler(event){event.preventDefault(),event.stopPropagation();const cartDrawer=document.querySelector("cart-drawer");cartDrawer&&typeof cartDrawer.open=="function"&&cartDrawer.open(event.currentTarget)}let addToCartClicked=!1,drawerRecentlyOpened=!1;document.addEventListener("click",function(e){e.target.matches('[type="submit"]')&&e.target.closest('form[action*="/cart/add"]')&&(addToCartClicked=!0,setTimeout(()=>{addToCartClicked=!1},3e3))});function openCartDrawerOnce(){if(drawerRecentlyOpened){console.log("[Cart Drawer] Skipping open - already opened recently");return}const cartDrawer=document.querySelector("cart-drawer");cartDrawer&&typeof cartDrawer.open=="function"&&(drawerRecentlyOpened=!0,cartDrawer.open(),setTimeout(()=>{drawerRecentlyOpened=!1},1e3))}function refreshCartDrawer(){fetch(window.Shopify.routes.root+"?section_id=cart-drawer").then(response=>response.text()).then(responseText=>{const html=new DOMParser().parseFromString(responseText,"text/html"),newCartDrawer=html.querySelector("#CartDrawer"),existingCartDrawer=document.querySelector("#CartDrawer");newCartDrawer&&existingCartDrawer&&(existingCartDrawer.innerHTML=newCartDrawer.innerHTML);const newCartItems=html.querySelector("cart-drawer-items"),existingCartItems=document.querySelector("cart-drawer-items");newCartItems&&existingCartItems&&(existingCartItems.innerHTML=newCartItems.innerHTML);const cartDrawer=document.querySelector("cart-drawer");cartDrawer&&newCartItems&&newCartItems.querySelector(".drawer__cart-items-wrapper")&&cartDrawer.classList.remove("is-empty"),updateCartIcon(),openCartDrawerOnce()}).catch(e=>console.error("Cart update error:",e))}document.addEventListener("cart:updated",event=>{console.log("CART UPDATED EVENT",event.detail),refreshCartDrawer()});class CartDrawer extends HTMLElement{constructor(){super(),this.addEventListener("keyup",evt=>evt.code==="Escape"&&this.close());const overlay=this.querySelector("#CartDrawer-Overlay");overlay&&overlay.addEventListener("click",this.close.bind(this)),this.setHeaderCartIconAccessibility()}setHeaderCartIconAccessibility(){const cartLink=document.querySelector("#cart-icon-bubble");cartLink&&(cartLink.setAttribute("role","button"),cartLink.setAttribute("aria-haspopup","dialog"),bindCartIconClickHandler(cartLink),cartLink.addEventListener("keydown",event=>{event.code.toUpperCase()==="SPACE"&&(event.preventDefault(),this.open(cartLink))}))}open(triggeredBy){hasUtmParameters()&&!triggeredBy&&!addToCartClicked||(triggeredBy&&this.setActiveElement(triggeredBy),setTimeout(()=>{this.classList.add("animate","active")}),this.addEventListener("transitionend",()=>{const containerToTrapFocusOn=this.classList.contains("is-empty")?this.querySelector(".drawer__inner-empty"):document.getElementById("CartDrawer"),focusElement=this.querySelector(".drawer__inner")||this.querySelector(".drawer__close");typeof trapFocus=="function"&&trapFocus(containerToTrapFocusOn,focusElement)},{once:!0}),document.body.classList.add("overflow-hidden"))}close(){this.classList.remove("active"),typeof removeTrapFocus=="function"&&removeTrapFocus(this.activeElement),document.body.classList.remove("overflow-hidden")}renderContents(parsedState){const cartDrawer=this.querySelector("cart-drawer");cartDrawer&&parsedState&&parsedState.item_count>
10&&cartDrawer.classList.remove("is-empty"),this.getSectionsToRender().forEach(section=>{const sectionElement=section.selector?document.querySelector(section.selector):document.getElementById(section.id);sectionElement&&parsedState&&parsedState.sections&&parsedState.sections[section.id]&&(sectionElement.innerHTML=this.getSectionInnerHTML(parsedState.sections[section.id],section.selector))}),setTimeout(()=>{const overlay=this.querySelector("#CartDrawer-Overlay");overlay&&overlay.addEventListener("click",this.close.bind(this)),(!hasUtmParameters()||addToCartClicked)&&openCartDrawerOnce()}),updateCartIcon()}getSectionInnerHTML(html,selector=".shopify-section"){const el=new DOMParser().parseFromString(html,"text/html").querySelector(selector);return el?el.innerHTML:""}getSectionsToRender(){return[{id:"cart-drawer",selector:"#CartDrawer"},{id:"cart-icon-bubble"}]}getSectionDOM(html,selector=".shopify-section"){return new DOMParser().parseFromString(html,"text/html").querySelector(selector)}setActiveElement(element){this.activeElement=element}}customElements.define("cart-drawer",CartDrawer);class CartDrawerItems extends CartItems{getSectionsToRender(){return[{id:"CartDrawer",section:"cart-drawer",selector:".drawer__inner"},{id:"cart-icon-bubble",section:"cart-icon-bubble",selector:".shopify-section"}]}}if(customElements.define("cart-drawer-items",CartDrawerItems),document.addEventListener("DOMContentLoaded",function(){const cartIcon=document.querySelector("#cart-icon-bubble");cartIcon&&bindCartIconClickHandler(cartIcon)}),document.readyState!=="loading"){const cartIcon=document.querySelector("#cart-icon-bubble");cartIcon&&bindCartIconClickHandler(cartIcon)}function buildCartAddRequestBodyFromForm(form){const formData=new FormData(form),variantId=formData.get("id"),quantity=formData.get("quantity")||1,sellingPlan=formData.get("selling_plan"),properties={};for(const[key,value]of formData.entries()){const v=String(value??"").trim();if(!v)continue;const match=key.match(/^properties\[(.+)\]$/);if(match){properties[match[1]]=v;continue}(key.startsWith("_givy_")||key.startsWith("givy_"))&&(properties[key]=v)}const parsedVariantId=parseInt(String(variantId).trim(),10),parsedQuantity=parseInt(String(quantity).trim(),10)||1;if(!parsedVariantId||Number.isNaN(parsedVariantId))return null;const requestBody={id:parsedVariantId,quantity:parsedQuantity};if(sellingPlan&&String(sellingPlan).trim()){const parsedSellingPlan=parseInt(String(sellingPlan).trim(),10);Number.isNaN(parsedSellingPlan)||(requestBody.selling_plan=parsedSellingPlan)}return Object.keys(properties).length&&(requestBody.properties=properties),requestBody}const processingForms=new WeakSet;function universalAddToCart(form,submitButton){if(processingForms.has(form)){console.log("[Universal Add-to-Cart] Already processing this form, skipping");return}processingForms.add(form),submitButton&&(submitButton.setAttribute("aria-disabled","true"),submitButton.disabled=!0,submitButton.classList.add("loading"));const spinner=form.querySelector(".loading__spinner")||submitButton&&submitButton.querySelector(".loading__spinner");spinner&&spinner.classList.remove("hidden");const formData=new FormData(form);console.log("[Universal Add-to-Cart] Form data:");for(let[key,value]of formData.entries())console.log(`  ${key}: ${value}`);const requestBody=buildCartAddRequestBodyFromForm(form);if(!requestBody){console.error("[Universal Add-to-Cart] Invalid / missing variant ID in form.");const idInput=form.querySelector('input[name="id"]');console.error("[Universal Add-to-Cart] Direct input check - id input:",idInput,"value:",idInput?.value),processingForms.delete(form),submitButton&&(submitButton.removeAttribute("aria-disabled"),submitButton.disabled=!1,submitButton.classList.remove("loading")),form.querySelectorAll('[data-was-disabled="true"]').forEach(el=>{el.disabled=!0,delete el.dataset.wasDisabled}),spinner&&spinner.classList.add("hidden");return}console.log("[Universal Add-to-Cart] Request body:",JSON.stringify(requestBody)),fetch("/cart/add.js",{method:"POST",headers:{"Content-Type":"application/json","X-Requested-With":"XMLHttpRequest"},body:JSON.stringify(requestBody)}).then(response=>(console.log("[Universal Add-to-Cart] Response status:",response.status),response.json())).then(data=>{if(console.log("[Universal Add-to-Cart] Response data:",data),data.status===422||data.status==="error"||data.message){const errorMsg=data.description||data.message||"Could not add to cart";console.error("[Universal Add-to-Cart] Shopify Error:",errorMsg,"Full response:",data),alert(errorMsg)}else console.log("[Universal Add-to-Cart] Success:",data),document.dispatchEvent(new CustomEvent("cart:updated",{detail:data}))}).catch(error=>{console.error("[Universal Add-to-Cart] Network error:",error)}).finally(()=>{processingForms.delete(form),submitButton&&(submitButton.removeAttribute("aria-disabled"),submitButton.disabled=!1,submitButton.classList.remove("loading")),spinner&&spinner.classList.add("hidden"),form.querySelectorAll('[data-was-disabled="true"]').forEach(el=>{el.disabled=!0,delete el.dataset.wasDisabled})})}function isAddToCartForm(form){return!form||form.tagName!=="FORM"?!1:form.getAttribute("data-type")==="add-to-cart-form"||form.dataset.ajaxHijacked==="true"||form.dataset.originalAction&&form.dataset.originalAction.includes("/cart/add")||form.action&&form.action.includes("/cart/add")}function hijackAddToCartForms(){document.querySelectorAll('form[data-type="add-to-cart-form"], form[action*="/cart/add"]').forEach(form=>{if(form.dataset.ajaxHijacked)return;form.dataset.ajaxHijacked="true";const originalAction=form.getAttribute("action");form.removeAttribute("action"),form.dataset.originalAction=originalAction||"/cart/add";const variantInput=form.querySelector('input[name="id"]');variantInput&&variantInput.disabled&&(variantInput.disabled=!1),form.addEventListener("submit",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();const submitButton=form.querySelector('button[type="submit"]')||form.querySelector('[type="submit"]');return universalAddToCart(form,submitButton),!1},!0),console.log("[Universal Add-to-Cart] Hijacked form:",form.id||form.className)})}document.addEventListener("DOMContentLoaded",hijackAddToCartForms),document.readyState!=="loading"&&hijackAddToCartForms();const formObserver=new MutationObserver(function(mutations){let shouldCheck=!1;mutations.forEach(function(mutation){mutation.addedNodes.length&&(shouldCheck=!0)}),shouldCheck&&hijackAddToCartForms()});formObserver.observe(document.body||document.documentElement,{childList:!0,subtree:!0}),document.addEventListener("submit",function(e){const form=e.target;if(!isAddToCartForm(form)||form.dataset.ajaxHijacked)return;console.log("[Universal Add-to-Cart] Capture phase - intercepting submit"),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();const variantInput=form.querySelector('input[name="id"]');variantInput&&variantInput.disabled&&(variantInput.disabled=!1);const submitButton=form.querySelector('button[type="submit"]')||form.querySelector('[type="submit"]');return universalAddToCart(form,submitButton),!1},!0),document.addEventListener("click",function(e){const button=e.target.closest('button[type="submit"], input[type="submit"], [type="submit"]');if(!button)return;const form=button.closest("form");if(!form||!isAddToCartForm(form)||form.dataset.ajaxHijacked)return;console.log("[Universal Add-to-Cart] Capture phase - intercepting click"),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();const variantInput=form.querySelector('input[name="id"]');return variantInput&&variantInput.disabled&&(variantInput.disabled=!1),universalAddToCart(form,button),!1},!0);
2//# sourceMappingURL=/cdn/shop/t/143/assets/cart-drawer.js.map?v=151635685220100947421769709132

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.