PageSourceSearch

https://thomassabo.com.au/cdn/shop/t/542/assets/block.sticky-add-to-cart.js?v=131406918534170694641790693627

js thomassabo.com.au collected 2026-10-08 07:14:28 UTC 4,579 bytes, 2 lines download raw bytes

1import{EVENTS}from"util.events";import{formatMoney}from"util.currency";class StickyAddToCart extends HTMLElement{constructor(){super(),this.syncButtonState=this.syncButtonState.bind(this)}connectedCallback(){if(this.parentElement!==document.body){document.body.appendChild(this);return}if(this.observeRoot=document.getElementById(this.dataset.observeId),this.stickyButton=this.querySelector(".sticky-add-to-cart__button"),this.labelEl=this.querySelector("[data-sticky-label]"),this.sepEl=this.querySelector("[data-sticky-sep]"),this.priceEl=this.querySelector("[data-sticky-price]"),this.sizeEl=this.querySelector("[data-sticky-size]"),this.sizeOptionIndex=this.dataset.sizeOptionIndex===void 0?-1:Number(this.dataset.sizeOptionIndex),this.sizeOptionName=this.dataset.sizeOptionName||"",this.selectSizeLabel=(this.dataset.selectSizeLabel||"").trim(),!this.observeRoot||!this.stickyButton)return;this.abortController=new AbortController;const{signal}=this.abortController;this.stickyButton.addEventListener("click",this.handleClick.bind(this),{signal}),document.addEventListener(`${EVENTS.variantChange}:${this.dataset.sectionId}:${this.dataset.productId}`,this.handleVariantChange.bind(this),{signal}),this.setupIntersectionObserver(),this.setupMutationObserver(),this.syncButtonState(),this.syncSize()}disconnectedCallback(){this.abortController?.abort(),this.intersectionObserver?.disconnect(),this.mutationObserver?.disconnect()}setupIntersectionObserver(){this.intersectionObserver=new IntersectionObserver(([entry])=>{const scrolledPast=!entry.isIntersecting&&entry.boundingClientRect.top<0;this.toggleAttribute("data-visible",scrolledPast),this.setAttribute("aria-hidden",scrolledPast?"false":"true")},{threshold:0}),this.intersectionObserver.observe(this.observeRoot)}setupMutationObserver(){this.mutationObserver=new MutationObserver(this.syncButtonState),this.mutationObserver.observe(this.observeRoot,{subtree:!0,attributes:!0,attributeFilter:["disabled","class"],characterData:!0,childList:!0})}getRealButton(){return document.getElementById(this.dataset.targetId)}isSizeUnselected(){return!!this.observeRoot.querySelector("[data-unselected]:not(.btn--disabled)")}getVariantPicker(){return document.getElementById(`variant-selects-${this.dataset.sectionId}`)}getSizeFieldset(){return this.getVariantPicker()?.querySelector("[data-size-option]")}syncButtonState(){const realButton=this.getRealButton();if(!realButton)return;const sizeUnselected=this.isSizeUnselected(),isLoading=realButton.classList.contains("btn--loading");if(this.stickyButton.classList.toggle("btn--loading",isLoading),sizeUnselected){this.stickyButton.disabled=!1,this.stickyButton.dataset.state="select-size",this.togglePrice(!0),this.selectSizeLabel&&this.setButtonText(this.selectSizeLabel),this.syncSize();return}this.stickyButton.dataset.state="ready",this.stickyButton.disabled=realButton.disabled,this.togglePrice(!realButton.disabled);const realLabel=(realButton.querySelector("span")?.textContent||realButton.textContent).trim();realLabel&&this.setButtonText(realLabel),this.syncSize()}setButtonText(text){const label=this.labelEl||this.stickyButton.querySelector("[data-sticky-label]")||this.stickyButton;label.textContent.trim()!==text&&(label.textContent=text)}togglePrice(show){this.priceEl&&(this.priceEl.hidden=!show),this.sepEl&&(this.sepEl.hidden=!show)}syncSize(variant){if(!this.sizeEl||this.sizeOptionIndex<0)return;const size=this.getSizeFieldset()?.querySelector("input:checked")?.value||(variant&&!this.isSizeUnselected()?this.getSizeFromVariant(variant):"");this.sizeEl.textContent=size?`${this.sizeOptionName} ${size}`:""}getSizeFromVariant(variant){return variant&&(variant.options?.[this.sizeOptionIndex]||variant[`option${this.sizeOptionIndex+1}`])||""}handleVariantChange({detail}){this.priceEl&&detail.variant&&(this.priceEl.textContent=formatMoney(detail.variant.price,this.dataset.moneyFormat)),this.syncSize(detail.variant),this.syncButtonState()}handleClick(){const realButton=this.getRealButton();if(realButton){if(this.stickyButton.dataset.state==="select-size"||this.isSizeUnselected()){this.scrollToBuyBox();return}realButton.click()}}scrollToBuyBox(){const target=this.getSizeFieldset()||this.getVariantPicker()||this.observeRoot;if(!target)return;target.scrollIntoView({behavior:"smooth",block:"center"}),target.querySelector?.("input:not(:disabled), select")?.focus({preventScroll:!0})}}customElements.define("sticky-add-to-cart",StickyAddToCart);
2//# sourceMappingURL=/cdn/shop/t/542/assets/block.sticky-add-to-cart.js.map?v=131406918534170694641790693627

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.