PageSourceSearch

https://gir.co/cdn/shop/t/295/assets/product-form.min.js?v=104420193377967484291789584699

js gir.co collected 2026-09-25 14:33:21 UTC 5,163 bytes, 1 lines download raw bytes

1customElements.get("product-form")||customElements.define("product-form",class extends HTMLElement{constructor(){super(),this.form=this.querySelector("form"),this.form.querySelector("[name=id]").disabled=!1,this.form.addEventListener("submit",this.onSubmitHandler.bind(this)),this.cart=document.querySelector("cart-notification")||document.querySelector("cart-drawer"),this.submitButton=this.querySelector('[type="submit"]'),document.querySelector("cart-drawer")&&this.submitButton.setAttribute("aria-haspopup","dialog"),this.buyForm=document.querySelector(".js-buy-form"),this.buyFormWrapper=document.querySelector(".js-buy-form-wrapper"),this.productContentWrapper=document.querySelector(".js-product-content-wrapper"),this.buyForm&&this.productContentWrapper&&(this.onScrollHandler=this.onScroll.bind(this),window.addEventListener("scroll",this.onScrollHandler,!1)),this.initIconWithText()}onScroll(){let t=this.buyFormWrapper.getBoundingClientRect().bottom,e=document.querySelector("footer");const r=this.buyForm?.querySelector(".scroll-to-form"),s=document.querySelector("#productSelect"),o=s?s.nextElementSibling.offsetTop-100:document.querySelector(".product__info-wrapper").offsetTop;r&&r.querySelector("button").addEventListener("click",(()=>{window.scrollTo({top:o,behavior:"smooth"})})),t<0&&!this.buyForm.classList.contains("buy-form--sticky")?(this.buyForm.classList.add("buy-form--sticky"),r?.classList.remove("hidden")):t>0&&this.buyForm.classList.contains("buy-form--sticky")&&(this.buyForm.classList.remove("buy-form--sticky"),r?.classList.add("hidden")),this.elementInViewport(e)?this.buyForm.classList.add("buy-form--hide"):this.buyForm.classList.remove("buy-form--hide")}elementInViewport(t){for(var e=t.offsetTop,r=t.offsetLeft,s=t.offsetWidth,o=t.offsetHeight;t.offsetParent;)e+=(t=t.offsetParent).offsetTop,r+=t.offsetLeft;return e<window.pageYOffset+window.innerHeight&&r<window.pageXOffset+window.innerWidth&&e+o>window.pageYOffset&&r+s>window.pageXOffset}onSubmitHandler(t){if(t.preventDefault(),this.variantPickers=document.querySelectorAll(".js-variant-picker"),this.variantPickers){let t=!0;if(this.variantPickers.forEach((e=>{"false"===e.dataset.selected?(t=!1,e.querySelector(".js-wrong-alert")&&e.querySelector(".js-wrong-alert").classList.add("active")):e.querySelector(".js-wrong-alert")&&e.querySelector(".js-wrong-alert").classList.remove("active")})),!t)return void this.variantPickers.forEach((t=>{"false"!==t.dataset.selected||this.elementInViewport(t)||window.scrollTo({top:t.offsetTop-200,behavior:"smooth"})}))}if("true"===this.submitButton.getAttribute("aria-disabled"))return;this.handleErrorMessage(),this.submitButton.setAttribute("aria-disabled",!0),this.submitButton.classList.add("loading");const e=fetchConfig("javascript");e.headers["X-Requested-With"]="XMLHttpRequest",delete e.headers["Content-Type"];const r=new FormData(this.form);this.cart&&(r.append("sections",this.cart.getSectionsToRender().map((t=>t.id))),r.append("sections_url",window.location.pathname),this.cart.setActiveElement(document.activeElement)),e.body=r,fetch(`${routes.cart_add_url}`,e).then((t=>t.json())).then((t=>{if(t.status){this.handleErrorMessage(t.description);const e=this.submitButton.querySelector(".sold-out-message");if(!e)return;return this.submitButton.setAttribute("aria-disabled",!0),this.submitButton.querySelector("span").classList.add("hidden"),e.classList.remove("hidden"),void(this.error=!0)}if(!this.cart)return void(window.location=window.routes.cart_url);this.error=!1,trackConversionTagEvent("productAdded");const e=this.closest("quick-add-modal");e?(document.body.addEventListener("modalClosed",(()=>{setTimeout((()=>{this.cart.renderContents(t)}))}),{once:!0}),e.hide(!0)):this.cart.renderContents(t)})).catch((t=>{console.error(t)})).finally((()=>{this.submitButton.classList.remove("loading"),this.cart&&this.cart.classList.contains("is-empty")&&this.cart.classList.remove("is-empty"),this.error||this.submitButton.removeAttribute("aria-disabled")}))}handleErrorMessage(t=!1){this.errorMessageWrapper=this.errorMessageWrapper||this.querySelector(".product-form__error-message-wrapper"),this.errorMessageWrapper&&(this.errorMessage=this.errorMessage||this.errorMessageWrapper.querySelector(".product-form__error-message"),this.errorMessageWrapper.toggleAttribute("hidden",!t),t&&(this.errorMessage.textContent=t))}initIconWithText(){const t=document.querySelectorAll(".icon-with-text__item");function e(t,e,r,s,o){t.style.top=e,t.style.right=r,t.style.left=s,t.style.transform=o}t?.forEach((t=>{const r=t?.querySelector(".text-tooltip");r&&(t.addEventListener("mousemove",(s=>{const o=r.offsetWidth,i=window.innerWidth;if(isTouchDevice()){if(isTouchDevice()){t.style.position="relative",r.style.display="block",e
1(r,"100%","auto","50%","translateX(-50%)");const s=r.getBoundingClientRect();s.right>i?e(r,"100%","0","auto","translateX(0)"):s.left<10&&e(r,"100%","auto","0","translateX(0)")}}else{t.style.position="static",r.style.display="block";let n=s.pageX+10,a=s.pageY+10;n+o+10>i&&(n=i-o-10),e(r,a+"px","auto",n+"px","translateX(0)")}})),t.addEventListener("mouseout",(()=>{r.style.display="none"})))}))}});

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.