PageSourceSearch

https://paulandjoe.com/cdn/shop/t/55/assets/jolly-scripts.js?v=51324056611442196161788445483

js paulandjoe.com collected 2026-09-25 14:13:35 UTC 19,659 bytes, 4 lines download raw bytes

1async function getSectionHTML(sectionId,productId,isUpsale){return new Promise(function(resolve,reject){const query="id:"+productId,qq=productId?"&q="+query:"",url=window.Shopify.routes.root+"search/?sections="+sectionId+qq;fetch(url).then(function(r){r.json().then(function(res){var keys=Object.keys(res);return keys.length>0?resolve(res[keys[0]]):reject()})})})}async function setModalContent(section,productId,isUpsale){const html=await getSectionHTML(section,productId,isUpsale);let jollyModalProduct=document.querySelector("jolly-modal-product");const jollyModalInner=document.getElementById("jolly-modal-product");jollyModalInner.innerHTML=html;const addToCartBtn=jollyModalInner.querySelector("[js-add-to-cart-btn]");isUpsale==!0&&addToCartBtn.classList.add("jc-upsales-button"),jollyModalProduct.classList.remove("jc-translate-y-full"),jollyModalProduct.classList.add("jc-translate-y-0")}customElements.get("jolly-product-card")||customElements.define("jolly-product-card",class extends HTMLElement{constructor(){super(),this.elements={addMobileCard:this.querySelectorAll(".jc-mobile-cart-item-add"),addBtn:this.querySelectorAll("[js-add-to-cart-btn]")},this.addEventListener("mouseleave",()=>{this.querySelector(".jc-product-img--hover")?.removeAttribute("style")}),this.elements.addMobileCard.forEach(element=>{element.addEventListener("click",event=>{event.preventDefault();let productId=this.getAttribute("jolly-card-id"),section=this.querySelector(".jolly-card-section").dataset.section,isUpsale=!1;element.classList.contains("jc-mobile-upsale-item")&&(isUpsale=!0),document.getElementById("jc-modal-shadow").classList.remove("jc-hidden"),setModalContent(section,productId,isUpsale)})})}});async function renderCartItems(eventUpdate,section,line){const html=await getSectionHTML(section),cartDom=new DOMParser().parseFromString(html,"text/html"),cartDrawer=document.querySelector("#cart-drawer"),cartDrawerItems=cartDrawer.querySelector("cart-drawer-items"),cartDrawerItemsSize=cartDrawer.querySelector("#cart_items_size"),cartDrawerFooter=cartDrawer.querySelector("cart-drawer-footer"),updatedItemPrice=cartDrawer.querySelector(`#CartDrawer-Item-${line} .price`);eventUpdate==!0?updatedItemPrice.innerHTML=cartDom.querySelector(`#CartDrawer-Item-${line} .price`)?.innerHTML:cartDrawerItems.innerHTML=cartDom.querySelector("cart-drawer-items").innerHTML,cartDrawerItemsSize.innerHTML=cartDom.querySelector("#cart_items_size")?.innerHTML,cartDrawerFooter.innerHTML=cartDom.querySelector("cart-drawer-footer").innerHTML,document.dispatchEvent(new CustomEvent("jc-cart:reload")),window.dispatchEvent(checkRecommendedProductsEvt),checkGift()}async function renderProgressBar(){const section=document.getElementById("cart-drawer").dataset.sectionId,html=await getSectionHTML(section),cartDom=new DOMParser().parseFromString(html,"text/html"),progressBar=document.querySelector("cart-drawer-progressbar");if(!progressBar)return;const progressBarTop=cartDom.querySelector(".jc-progress-bar--top"),progressReward=cartDom.querySelector(".jc-price-reward").dataset.reward+"%",progressText=cartDom.querySelector(".jc-progress-bar__text");progressBar.querySelector(".jc-progress-bar__text").innerHTML=progressText.innerHTML,progressBar.querySelector(".jc-progress-bar--top").innerHTML=progressBarTop.innerHTML,progressBar.querySelector(".jc-price-reward").style.setProperty("width",progressReward)}async function renderIconBubble(){const section=document.getElementById("cart-icon-bubble").dataset.sectionId,html=await getSectionHTML(section),cartDom=new DOMParser().parseFromString(html,"text/html"),iconBubble=document.querySelector("#cart-icon-bubble");iconBubble.innerHTML=cartDom.querySelector("#cart-icon-bubble").innerHTML}async function updateProductFromCart(eventUpdate,line,quantity){const url=window.Shopify.routes.root+"cart/change.js",data={line,quantity},section="cart-drawer";try{const response=await fetch(url,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(data)});if(!response.ok)throw new Error(`HTTP error! Status: ${response.status}`);const cart=await response.json();renderCartItems(eventUpdate,section,line),renderProgressBar(),renderIconBubble()}catch(error){console.error("Error removing product from cart:",error)}finally{document.querySelectorAll("quantity-input").forEach(quantityInput=>{quantityInput.classList.remove("jc-pointer-events-none")}),document.querySelectorAll(".loading-overlay").forEach(loader=>{loader.classList.add("jc-hidden")})}}class CartRemoveButton extends HTMLElement{constructor(){super(),this.addEventListener("click",event=>{event.preventDefault();let lineItem=this.dataset.index,quantity=0,eventUpdate=!1;
1this.closest(".js-cart-item").querySelector(".loading-overlay").classList.remove("jc-hidden"),updateProductFromCart(eventUpdate,lineItem,quantity)})}}customElements.define("cart-remove-button",CartRemoveButton);class AddToCart extends HTMLElement{constructor(){super(),this.elements={btn:this.querySelector("[js-add-to-cart-btn]")},this.elements.btn.addEventListener("click",el=>{el.preventDefault();let data={items:[{id:this.elements.btn.dataset.id,quantity:1}],sections:["cart-drawer","cart-icon-bubble"]};const productRtw=this.dataset.productRtw==="true"||this.elements.btn&&this.elements.btn.dataset.productRtw==="true",productBeauty=this.dataset.productBeauty==="true"||this.elements.btn&&this.elements.btn.dataset.productBeauty==="true";if(window.PaulJoeCollectionGifts){const giftItems=window.PaulJoeCollectionGifts.itemsToAddFromCache({productRtw,productBeauty});giftItems.length&&(data.items=data.items.concat(giftItems),window.PaulJoeCollectionGifts.markPending(giftItems))}const cart_drawer=document.querySelector("cart-drawer").dataset.sectionId;this.elements.btn.querySelector(".btn-label").style.opacity=0,this.elements.btn.querySelector(".btn-load").style.opacity=1,fetch(window.Shopify.routes.root+"cart/add.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(data)}).then(async response=>{let json=await response.json();document.dispatchEvent(new CustomEvent("jc-add-to-cart:click")),checkGift(),renderIconBubble(),fetch(window.Shopify.routes.root+"?sections="+cart_drawer).then(response2=>response2.json()).then(data2=>{let html=data2[cart_drawer];const cartDom=new DOMParser().parseFromString(html,"text/html");document.querySelector(".drawer__inner").innerHTML=cartDom.querySelector(".drawer__inner").innerHTML,document.querySelector("cart-drawer").classList.remove("is-empty"),document.querySelector("cart-drawer").classList.add("active"),document.dispatchEvent(new CustomEvent("jc-cart:reload")),document.querySelectorAll("quantity-input").forEach(quantityInput=>{quantityInput.classList.remove("jc-pointer-events-none")}),this.elements.btn.classList.contains("jc-upsales-button")&&document.querySelectorAll('[id*="CartDrawer-Item"]').forEach(product=>{let productId=product.getAttribute("jolly-cart-item");document.querySelectorAll("[jolly-upsale-slide]").forEach(item=>{item.classList.remove("!jc-hidden")}),document.querySelectorAll('[jolly-upsale-slide="'+productId+'"]').forEach(item=>{item.classList.add("!jc-hidden")})})});const label=this.elements.btn.querySelector(".btn-label").innerHTML;this.elements.btn.classList.add("with-success"),json.items.length==0&&document.querySelector("cart-drawer").classList.add("is-empty"),document.querySelector("cart-drawer").classList.remove("is-empty"),document.querySelector("cart-drawer").classList.add("active"),this.elements.btn.classList.contains("jc-upsales-button")&&document.querySelectorAll('[id*="CartDrawer-Item"]').forEach(product=>{let productId=product.getAttribute("jolly-cart-item");document.querySelectorAll("[jolly-upsale-slide]").forEach(item=>{item.classList.remove("!jc-hidden")}),document.querySelectorAll('[jolly-upsale-slide="'+productId+'"]').forEach(item=>{item.classList.add("!jc-hidden")})}),this.elements.btn.querySelector(".btn-label").style.opacity=1,this.elements.btn.querySelector(".btn-load").style.opacity=0,setTimeout(()=>{this.elements.btn.querySelector(".btn-label").innerHTML=label,this.elements.btn.classList.remove("with-success")},2e3)}).catch(error=>{console.error("Error:",error)})})}}customElements.define("add-to-cart",AddToCart);class CartDrawer extends HTMLElement{constructor(){super(),this.addEventListener("keyup",evt=>evt.code==="Escape"&&this.close()),this.querySelector("#CartDrawer-Overlay").addEventListener("click",this.close.bind(this)),this.setHeaderCartIconAccessibility(),this.querySelector(".drawer__close").addEventListener("click",el=>{this.close()})}setHeaderCartIconAccessibility(){const cartLink=document.querySelector("#cart-icon-bubble");cartLink.setAttribute("role","button"),cartLink.setAttribute("aria-haspopup","dialog"),cartLink.addEventListener("click",event=>{event.preventDefault(),this.open(cartLink)}),cartLink.addEventListener("keydown",event=>{event.code.toUpperCase()==="SPACE"&&(event.preventDefault(),this.open(cartLink))})}open(triggeredBy){triggeredBy&&this.setActiveElement(triggeredBy);const cartDrawerNote=this.querySelector('[id^="Details-"] summary');cartDrawerNote&&!cartDrawerNote.hasAttribute("role")&&this.setSummaryAccessibility(cartDrawerNote),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("cart-drawer")||this.querySelector(".drawer__close")},{once:!0}),document.body.classList.add("overflow-hidden")}close(){this.classList.remove("active"),document.body.classList.remove("overflow-hidden")}setSummaryAccessibility(cartDrawerNote){cartDrawerNote.setAttribute("role","button"),cartDrawerNote.setAttribute("aria-expanded","fal
1se"),cartDrawerNote.nextElementSibling.getAttribute("id")&&cartDrawerNote.setAttribute("aria-controls",cartDrawerNote.nextElementSibling.id),cartDrawerNote.addEventListener("click",event=>{event.currentTarget.setAttribute("aria-expanded",!event.currentTarget.closest("details").hasAttribute("open"))}),cartDrawerNote.parentElement.addEventListener("keyup",onKeyUpEscape)}setActiveElement(element){this.activeElement=element}}customElements.define("cart-drawer",CartDrawer);let subscribers={};function subscribe(eventName,callback){return subscribers[eventName]===void 0&&(subscribers[eventName]=[]),subscribers[eventName]=[...subscribers[eventName],callback],function(){subscribers[eventName]=subscribers[eventName].filter(cb=>cb!==callback)}}function publish(eventName,data){subscribers[eventName]&&subscribers[eventName].forEach(callback=>{callback(data)})}class QuantityInput extends HTMLElement{constructor(){super(),this.input=this.querySelector("input"),this.changeEvent=new Event("change",{bubbles:!0}),this.productId=this.dataset.productId,this.removeBtn=this.querySelector("cart-remove-button"),this.input.addEventListener("change",this.onInputChange.bind(this)),this.querySelectorAll("button").forEach(button=>{button.addEventListener("click",this.onButtonClick.bind(this))})}quantityUpdateUnsubscriber=void 0;connectedCallback(){this.validateQtyRules(),this.quantityUpdateUnsubscriber=subscribe(PUB_SUB_EVENTS.quantityUpdate,this.validateQtyRules.bind(this))}disconnectedCallback(){this.quantityUpdateUnsubscriber&&this.quantityUpdateUnsubscriber()}onInputChange(event){this.validateQtyRules()}onButtonClick(event){event.preventDefault();const previousValue=this.input.value;if(event.target.name==="plus"?this.input.stepUp():this.input.stepDown(),previousValue!==this.input.value){this.input.dispatchEvent(this.changeEvent);let quantity=this.input.value,lineItem=this.input.dataset.index,eventUpdate=!0;this.closest(".js-cart-item").querySelector(".loading-overlay").classList.remove("jc-hidden"),updateProductFromCart(eventUpdate,lineItem,quantity),this.classList.add("jc-pointer-events-none")}else return}validateQtyRules(){const value=parseInt(this.input.value);if(this.input.min){const min=parseInt(this.input.min),buttonMinus=this.querySelector(".jc-quantity-btn[name='minus']");buttonMinus.classList.toggle("disabled",value<=min),buttonMinus.classList.toggle("!jc-hidden",value<=1)}if(this.input.max){const max=parseInt(this.input.max);this.querySelector(".jc-quantity-btn[name='plus']").classList.toggle("disabled",value>=max)}value<=1?this.removeBtn.classList.remove("!jc-hidden"):this.removeBtn.classList.add("!jc-hidden")}}customElements.define("quantity-input",QuantityInput);function injectVariantLoader(target){if(target.querySelector(".jc-variant-loader"))return;const loader=document.createElement("div");loader.className="jc-variant-loader",loader.innerHTML=`
2    <div class="jc-spinner"></div>
3  `,Object.assign(loader.style,{position:"absolute",inset:0,background:"rgba(255,255,255,0.6)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:5}),target.style.position="relative",target.appendChild(loader)}function showVariantLoader(target){injectVariantLoader(target),target.querySelector(".jc-variant-loader").style.display="flex"}function hideVariantLoader(target){const loader=target.querySelector(".jc-variant-loader");loader&&(loader.style.display="none")}class VariantChange extends HTMLElement{constructor(){super(),this.elements={variants:this.querySelectorAll("[js-variants-values]"),variantsJSON:this.querySelector("[data-product-variants-json]"),sectionId:"ajax-jolly-product-info"}}async updateProductInfo(productHandle,currentVariantId,sectionId){window.innerWidth<=992&&(sectionId="ajax-jolly-atc-product");try{const response=await fetch(`${window.Shopify.routes.root}products/${productHandle}?variant=${currentVariantId}&section_id=${sectionId}`);if(!response.ok)throw new Error(`Failed to fetch product: ${response.statusText}`);const data=await response.text(),parsedData=new DOMParser().parseFromString(data,"text/html"),newVariantsHtml=parsedData.querySelector(".jc-product-card-controls")?.innerHTML,newImagesSrc=parsedData.querySelector("[js-
3product-images] .jc-product-img")?.src,newImagesSrcset=parsedData.querySelector("[js-product-images] .jc-product-img")?.dataset.srcset;newImagesSrc&&(this.closest("jolly-product-card").querySelector(".jc-product-img").setAttribute("src",newImagesSrc),this.closest("jolly-product-card").querySelector(".jc-product-img").setAttribute("srcset",newImagesSrcset)),this.closest(".jc-product-card-controls").innerHTML=newVariantsHtml}catch(error){console.error(`An error occurred: ${error}`)}}connectedCallback(){this.initialize()}initialize(){this.elements.variants=this.querySelectorAll("[js-variants-values]"),this.elements.variantsJSON=this.querySelector("[data-product-variants-json]"),this.elements.variants.forEach(element=>{element.addEventListener("click",async()=>{const card=this.closest("jolly-product-card")||this,parsedVariantsJSON=JSON.parse(this.elements.variantsJSON.textContent),checkedInputs=this.querySelectorAll("[js-variants-values]:checked");let checkedOption=[];checkedInputs.forEach(input=>{checkedOption.push(input.value)});const matchingItems=parsedVariantsJSON.filter(item=>checkedOption.includes(item.option1)&&checkedOption.includes(item.option2)),productHandle=this.dataset.productHandle;let currentVariantId="";currentVariantId=matchingItems[0].id;const sectionId=this.elements.sectionId,productCard=this.closest("jolly-product-card"),variantImage=productCard.querySelector('.variant-image[data-variant="'+currentVariantId+'"] img');if(productCard.querySelectorAll(".variant-image img").forEach(img=>img.classList.add("hidden")),variantImage&&variantImage.classList.remove("hidden"),element.classList.contains("size")){showVariantLoader(card);const variantData={items:[{id:currentVariantId,quantity:1}],sections:["cart-drawer","cart-icon-bubble"]},flagEl=card&&card.querySelector("[data-product-rtw], [data-product-beauty]");if(window.PaulJoeCollectionGifts){const giftItems=window.PaulJoeCollectionGifts.itemsToAddFromCache({productRtw:!!(flagEl&&flagEl.dataset.productRtw==="true"),productBeauty:!!(flagEl&&flagEl.dataset.productBeauty==="true")});giftItems.length&&(variantData.items=variantData.items.concat(giftItems),window.PaulJoeCollectionGifts.markPending(giftItems))}const cart_drawer=document.querySelector("cart-drawer").dataset.sectionId;fetch(window.Shopify.routes.root+"cart/add.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(variantData)}).then(async response=>{let json=await response.json();document.dispatchEvent(new CustomEvent("jc-add-to-cart:click")),renderIconBubble(),fetch(window.Shopify.routes.root+"?sections="+cart_drawer).then(response2=>response2.json()).then(data=>{let html=data[cart_drawer];const cartDom=new DOMParser().parseFromString(html,"text/html");document.querySelector(".drawer__inner").innerHTML=cartDom.querySelector(".drawer__inner").innerHTML,document.querySelector("cart-drawer").classList.remove("is-empty"),document.querySelector("cart-drawer").classList.add("active"),document.dispatchEvent(new CustomEvent("jc-cart:reload"))}),document.querySelector("cart-drawer").classList.remove("is-empty"),document.querySelector("cart-drawer").classList.add("active"),card&&hideVariantLoader(card)}).catch(error=>{console.error("Error:",error),card&&hideVariantLoader(card)})}await this.updateProductInfo(productHandle,currentVariantId,sectionId)}),element.addEventListener("mouseover",()=>{if(!element.classList.contains("color"))return;let checkboxVal=element.value;const parsedVariantsJSON=JSON.parse(this.elements.variantsJSON.textContent);function findVariantIdByOption(parsedVariantsJSON2,option){for(let i=0;i<parsedVariantsJSON2.length;i++)if(parsedVariantsJSON2[i].options.includes(option)&&parsedVariantsJSON2[i].featured_image&&parsedVariantsJSON2[i].featured_image.src)return parsedVariantsJSON2[i].featured_image.src;return null}const variantImage=findVariantIdByOption(parsedVariantsJSON,checkboxVal)})})}}customElements.define("variant-picker",VariantChange);function checkGift(){fetch("/cart.js").then(response=>response.json()).then(data=>{const cartItems=data.items,totalPrice=data.total_price,isGift=cartItems.filter(item=>item.properties&&item.properties._isGift==="true"),giftPrice=Number(document.querySelector("#jc-cart-gift")?.dataset.giftTotal),giftProduct=document.querySelector("#jc-cart-gift")?.dataset.giftId;if(totalPrice>giftPrice&&isGift.length==0){let data2={items:[{id:giftProduct,quantity:1,properties:{_isGift:"true"}}
3],sections:["cart-drawer","cart-icon-bubble"]};fetch(window.Shopify.routes.root+"cart/add.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(data2)}).then(async response=>{let json=await response.json();renderIconBubble();const cart_drawer=document.querySelector("cart-drawer").dataset.sectionId;fetch(window.Shopify.routes.root+"?sections="+cart_drawer).then(response2=>response2.json()).then(data3=>{let html=data3[cart_drawer];const cartDom=new DOMParser().parseFromString(html,"text/html");document.querySelector(".drawer__inner").innerHTML=cartDom.querySelector(".drawer__inner").innerHTML,document.dispatchEvent(new CustomEvent("jc-cart:reload"))})}).catch(error=>{console.error("Error:",error)})}else if(totalPrice<giftPrice&&isGift.length>0){const giftToremove=document.querySelector('[data-variant-id="'+giftProduct+'"] cart-remove-button');giftToremove&&giftToremove.click()}}).catch(error=>{console.error("Error fetching cart:",error)})}checkGift(),document.addEventListener("jc-gift:check",function(){checkGift()});
4//# sourceMappingURL=/cdn/shop/t/55/assets/jolly-scripts.js.map?v=51324056611442196161788445483

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.