1import{morph}from"@theme/morph";import{fetchConfig}from"@theme/utilities";import{CartAddEvent}from"@theme/events";function getNostoMerchantId(){const tagging=document.getElementById("nosto-market-tagging");if(tagging?.textContent)try{const shopId=JSON.parse(tagging.textContent)?.shopId;if(shopId)return`shopify-${shopId}`}catch{}for(const script of document.querySelectorAll('script[src*="connect.nosto.com"]')){if(!(script instanceof HTMLScriptElement))continue;const match=script.src.match(/shopify-\d+/i);if(match)return match[0]}return""}function getNostoRequestUrl(){const host=window.Shopify?.shop;return host&&(window.location.hostname==="127.0.0.1"||window.location.hostname==="localhost")?`https://${host}${window.location.pathname}${window.location.search}`:window.location.href}let nostoApiPromise=null;function withNostoApi(timeoutMs=15e3){return nostoApiPromise||(nostoApiPromise=new Promise((resolve,reject)=>{let settled=!1,poll;const timer=setTimeout(()=>{settled||(settled=!0,clearInterval(poll),nostoApiPromise=null,reject(new Error("nostojs unavailable")))},timeoutMs),tryReady=()=>{if(typeof window.nostojs!="function")return!1;try{return window.nostojs(api=>{settled||(settled=!0,clearInterval(poll),clearTimeout(timer),resolve(api))}),!0}catch{return!1}};tryReady()||(poll=setInterval(()=>{(settled||tryReady())&&clearInterval(poll)},200))}),nostoApiPromise)}withNostoApi().then(api=>{typeof api.setAutoLoad=="function"&&api.setAutoLoad(!1)}).catch(()=>{});export async function loadNostoPlacements(targets,options={}){const placementIds=Object.keys(targets);if(!placementIds.length)return;let api;try{api=await withNostoApi()}catch{return}if(options.resendCartTagging&&typeof api.resendCartTagging=="function")try{await api.resendCartTagging()}catch{}try{if(typeof api.createRecommendationRequest=="function"){const request=api.createRecommendationRequest({includeTagging:!0});options.pageType&&typeof request.setPageType=="function"&&request.setPageType(options.pageType),request.setElements(placementIds),typeof request.setTargets=="function"&&request.setTargets(targets),await request.load()}else typeof api.loadRecommendations=="function"&&await api.loadRecommendations()}catch{}}function productsByPlacement(placementIds,recs){const byPlacement={};for(const placementId of placementIds){const products=recs?.[placementId]?.products;byPlacement[placementId]=Array.isArray(products)?products:[]}return byPlacement}export async function fetchNostoRecommendations(placementIds,pageType,options){const merchant=getNostoMerchantId();if(!merchant||!placementIds.length)return{};try{const response=await fetch(`https://connect.nosto.com/ev1?m=${encodeURIComponent(merchant)}&skipPageViews=true&skipEvents=true&skipImpressions=true`,{method:"POST",headers:{"Content-Type":"text/plain"},body:JSON.stringify({elements:placementIds,response_mode:"JSON_ORIGINAL",url:getNostoRequestUrl(),...pageType?{pageType}:{},...options?.products?{products:options.products}:{}})});if(!response.ok)return{};const result=await response.json();return productsByPlacement(placementIds,result?.recommendations||result?.campaigns?.recommendations)}catch{return{}}}export async function openNostoQuickAdd(productUrl){const dialog=document.getElementById("quick-add-dialog"),modalContent=document.getElementById("quick-add-modal-content");if(!dialog||!modalContent||typeof dialog.showDialog!="function")return;let response;try{response=await fetch(productUrl)}catch{return}if(!response.ok)return;const productGrid=new DOMParser().parseFromString(await response.text(),"text/html").querySelector("[data-product-grid-content]");productGrid&&(morph(modalContent,productGrid),dialog.showDialog())}const resultIdCache=new Map;export function primeNostoResultId(placementId,pageType){if(resultIdCache.has(placementId))return resultIdCache.get(placementId);const merchant=getNostoMerchantId(),promise=merchant?fetch(`https://connect.nosto.com/ev1?m=${encodeURIComponent(merchant)}&skipPageViews=true&skipEvents=true&skipImpressions=true`,{method:"POST",headers:{"Content-Type":"text/plain"},body:JSON.stringify({elements:[placementId],response_mode:"JSON_ORIGINAL",url:getNostoRequestUrl(),...pageType?{pageType}:{}})}).then(response=>response.ok?response.json():null).then(result=>(result?.recommendations||result?.campaigns?.recommendations)?.[placementId]?.result_id||null).cat
1ch(()=>null):Promise.resolve(null);return resultIdCache.set(placementId,promise),promise}let nostoQuickAddBound=!1;function ensureNostoQuickAddClose(panel){if(panel.querySelector("[data-nosto-quick-add-close]"))return;const button=document.createElement("button");button.type="button",button.className="nosto-quick-add__close",button.dataset.nostoQuickAddClose="",button.setAttribute("aria-label",Theme.translations?.close_size_selector||"Close size selector"),panel.appendChild(button)}let nostoOptionIdSeq=0;function dedupeNostoOptionIds(panel){if(!(!(panel instanceof HTMLElement)||panel.dataset.nostoOptionIdsUnique)){panel.dataset.nostoOptionIdsUnique="true";for(const row of panel.querySelectorAll(".options-group__list")){const radio=row.querySelector('input[type="radio"]'),label=row.querySelector(".options-group__label");if(!(radio instanceof HTMLInputElement)||!(label instanceof HTMLLabelElement)||radio.id&&document.getElementById(radio.id)===radio)continue;nostoOptionIdSeq+=1;const unique=`nosto-size-option-${nostoOptionIdSeq}`;radio.id=unique,label.htmlFor=unique}}}function closeNostoQuickAdd(wrapper){const panel=wrapper.querySelector(".product-quick-add");if(!panel||panel.classList.contains("hide"))return;panel.classList.add("hide");const active=wrapper.querySelector(".button--quick-add-trigger[data-nosto-trigger-active]");if(active){active.removeAttribute("data-nosto-trigger-active"),active.classList.remove("hide");return}wrapper.querySelector(".button--quick-add-trigger")?.classList.remove("hide")}function closeOtherNostoQuickAdds(keep){for(const panel of document.querySelectorAll(".nosto_element .product-quick-add:not
1(.hide)")){const wrapper=panel.closest(".product-tile__quick-add");wrapper&&wrapper!==keep&&closeNostoQuickAdd(wrapper)}}function nostoSizeRadio(label){const radio=label.closest(".options-group__list")?.querySelector('input[type="radio"]');return radio instanceof HTMLInputElement?radio:null}function nostoVisibleText(el){return el?((el.querySelector("span:not(.hide)")??el).textContent??"").replace(/\s+/g," ").trim():""}const nostoProductDataCache=new Map;function nostoProductData(submit){const handle=submit?.dataset.handle,url=submit?.dataset.url;if(!handle||!url)return Promise.resolve(null);const cached=nostoProductDataCache.get(handle);if(cached)return cached;let endpoint;try{endpoint=`${new URL(url,window.location.href).pathname.replace(/\/$/,"")}.js`}catch{return Promise.resolve(null)}const pending=fetch(endpoint).then(response=>response.ok?response.json():null).catch(()=>null);return nostoProductDataCache.set(handle,pending),pending}const NOSTO_SIZE_OPTION_NAME=/size|taille/i,QUICK_ADD_RELABEL_TIMEOUT_MS=500;function nostoQuickAddLabel(row){return row.querySelector(".options-group__label span:not(.options-group__out-of-stock)")}function nostoSizesNeedRelabel(panel){if(!(panel instanceof HTMLElement)||panel.dataset.nostoSizesRelabelled)return!1;const rows=[...panel.querySelectorAll(".options-group__list")];if(!rows.length)return!1;const text=row=>nostoQuickAddLabel(row)?.textContent?.trim()??"";return rows.every(row=>text(row)===text(rows[0]))}function prefetchNostoSizes(wrapper){nostoSizesNeedRelabel(wrapper.querySelector(".product-quick-add"))&&nostoProductData(wrapper.querySelector(".button--quick-add-submit"))}async function relabelNostoSizes(wrapper){const panel=wrapper.querySelector(".product-quick-add");if(!nostoSizesNeedRelabel(panel))return;const rows=[...panel.querySelectorAll(".options-group__list")],labelOf=nostoQuickAddLabel,text=el=>el?.textContent?.trim()??"";panel.dataset.nostoSizesRelabelled="true";const product=await nostoProductData(wrapper.querySelector(".button--quick-add-submit")),options=product?.options,variants=product?.variants;if(!Array.isArray(options)||!Array.isArray(variants))return;const sizeIndex=options.findIndex(option=>NOSTO_SIZE_OPTION_NAME.test(typeof option=="string"?option:option?.name??""));if(sizeIndex<0)return;const sizeByVariantId=new Map(variants.map(variant=>[String(variant.id),variant.options?.[sizeIndex]]));for(const row of rows){const radio=row.querySelector('input[type="radio"]'),label=labelOf(row),size=radio instanceof HTMLInputElement?sizeByVariantId.get(radio.value):null;label&&size&&text(label)!==size&&(label.textContent=size)}fixNostoSizeLabels(panel)}function openNostoNotifyMe(wrapper,label){const drawer=document.querySelector("back-in-stock-component[data-shared]");if(typeof drawer?.openFor!="function")return!1;const submit=wrapper.querySelector(".button--quick-add-submit"),productId=submit?.dataset.product??"",variantId=nostoSizeRadio(label)?.value??"";if(!productId||!variantId)return!1;const tile=wrapper.closest(".swiper-slide, .product-tile"),image=tile?.querySelector(".product-tile__image, img");return drawer.openFor({productId,variantId,size:label.querySelector("span:not(.options-group__out-of-stock)")?.textContent?.trim()??"",title:nostoVisibleText(tile?.querySelector(".product-tile__title")),image:(image instanceof HTMLImageElement?image.currentSrc:"")||image?.getAttribute("src")||"",url:submit?.dataset.url??tile?.querySelector('a[href*="/products/"]')?.getAttribute("href")??""}),!0}async function revealNostoQuickAdd(wrapper,panel,trigger){await Promise.race([relabelNostoSizes(wrapper),new Promise(resolve=>setTimeout(resolve,QUICK_ADD_RELABEL_TIMEOUT_MS))]),trigger.setAttribute("data-nosto-trigger-active",""),wrapper.querySelectorAll(".button--quick-add-trigger").forEach(btn=>btn.classList.add("hide")),panel.classList.remove("hide")}export function bindNostoNativeAddToCart(_container){if(nostoQuickAddBound)return;nostoQuickAddBound=!0;const stopIfInsideQuickAdd=event=>{const wrapper=event.target instanceof Element?event.target.closest(".product-tile__quick-add"):null;wrapper&&(event.stopPropagation(),prefetchNostoSizes(wrapper))};document.addEventListener("pointerdown",stopIfInsideQuickAdd,{capture:!0}),document.addEventListener("mousedown",stopIfInsideQuickAdd,{capture:!0}),document.addEventListener("pointerover",event=>{const wrapper=event.target instanceof Element?event.target.closest(".product-tile__quick-add"):null;wrapper&&prefetchNostoSizes(wrapper)},{passive:!0}),document.addEventListener("click",event=>{const target=event.target instanceof Element?event.target:null,wrapper=target?.closest(".product-tile__quick-add");if(!wrapper)return;if(event.stopPropagation(),target.closest("[data-nosto-quick-add-close]")){event.preventDefault(),closeNostoQuickAdd(wrapper);return}const disabledLabel=target.closest(".options-group__label.is-disabled");if(disabledLabel){event.preventDefault(),openNostoNotifyMe(wrapper,disabledLabel);return}const trigger=target.closest(".button--quick-add-trigger");if(trigger){const panel=wrapper.querySelector(".product-quick-add");if(!panel)return;event.preventDefault();
1const placementId=trigger.closest(".nosto_element")?.id;placementId&&primeNostoResultId(placementId,document.querySelector("[data-nosto-page-type]")?.getAttribute("data-nosto-page-type")||"cart"),closeOtherNostoQuickAdds(wrapper),ensureNostoQuickAddClose(panel),dedupeNostoOptionIds(panel),revealNostoQuickAdd(wrapper,panel,trigger);return}const submit=target.closest(".button--quick-add-submit");submit instanceof HTMLElement&&(event.preventDefault(),addNostoQuickAddToCart(submit))},{capture:!0}),document.addEventListener("change",event=>{const radio=event.target instanceof Element?event.target.closest('input[type="radio"].size-option'):null;if(!(radio instanceof HTMLInputElement)||!radio.checked||radio.classList.contains("product-unavailable"))return;const wrapper=radio.closest(".product-tile__quick-add"),submitButtons=wrapper?.querySelectorAll(".button--quick-add-submit");submitButtons?.forEach(btn=>{btn.dataset.variant=radio.value});const label=radio.closest(".options-group__list")?.querySelector(".options-group__label");submitButtons?.[0]&&addNostoQuickAddToCart(submitButtons[0],label instanceof HTMLElement?label:void 0,wrapper??void 0)})}function cartItemsSectionIds(){return[...document.querySelectorAll("cart-items-component")].map(el=>el instanceof HTMLElement?el.dataset.sectionId:null).filter(id=>typeof id=="string"&&id.length>0)}function addNostoQuickAddToCart(submit,pendingTarget=submit,closeOnSettle){const variantId=submit.dataset.variant,productId=submit.dataset.product;if(!variantId||pendingTarget.getAttribute("aria-busy")==="true")return;pendingTarget.dataset.addToCartTrigger="",pendingTarget.setAttribute("aria-busy","true"),pendingTarget instanceof HTMLButtonElement&&(pendingTarget.disabled=!0);const clearPendingState=()=>{pendingTarget.removeAttribute("aria-busy"),pendingTarget instanceof HTMLButtonElement&&(pendingTarget.disabled=!1),closeOnSettle&&closeNostoQuickAdd(closeOnSettle)}
1,placementId=submit.closest(".nosto_element")?.id,resultId=placementId?resultIdCache.get(placementId):null;Promise.resolve(resultId).then(async resolvedResultId=>{if(productId&&resolvedResultId&&typeof window.Nosto?.addSkuToCart=="function")return await window.Nosto.addSkuToCart({productId,skuId:variantId},resolvedResultId),null;const sectionIds=cartItemsSectionIds(),response=await fetch(Theme.routes.cart_add_url,fetchConfig("json",{body:JSON.stringify({id:variantId,quantity:1,...sectionIds.length?{sections:sectionIds.join(",")}:{}})})),body=await response.json().catch(()=>null);if(!response.ok)throw new Error(body?.description||`cart/add failed (${response.status})`);return body}).then(body=>{const drawer=document.querySelector("cart-drawer-component[auto-open]");typeof drawer?.open=="function"&&drawer.open(),submit.dispatchEvent(new CartAddEvent({},placementId||"nosto-recommendations",{source:"nosto-recommendations",productId,variantId,itemCount:1,sections:body?.sections}))}).catch(error=>{console.error(error)}).finally(clearPendingState)}export function fixNostoSizeLabels(container){container.querySelectorAll(".options-group__label span").forEach(span=>{span.textContent?.trim()==="One"&&(span.textContent="One Size")})}const EXCLUDED_RECOMMENDATION_HANDLES=new Set(["membership","worry-free-purchase"]);function productHandleFromHref(href){if(!href)return"";let path=href;try{path=new URL(href,window.location.origin).pathname}catch{}const match=path.match(/\/products\/([^/?#]+)/);return match?decodeURIComponent(match[1]).toLowerCase():""}export function pruneExcludedNostoProducts(container){if(!(container instanceof Element))return 0;let removed=0;for(const link of container.querySelectorAll('a[href*="/products/"]')){if(!EXCLUDED_RECOMMENDATION_HANDLES.has(productHandleFromHref(link.getAttribute("href"))))continue;const tile=link.closest(".swiper-slide")||link.closest(".product-tile")||link.closest(".nosto-product")||link.closest(".nosto-list-item");!tile||tile===container||!container.contains(tile)||(tile.remove(),removed+=1)}return removed}const exclusionObservedContainers=new WeakSet;export function observeNostoExclusions(container){!(container instanceof Element)||exclusionObservedContainers.has(container)||(exclusionObservedContainers.add(container),new MutationObserver(()=>pruneExcludedNostoProducts(container)).observe(container,{childList:!0,subtree:!0}),pruneExcludedNostoProducts(container))}const NOSTO_PRICE_SELECTOR=".price__value, .money",TRAILING_ZERO_CENTS=/([.,]00)(?=\s|$)/;export function stripTrailingZeroCents(text){return typeof text=="string"?text.replace(TRAILING_ZERO_CENTS,""):""}export function stripNostoPriceTrailingZeros(container){if(container instanceof Element)for(const el of container.querySelectorAll(NOSTO_PRICE_SELECTOR)){const text=el.textContent;if(!text)continue;const stripped=text.replace(TRAILING_ZERO_CENTS,"");stripped!==text&&(el.textContent=stripped)}}const priceFormattingObservedContainers=new WeakSet;export function observeNostoPriceFormatting(container){!(container instanceof Element)||priceFormattingObservedContainers.has(container)||(priceFormattingObservedContainers.add(container),new MutationObserver(()=>stripNostoPriceTrailingZeros(container)).observe(container,{childList:!0,subtree:!0}),stripNostoPriceTrailingZeros(container))}export function nostoHasProducts(nostoContainer){return nostoContainer instanceof Element?(pruneExcludedNostoProducts(nostoContainer),nostoContainer.querySelector('.swiper-slide, .product-tile, .nosto-product, a[href*="/products/"], [data-product-id]')!=null):!1} 2//# sourceMappingURL=/cdn/shop/t/863/assets/nosto-recommendations.js.map?v=182532449681575085171790608651
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.