1window.FCTProductSwatchGroups||(window.FCTProductSwatchGroups=(()=>{const clampMobileHorizontalScroll=()=>{const root=document.documentElement,body=document.body;!root||!body||(window.innerWidth<=769?(root.style.overflowX="hidden",body.style.overflowX="hidden",root.style.width="100%",body.style.width="100%",body.style.position=body.style.position||"relative"):(root.style.overflowX==="hidden"&&root.style.removeProperty("overflow-x"),body.style.overflowX==="hidden"&&body.style.removeProperty("overflow-x"),root.style.width==="100%"&&root.style.removeProperty("width"),body.style.width==="100%"&&body.style.removeProperty("width")))};clampMobileHorizontalScroll(),window.addEventListener("resize",clampMobileHorizontalScroll);const resolveContainer=containerOrId=>containerOrId?containerOrId instanceof Element?containerOrId:typeof containerOrId=="string"?document.getElementById(containerOrId):null:null,mount=containerOrId=>{const container=resolveContainer(containerOrId);if(!container)return;const SECTION_ID=String(container.dataset.sectionId||""),swatchTitle=container.dataset.swatchTitle||"Color",namespace=window.FCT=window.FCT||{},swatchState=namespace.swatches=namespace.swatches||{},bundleManager=namespace.pdpBundle||null,warmedHandles=window.swapMainContent?.prefetchedHandles||(swatchState.prefetchedHandles=swatchState.prefetchedHandles||new Set);let buttons=[],activateButton=null,swapToHandle=null,packSwapToken=0,cacheWarmupScheduled=!1,sizeGuidanceEl=null,swatchGuidanceEl=null;const guidanceDismissed=swatchState.bundleGuidanceDismissed=swatchState.bundleGuidanceDismissed||{size:!1,swatches:!1};swatchState.bundleGuidanceForcedMode!=="size"&&swatchState.bundleGuidanceForcedMode!=="swatches"&&(swatchState.bundleGuidanceForcedMode=null),container.__swatchAbortController&&container.__swatchAbortController.abort();const listenersController=new AbortController;container.__swatchAbortController=listenersController;const parsePackVariantsData=()=>{const el=document.getElementById(`ProductPackVariantsData-${SECTION_ID}`);if(!el)return swatchState.packVariants=[],swatchState.packVariantsBySwatchesId=null,null;try{const parsed=JSON.parse(el.textContent||"[]");return swatchState.packVariants=Array.isArray(parsed)?parsed:[],swatchState.packVariantsBySwatchesId=swatchState.packVariants.reduce((acc,entry)=>(!entry||!entry.swatches_id||(acc[String(entry.swatches_id)]=entry),acc),{}),swatchState.packVariantsBySwatchesId}catch(error){return console.warn("Pack variants data parse error",error),swatchState.packVariants=[],swatchState.packVariantsBySwatchesId=null,null}},getPackVariantBySwatchesId=swatchesId=>{if(!swatchesId)return null;const key=String(swatchesId);return(swatchState.packVariantsBySwatchesId||parsePackVariantsData()||{})[key]||null},getShopRoot=()=>{const root=window.Shopify?.routes?.root;return typeof root=="string"&&root.trim()!==""?root.endsWith("/")?root:`${root}/`:"/"},applySwatchPattern=(thumb,swatchColor)=>{if(!thumb)return;const raw=(swatchColor||"").toString().trim();if(!raw)return;thumb.style.background="",thumb.style.backgroundImage="",thumb.style.backgroundSize="",thumb.style.backgroundColor="";const parts=raw.split("-"),type=parts[0]?parts[0].toLowerCase():"";if((type==="striped"||type==="stripedbig")&&parts.length>=4){const colorDeg=parts[1]||"45deg",firstColor=parts[2]||"",secondColor=parts[3]||"",stripeWidth=type==="stripedbig"?6:3,stripeRepeat=stripeWidth*2;thumb.style.background=`repeating-linear-gradient(${colorDeg}, ${firstColor}, ${firstColor} ${stripeWidth}px, ${secondColor} ${stripeWidth}px, ${secondColor} ${stripeRepeat}px)`,thumb.style.backgroundSize=`${type==="stripedbig"?10:5}px`;return}if(type==="gingham"&&parts.length>=3){const firstColor=parts[1]||"",secondColor=parts[2]||"";thumb.style.backgroundImage=`repeating-linear-gradient(0deg, ${firstColor}80 0 4px, transparent 4px 8px), repeating-linear-gradient(90deg, ${firstColor}80 0 4px, transparent 4px 8px)`,thumb.style.backgroundColor=secondColor;return}thumb.style.backgroundColor=raw},fetchProductJson=handle=>{if(!handle)return Promise.resolve(null);const url=`${getShopRoot()}products/${handle}.js`;return fetch(url,{credentials:"same-origin"}).then(res=>{if(!res.ok)throw new Error(`Failed to load product JSON for ${handle}`);return res.json()}).catch(error=>(console.warn(error),null))},ensureProductsLoaded=handles=>{const uniqueHandles=Array.from(new Set((Array.isArray(handles)?handles:[]).filter(handle=>typeof handle=="string"&&handle.trim()!=="")));if(!uniqueHandles.length)return Promise.resolve();const productsByHandle=swatchState.productsByHandle=swatchState.productsByHandle||{},inflight=swatchState.productFetchInflight=swatchState.productFetchInflight||{},missing=uniqueHandles.filter(handle=>!productsByHandle[handle]&&!inflight[handle]);if(!missing.length)return Promise.resolve();const concurrency=Math.max(1,Math.min(3,missing.length));let index=0;const runNext=()=>{if(index>=missing.length)return Promise.resolve();const handle=missing[index++],promise=fetchProductJson(handle).then(product=>{product&&product.handle&&(productsByHandle[product.handle]=product)}).finally(()=>{delete inflight[handle]});return inflight[handle]=promise,promise.then(runNext)};return Promise.all(Array.from({length:concurrency},runNext)).then(()=>{window.swatchProductsByHandle=productsByHandle,swatchState.products=Object.keys(productsByHandle).map(handle=>productsByHandle[handle]),window.swatchProducts=swatchState.products.slice()})},limitHandles=(handles,limit=3)=>{const uniqueHandles=Array.from(new Set((Array.isArray(handles)?handles:[]).filter(handle=>typeof handle=="string"&&handle.trim()!=="")));return uniqueHandles.length?uniqueHandles.slice(0,Math.max(1,limit)):[]},hydrateButtonThumbnails=()=>{const body=container.querySelector(".product-swatch-groups__body");if(!body)return;const productsByHandle=swatchState.productsByHandle||{},buttonsInDom=Array.from(body.querySelectorAll(".product-swatch-button"));buttonsInDom.length&&buttonsInDom.forEach(button=>{const groupEl=button.closest(".product-swatch-group");if(!groupEl||groupEl.dataset.displayMode!=="image")return;const thumb=button.querySelector(".product-swatch-button__thumb");if(!thumb||thumb.querySelector("img"))return;const product=productsByHandle[button.dataset.productHandle],imageData=getProductImage(product);if(!imageData)return;const img=document.createElement("img");img.src=imageData.src,imageData.srcset&&(img.srcset=imageData.srcset,img.sizes=imageData.sizes),img.alt=product&&product.title?product.title:button.dataset.colorDisplay||"",img.loading="lazy",img.decoding="async",img.fetchPriority="low",thumb.appendChild(img)})},swapToHandleValue=(handle,{trigger=null,scroll="keep",cache=!0,validate=null,force=!1}={})=>
1{if(!handle)return;const current=document.getElementById("main-content")?.dataset?.currentHandle||container.getAttribute("data-current-handle");if(!force&¤t&&String(handle)===String(current))return;const attemptSwap=(attemptsLeft=4)=>{if(!(typeof validate=="function"&&!validate())){if(typeof window.swapMainContent!="function"){attemptsLeft>0&&requestAnimationFrame(()=>attemptSwap(attemptsLeft-1));return}window.swapMainContent(handle,{scroll,cache,trigger}).catch(error=>{error&&error.name!=="AbortError"&&console.error(error)})}};attemptSwap()},handlePackPickerChange=event=>{if(!event||!event.detail||event.detail.sectionId&&event.detail.sectionId!==SECTION_ID)return;const swatchesId=event.detail.swatches;if(!swatchesId||swatchState.activeSwatchesId&&String(swatchState.activeSwatchesId)===String(swatchesId))return;const trigger=event.detail.trigger||"user",packEntry=getPackVariantBySwatchesId(swatchesId),nextData=packEntry&&packEntry.swatch_data?packEntry.swatch_data:null;if(!nextData)return;packSwapToken+=1;const token=packSwapToken;if(swatchState.activeSwatchesId=String(swatchesId),swatchState.rawData=nextData,window.fctSwatchData=nextData,document.dispatchEvent(new CustomEvent("fct:swatch-data-ready",{detail:{sectionId:SECTION_ID,handles:nextData.handles||[]}})),trigger==="user"){const targetHandle=(Array.isArray(nextData.handles)?nextData.handles:[]).find(handle=>handle&&handle.toString().trim()!=="")||null;targetHandle&&swapToHandleValue(targetHandle,{trigger:container,scroll:"keep",cache:!0,force:!0,validate:()=>token===packSwapToken&&String(swatchState.activeSwatchesId||"")===String(swatchesId)})}const warmHandles=limitHandles(nextData.handles,3);ensureProductsLoaded(warmHandles).then(()=>{hydrateButtonThumbnails(),updateButtonVisibility(readCurrentOptions())}).catch(()=>{})};document.addEventListener("fct:pack-picker:change",handlePackPickerChange,{signal:listenersController.signal});const getVariantSelectors=()=>Array.from(document.querySelectorAll(`variant-selects[data-section="${SECTION_ID}"]`)),getSizeFieldset=()=>{const selectors=getVariantSelectors();for(const selector of selectors){const directMatch=selector.querySelector('fieldset[data-handle="size"]');if(directMatch)return directMatch;const fallbackMatch=Array.from(selector.querySelectorAll("fieldset.product-form__input")).find(fieldset=>{if(String(fieldset.dataset.handle||"").trim().toLowerCase()==="size")return!0;const label=fieldset.querySelector(".form__label");return String(label?.textContent||"").trim().toLowerCase().startsWith("size")});if(fallbackMatch)return fallbackMatch}return null},getSelectedFieldsetValue=fieldset=>{if(!fieldset)return"";const checkedInput=fieldset.querySelector('input[type="radio"]:checked');if(checkedInput&&String(checkedInput.value||"").trim()!=="")return String(checkedInput.value||"").trim();const selectEl=fieldset.querySelector("select");if(!selectEl)return"";const value=String(selectEl.value||"").trim();if(!value)return"";const selectedOption=selectEl.options?.[selectEl.selectedIndex]||null;return selectedOption&&selectedOption.disabled?"":value},hasSelectedSize=()=>String(getSelectedFieldsetValue(getSizeFieldset())||"").trim()!=="",createGuidanceElement=({modifier="",title="",body=""}={})=>{const wrapper=document.createElement("div");wrapper.className=`pdp-bundle-guidance${modifier?` ${modifier}`:""}`,wrapper.hidden=!0,wrapper.setAttribute("role","status");const titleEl=document.createElement("div");if(titleEl.className="pdp-bundle-guidance__title",titleEl.textContent=title,wrapper.appendChild(titleEl),body){const bodyEl=document.createElement("div");bodyEl.className="pdp-bundle-guidance__body",bodyEl.textContent=body,wrapper.appendChild(bodyEl)}const dismissButton=document.createElement("button");return dismissButton.type="button",dismissButton.className="pdp-bundle-guidance__dismiss",dismissButton.setAttribute("aria-label","Close tooltip"),dismissButton.innerHTML="×",wrapper.appendChild(dismissButton),wrapper},ensureGuidanceNodes=()=>{if(!bundleManager?.isActive?.())return;const sizeFieldset=getSizeFieldset();sizeFieldset&&!sizeGuidanceEl?.isConnected&&(sizeGuidanceEl=createGuidanceElement({modifier:"pdp-bundle-guidance--size",title:"\u{1F447} Select the size for your pack"}),sizeFieldset.classList.add("pdp-bundle-guidance-anchor"),sizeFieldset.insertBefore(sizeGuidanceEl,sizeFieldset.f
1irstChild),sizeGuidanceEl.querySelector(".pdp-bundle-guidance__dismiss")?.addEventListener("click",()=>{guidanceDismissed.size=!0,updateBundleGuidance()},{signal:listenersController.signal}));const body=container.querySelector(".product-swatch-groups__body");body&&!swatchGuidanceEl?.isConnected&&(swatchGuidanceEl=createGuidanceElement({modifier:"pdp-bundle-guidance--swatches",title:"\u{1F447} Tap a color to add it to your pack",body:"Buy 5 items, save $15. Tap a color multiple times to add duplicates. Remove items from the bottom bar."}),body.classList.add("pdp-bundle-guidance-anchor"),body.insertBefore(swatchGuidanceEl,body.firstChild),swatchGuidanceEl.querySelector(".pdp-bundle-guidance__dismiss")?.addEventListener("click",()=>{guidanceDismissed.swatches=!0,updateBundleGuidance()},{signal:listenersController.signal}))},updateBundleGuidance=()=>{if(!!!bundleManager?.isActive?.()){swatchState.bundleGuidanceForcedMode=null,sizeGuidanceEl&&(sizeGuidanceEl.hidden=!0),swatchGuidanceEl&&(swatchGuidanceEl.hidden=!0);return}ensureGuidanceNodes();const bundleCount=Array.isArray(bundleManager?.getItems?.())?bundleManager.getItems().length:0,sizeSelected=hasSelectedSize(),hasSizeFieldset=!!getSizeFieldset();let forcedMode=swatchState.bundleGuidanceForcedMode,activeGuidance=null;forcedMode==="size"&&(!hasSizeFieldset||sizeSelected)&&(forcedMode=null),forcedMode==="size"?activeGuidance="size":forcedMode==="swatches"?activeGuidance="swatches":hasSizeFieldset&&!sizeSelected&&!guidanceDismissed.size?activeGuidance="size":(!hasSizeFieldset||sizeSelected)&&bundleCount<1&&!guidanceDismissed.swatches&&(activeGuidance="swatches"),swatchState.bundleGuidanceForcedMode=forcedMode,sizeGuidanceEl&&(sizeGuidanceEl.hidden=activeGuidance!=="size"),swatchGuidanceEl&&(swatchGuidanceEl.hidden=activeGuidance!=="swatches")},handleGuidanceShowRequest=()=>{if(!!!bundleManager?.isActive?.())return;const sizeSelected=hasSelectedSize();!!getSizeFieldset()&&!sizeSelected?(guidanceDismissed.size=!1,swatchState.bundleGuidanceForcedMode="size"):(guidanceDismissed.swatches=!1,swatchState.bundleGuidanceForcedMode="swatches"),updateBundleGuidance()},handleGuidanceDismiss=event=>{const dismissButton=event.target.closest(".pdp-bundle-guidance__dismiss");if(!dismissButton)return;const guidanceEl=dismissButton.closest(".pdp-bundle-guidance");guidanceEl&&(!container.contains(guidanceEl)&&!getSizeFieldset()?.contains(guidanceEl)||(event.preventDefault(),event.stopPropagation(),guidanceEl.classList.contains("pdp-bundle-guidance--size")&&(guidanceDismissed.size=!0,swatchState.bundleGuidanceForcedMode==="size"&&(swatchState.bundleGuidanceForcedMode=null)),guidanceEl.classList.contains("pdp-bundle-guidance--swatches")&&(guidanceDismissed.swatches=!0,swatchState.bundleGuidanceForcedMode==="swatches"&&(swatchState.bundleGuidanceForcedMode=null)),updateBundleGuidance()))};document.addEventListener("click",handleGuidanceDismiss,{signal:listenersController.signal}),document.addEventListener("fct:pdp-bundle-guidance:show",handleGuidanceShowRequest,{signal:listenersController.signal});const readCurrentOptions=()=>{const selectors=getVariantSelectors();if(!selectors.length)return[];const fieldsets=selectors[0].querySelectorAll("fieldset"),optionValues=[];return fieldsets.forEach(fieldset=>{const selectEl=fieldset.querySelector("select");if(selectEl){optionValues.push(selectEl.value);return}const checkedInput=fieldset.querySelector("input:checked");optionValues.push(checkedInput?checkedInput.value:"")}),optionValues},hasCompleteVariantSelection=(product,optionValues)=>{const values=Array.isArray(optionValues)?optionValues:[],expectedCount=Array.isArray(product?.options)?product.options.length:values.length;if(!expectedCount)return!0;if(values.length<expectedCount)return!1;for(let index=0;index<expectedCount;index+=1){const value=values[index];if(value==null||value.toString().trim()==="")return!1}return!0},getBundleImageForButton=(button,product)=>{const thumbImage=button?.querySelector(".product-swatch-button__thumb img");return thumbImage?.getAttribute("src")?{src:thumbImage.getAttribute("src"),srcset:thumbImage.getAttribute("srcset")||"",sizes:thumbImage.getAttribute("sizes")||""}:getProductImage(product)},createBundleItemFromTargetButton=targetButton=>{if(!bundleManager||!bundleManager.isActive()||!targetButton)return null;const targetHandle=targetButton.dataset.productHandle||"";if(!targetHandle)return null;const targetProduct=swatchState.productsByHandle?.[targetHandle]||null,currentOptions=readCurrentOptions();if(!hasCompleteVariantSelection(targetProduct,currentOptions))return null;const utils=window.FCTSwatchUtils;if(!utils||typeof utils.findVariantByOptions!="function")return null;const targetVariant=utils.findVariantByOptions(targetProduct,currentOptions);if(!targetVariant||!targetVariant.id)return null;const price=Number(targetVariant.price||0),discountCents=Number(bundleManager?.getDiscountCents?.()||0),bundlePrice=Math.max(0,price-discountCents),title=targetProduct?.title||targetButton.getAttribute("aria-label")||"";return{handle:targetHandle,variantId:targetVariant.id,title,variantTitle:targetVariant.title||"",swatchLabel:targetButton.dataset.colorLabel||targetButton.dataset.colorDisplay||"",swatchValue:targetButton.dataset.colorValue||"",displayMode:targetButton.dataset.displayMode||"color",image:getBun
1dleImageForButton(targetButton,targetProduct),price,compareAtPrice:Number(targetVariant.compare_at_price||0),bundlePrice,addedAt:Date.now()}},resolveBundleItemForButton=targetButton=>{const targetHandle=targetButton?.dataset?.productHandle||"";return targetHandle?swatchState.productsByHandle?.[targetHandle]||null?Promise.resolve(createBundleItemFromTargetButton(targetButton)):ensureProductsLoaded([targetHandle]).then(()=>createBundleItemFromTargetButton(targetButton)).catch(()=>null):Promise.resolve(null)},syncBundleDecorations=()=>{if(!bundleManager||!bundleManager.isActive()||!Array.isArray(buttons)||!buttons.length){buttons.forEach(button=>{button.classList.remove("product-swatch-button--bundle-added","product-swatch-button--bundle-current","product-swatch-button--bundle-disabled"),button.querySelector(".product-swatch-button__bundle-pill")?.remove()});return}const currentHandle=container.getAttribute("data-current-handle")||"",full=bundleManager.isFull();buttons.forEach(button=>{const handle=button.dataset.productHandle||"",count=bundleManager.getCountByHandle(handle),isCurrent=handle===currentHandle,isAdded=count>0;button.classList.toggle("product-swatch-button--bundle-current",isCurrent),button.classList.toggle("product-swatch-button--bundle-added",isAdded&&!isCurrent),button.classList.toggle("product-swatch-button--bundle-disabled",full);let pill=button.querySelector(".product-swatch-button__bundle-pill");if(!isAdded){pill?.remove();return}pill||(pill=document.createElement("span"),pill.className="product-swatch-button__bundle-pill",pill.innerHTML='<span class="product-swatch-button__bundle-pill-count"></span>',button.appendChild(pill));const countEl=pill.querySelector(".product-swatch-button__bundle-pill-count");countEl&&(countEl.textContent=count)})},updateButtonVisibility=optionValues=>{if(!container.isConnected){listenersController.abort();return}if(!Array.isArray(buttons)||!buttons.length)return;const utils=window.FCTSwatchUtils;if(!utils||typeof utils.findVariantByOptions!="function")return;const findVariantByOptions=utils.findVariantByOptions,options=Array.isArray(optionValues)?optionValues:readCurrentOptions(),hasConcreteSelection=Array.isArray(options)&&options.some(value=>value!=null&&value.toString().trim()!==""),productsMap=window.swatchProductsByHandle||{},bundleIsFull=!!(!!bundleManager?.isActive?.()&&bundleManager?.isFull?.()),currentHandle=container.getAttribute("data-current-handle")||"";let hasVisibleButton=!1;if(buttons.forEach(button=>{const handle=button.dataset.productHandle,product=productsMap[handle];let variant=null,isAvailable=!1;hasConcreteSelection&&product?(variant=findVariantByOptions(product,options),isAvailable=!!(variant&&(variant.available===void 0||variant.available===!0))):!product&&button.dataset.displayMode==="image"?isAvailable=!0:hasConcreteSelection||(isAvailable=!0);const shouldHide=!isAvailable&&!(handle===currentHandle);button.classList.toggle("product-swatch-button--hidden",shouldHide),button.classList.toggle("product-swatch-button--bundle-disabled",bundleIsFull),shouldHide?(button.setAttribute("aria-hidden","true"),button.tabIndex=-1):(button.removeAttribute("aria-hidden"),button.removeAttribute("tabindex"),hasVisibleButton=!0),bundleIsFull?button.setAttribute("aria-disabled","true"):button.removeAttribute("aria-disabled")}),!hasVisibleButton&&buttons.length&&(buttons.forEach(button=>{button.classList.remove("product-swatch-button--hidden"),button.removeAttribute("aria-hidden"),button.removeAttribute("tabindex")}),hasVisibleButton=!0),buttons.length&&buttons.reduce((acc,button)=>{const groupEl=button.closest(".product-swatch-group");if(!groupEl)return acc;const bucket=acc.get(groupEl)||[];return bucket.push(button),acc.set(groupEl,bucket),acc},new Map).forEach((groupButtons,groupEl)=>{const anyVisible=groupButtons.some(btn=>!btn.classList.contains("product-swatch-button--hidden"));groupEl&&groupEl.classList.toggle("product-swatch-group--hidden",!anyVisible)}),hasVisibleButton&&typeof activateButton=="function"){const activeVisibleButton=buttons.find(btn=>btn.classList.contains("is-active")&&!btn.classList.contains("product-swatch-button--hidden"));if(activeVisibleButton)updateGroupTitle(activeVisibleButton);else{const fallbackButton=buttons.find(btn=>!btn.classList.contains("product-swatch-button--hidden"));fallbackButton&&activateButton(fallbackButton)}}syncBundleDecorations()},handleVariantChange=event=>{if(!container.isConnected){listenersController.abort();return}if(!event||!event.detail||event.detail.sectionId&&event.detail.sectionId!==SECTION_ID)return;const variant=event.detail.variant;variant&&Array.isArray(variant.options)&&variant.options.length?updateButtonVisibility(variant.options):updateButtonVisibility(readCurrentOptions()),updateBundleGuidance()},ensureStyles=()=>
1{if(document.getElementById("product-swatch-groups-styles"))return;const style=document.createElement("style");style.id="product-swatch-groups-styles",style.textContent=` 2 .product-swatch-groups { 3 --product-swatch-image-items-gap: 2px; 4 --product-swatch-color-items-gap: 2px; 5 margin-top: 2rem; 6 display: grid; 7 gap: 0.75rem; 8 position: relative; 9 } 10 .product-swatch-groups__body { 11 display: grid; 12 gap: 1rem; 13 } 14 .pdp-bundle-guidance-anchor { 15 position: relative; 16 } 17 .pdp-bundle-guidance { 18 position: absolute; 19 left: 0; 20 bottom: calc(100% + 10px); 21 display: grid; 22 gap: 0.25rem; 23 width: min(100%, 320px); 24 padding: 0.8125rem 0.9375rem; 25 padding-right: 2rem; 26 border-radius: 8px; 27 background: #1e2d3b; 28 color: #ffffff; 29 box-shadow: 0 8px 24px rgba(0,0,0,0.18); 30 animation: pdp-bundle-guidance-in 0.25s ease; 31 z-index: 30; 32 } 33 .pdp-bundle-guidance::after { 34 content: ''; 35 position: absolute; 36 left: 20px; 37 bottom: -8px; 38 width: 0; 39 height: 0; 40 border-left: 8px solid transparent; 41 border-right: 8px solid transparent; 42 border-top: 8px solid #1e2d3b; 43 } 44 .pdp-bundle-guidance__title { 45 font-size: 0.8125rem; 46 line-height: 1.35; 47 font-weight: 700; 48 } 49 .pdp-bundle-guidance__body { 50 font-size: 0.6875rem; 51 line-height: 1.45; 52 color: rgba(255,255,255,0.78); 53 } 54 .pdp-bundle-guidance__dismiss { 55 position: absolute; 56 top: 8px; 57 right: 10px; 58 padding: 0; 59 border: 0; 60 background: transparent; 61 color: rgba(255,255,255,0.6); 62 font-size: 1rem; 63 line-height: 1; 64 cursor: pointer; 65 } 66 .pdp-bundle-guidance__dismiss:hover { 67 color: #ffffff; 68 } 69 @keyframes pdp-bundle-guidance-in { 70 from { 71 opacity: 0; 72 transform: translateY(6px); 73 } 74 to { 75 opacity: 1; 76 transform: translateY(0); 77 } 78 } 79 .product-swatch-group { 80 display: grid; 81 gap: 0.5rem; 82 } 83 .product-swatch-group__link { 84 display: inline-flex; 85 align-items: center; 86 width: fit-content; 87 max-width: 110px; 88 font-size: 0.875rem; 89 font-weight: 700; 90 text-decoration: underline; 91 text-underline-offset: 0.15em; 92 color: inherit; 93 margin-left: 5px; 94 } 95 .product-swatch-group__title { 96 font-weight: 500; 97 font-size: 0.875rem; 98 } 99 .product-swatch-group--hidden { 100 display: none; 101 } 102 .product-swatch-group__items { 103 display: flex; 104 flex-wrap: wrap; 105 gap: var(--product-swatch-color-items-gap); 106 } 107 .product-swatch-button { 108 display: inline-flex; 109 align-items: center; 110 justify-content: center; 111 padding: 0.1875rem; 112 position: relative; 113 border-radius: 5px; 114 border: 1px solid transparent; 115 cursor: pointer; 116 transition: border-color 0.2s ease, box-shadow 0.2s ease; 117 color: inherit; 118 } 119 .product-swatch-group:not([data-display-mode="image"]) .product-swatch-button, 120 .product-swatch-group:not([data-display-mode="image"]) .product-swatch-button__thumb { 121 border-radius: 50%; 122 } 123 .product-swatch-group[data-display-mode="image"] .product-swatch-group__items { 124 gap: var(--product-swatch-image-items-gap); 125 } 126 .product-swatch-group[data-display-mode="image"] .product-swatch-button { 127 padding: 0; 128 border-radius: 50%; 129 } 130 .product-swatch-button:hover { 131 border-color: rgba(0,0,0,0.35); 132 box-shadow: 0 0 0 1px rgba(0,0,0,0.1); 133 } 134 .product-swatch-button.is-active { 135 border-color: var(--color-accent, #000); 136 box-shadow: 0 0 0 1px var(--color-accent, #000); 137 } 138 .pdp-bundle-mode-active .product-swatch-button.is-active, 139 .pdp-bundle-mode-active .product-swatch-button.product-swatch-button--bundle-current { 140 border-color: #d4af37; 141 box-shadow: 0 0 0 1px #d4af37; 142 } 143 .pdp-bundle-mode-active .product-swatch-button.product-swatch-button--bundle-added:not(.product-swatch-button--bundle-current) { 144 border-color: #000000; 145 box-shadow: 0 0 0 1px #000000; 146 } 147 .pdp-bundle-mode-active .product-swatch-button.product-swatch-button--bundle-disabled .product-swatch-button__thumb { 148 opacity: 0.7; 149 } 150 .product-swatch-button.is-loading { 151 position: relative; 152 opacity: 0.6; 153 pointer-events: none; 154 } 155 .product-swatch-button.is-loading::after { 156 content: ''; 157 position: absolute; 158 width: 16px; 159 height: 16px; 160 border-radius: 50%; 161 border: 2px solid rgba(0,0,0,0.2); 162 border-top-color: rgba(0,0,0,0.6); 163 animation: product-swatch-spinner 0.8s linear infinite; 164 top: 50%; 165 left: 50%; 166 transform: translate(-50%, -50%); 167 } 168 .product-swatch-button__thumb { 169 display: inline-flex;
170 align-items: center; 171 justify-content: center; 172 height: var(--product-swatch-color-size); 173 width: var(--product-swatch-color-size); 174 aspect-ratio: 1 / 1; 175 border-radius: 5px; 176 position: relative; 177 overflow: hidden; 178 background-color: #faf7eb; 179 border: 1px solid rgba(0,0,0,0.1); 180 flex-shrink: 0; 181 } 182 .product-swatch-group[data-display-mode="image"] .product-swatch-button__thumb { 183 width: calc(var(--product-swatch-image-size) * 0.75); 184 height: calc(var(--product-swatch-image-size) * 0.75); 185 aspect-ratio: 1 / 1; 186 border-radius: 50%; 187 } 188 .product-swatch-group[data-display-mode="image"] .product-swatch-button__thumb img { 189 object-fit: cover; 190 object-position: center; 191 } 192 .product-swatch-button__thumb img { 193 position: static; 194 display: block; 195 width: 100%; 196 height: 100%; 197 object-fit: contain; 198 } 199 .product-swatch-groups--hidden { 200 display: none; 201 } 202 .product-swatch-button__sr { 203 position: absolute; 204 width: 1px; 205 height: 1px; 206 padding: 0; 207 margin: -1px; 208 overflow: hidden; 209 clip: rect(0, 0, 0, 0); 210 border: 0; 211 } 212 .product-swatch-button--hidden { 213 display: none !important; 214 } 215 .product-swatch-button__bundle-pill { 216 position: absolute; 217 right: -6px; 218 bottom: -6px; 219 display: inline-flex; 220 align-items: center; 221 overflow: hidden; 222 border-radius: 999px; 223 border: 3px solid #ffffff; 224 background: #ffffff; 225 font-size: 0.6875rem; 226 line-height: 1; 227 z-index: 2; 228 } 229 .product-swatch-button__bundle-pill-count { 230 display: inline-flex; 231 align-items: center; 232 justify-content: center; 233 min-width: 14px; 234 height: 18px; 235 padding: 0 5px; 236 } 237 .product-swatch-button__bundle-pill-count { 238 background: #232c38; 239 color: #ffffff; 240 font-weight: 700; 241 } 242 .product-swatch-group__link.is-hidden { 243 display: none !important; 244 } 245 @media (max-width: 769px) { 246 .product-swatch-group__items { 247 flex-wrap: wrap; 248 overflow: visible; 249 padding: 0; 250 width: 100%; 251 } 252 .product-swatch-button__thumb { 253 height: var(--product-swatch-mobile-color-size); 254 width: var(--product-swatch-mobile-color-size); 255 } 256 .product-swatch-group[data-display-mode="image"] .product-swatch-button__thumb { 257 width: calc(var(--product-swatch-mobile-image-size) * 0.75); 258 height: calc(var(--product-swatch-mobile-image-size) * 0.75); 259 } 260 } 261 `,document.head.appendChild(style)},getProductImage=product=>{if(!product)return null;let src="";if(product.featured_image&&(typeof product.featured_image=="string"?src=product.featured_image:product.featured_image.src&&(src=product.featured_image.src)),!src&&Array.isArray(product.images)){const firstImage=product.images.find(image=>image?typeof image=="string"?!0:!!image.src:!1);firstImage&&(src=typeof firstImage=="string"?firstImage:firstImage.src)}if(!src&&Array.isArray(product.media)){const firstMedia=product.media.find(mediaItem=>mediaItem&&mediaItem.src);firstMedia&&(src=firstMedia.src)}if(!src)return null;src.startsWith("//")&&(src="https:"+src);const cleanSrc=src.split("?")[0],widths=[80,160,240],params=w=>`?width=${w}&height=${w}`;return{src:`${cleanSrc}${params(80)}`,srcset:widths.map(w=>`${cleanSrc}${params(w)} ${w}w`).join(", "),sizes:"(min-width: 990px) 64px, 54px"}},capitaliseWords=value=>(value||"").replace(/[-_]+/g," ").split(" ").filter(Boolean).map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" "),formatGroupLabel=(baseTitle,value)=>{const rawValue=(value||"").toString().trim();return rawValue?(baseTitle||"").toString().trim().toLowerCase()==="packs"?rawValue.replace(/_+/g," ").split("-").map(chunk=>capitaliseWords(chunk)).filter(Boolean).join("-"):capitaliseWords(rawValue):""},resetGroupTitles=()=>{container.querySelectorAll(".product-swatch-group__title").forEach(titleEl=>{titleEl.textContent=titleEl.dataset.baseTitle||titleEl.textContent||""})},updateGroupTitle=button=>{if(!button)return;const groupEl=button.closest(".product-swatch-group");if(!groupEl)return;const titleEl=groupEl.querySelector(".product-swatch-group__title");if(!titleEl)return;const baseTitle=titleEl.dataset.baseTitle||titleEl.textContent||"",label=formatGroupLabel(baseTitle,button.dataset.colorLabel||"");resetGroupTitles(),titleEl.textContent=label?`${baseTitle}: ${label}`:baseTitle},normalizeLinkButton=linkButton=>{if(!linkButton||typeof linkButton!="object")return null;const label=(linkButton.label||"").toString().trim(),link=(linkButton.link||"").toString().trim(),rawActivePdpBundle=linkButton.active_pdp_bundle,hasActivePdpBundleFlag=rawActivePdpBundle===!0||rawActivePdpBundle===1||String(rawActivePdpBundle||"").trim().toLowerCase()==="true"||String(rawActivePdpBundle||"").trim()==="1",activePdpBundle=!!bundleManager?.isEnabled?.()&&hasActivePdpBundleFlag;return!label||!activePdpBundle&&!link?null:{label,link,activePdpBundle}},createGroupLinkElement=linkButton=>{if(!linkButton.activePdpBundle){const linkEl=document.createElement("a");return linkEl.className="product-swatch-group__link product-swatch-group__link--default",linkEl.href=linkButton.link,linkEl.textContent=`${linkButton.label} ->`,linkEl.setAttribute("aria-label",linkButton.label),linkEl}const fragment=document.createDocumentFragment();if(linkButton.link){const defaultLinkEl=document.createElement("a");defaultLinkEl.className="product-swatch-group__link product-swatch-group__link--default",defaultLinkEl.href=linkButton.link,defaultLinkEl.textContent=`${linkButton.label} ->`,defaultLinkEl.setAttribute("aria-label",linkButton.label),fragment.appendChild(defaultLinkEl)}
261const bundleButtonEl=document.createElement("button");return bundleButtonEl.type="button",bundleButtonEl.className="product-swatch-group__link product-swatch-group__link--bundle is-hidden",bundleButtonEl.dataset.activatePdpBundle="true",bundleButtonEl.textContent=`${linkButton.label} ->`,bundleButtonEl.setAttribute("aria-label",linkButton.label),fragment.appendChild(bundleButtonEl),fragment},scheduleCacheWarmup=handles=>{},renderGroups=()=>{if(!container.isConnected){listenersController.abort();return}const data=swatchState.rawData||window.fctSwatchData,body=container.querySelector(".product-swatch-groups__body"),handles=Array.isArray(data?.handles)?data.handles:[],currentHandle=container.getAttribute("data-current-handle")||"";if(!body)return;if(cacheWarmupScheduled=!1,ensureGuidanceNodes(),!data||!Array.isArray(data.groups)||!data.groups.length){container.classList.add("product-swatch-groups--hidden"),updateBundleGuidance();return}const renderKey=`${swatchState.activeSwatchesId||""}|${handles.join(",")}|${bundleManager?.isActive?.()?"bundle":"default"}`;if(container.dataset.renderKey===renderKey)return;container.dataset.renderKey=renderKey,body.innerHTML="",container.classList.remove("product-swatch-groups--hidden");const productsByHandle=swatchState.productsByHandle=swatchState.productsByHandle||{};window.swatchProductsByHandle=productsByHandle;const globalLinkButton=normalizeLinkButton(data.link_button);data.groups.forEach((group,groupIndex)=>{if(!group||!Array.isArray(group.items)||!group.items.length)return;const displayMode=(group.display_mode||"color").toString().trim().toLowerCase(),groupEl=document.createElement("div");groupEl.className="product-swatch-group",groupEl.dataset.displayMode=displayMode;const titleEl=document.createElement("div");titleEl.className="product-swatch-group__title",titleEl.textContent=group.name||swatchTitle,titleEl.dataset.baseTitle=titleEl.textContent,groupEl.appendChild(titleEl);const itemsEl=document.createElement("div");itemsEl.className="product-swatch-group__items",group.items.forEach(item=>{if(!item||!item.handle||displayMode==="color"&&(!item.value||item.value.toString().trim()===""))return;if(!productsByHandle[item.handle]){const fallbackProduct=Array.isArray(window.swatchProducts)?window.swatchProducts.find(p=>p&&p.handle===item.handle):null;fallbackProduct&&(productsByHandle[item.handle]=fallbackProduct)}const resolvedProduct=productsByHandle[item.handle];resolvedProduct||console.debug("Missing swatch product for handle",item.handle);const button=document.createElement("button");button.type="button",button.className="product-swatch-button",button.dataset.groupName=group.name||"",button.dataset.productHandle=item.handle,button.dataset.colorLabel=item.label||"",button.dataset.colorValue=item.value||"",button.dataset.displayMode=displayMode,button.dataset.swapMainContent="true",button.dataset.swapScroll="keep",item.handle===currentHandle?(button.classList.add("is-active"),button.setAttribute("aria-pressed","true")):button.setAttribute("aria-pressed","false");const thumb=document.createElement("span");if(thumb.className="product-swatch-button__thumb",displayMode==="color"){const swatchColor=(item.value||item.label||"").toString().trim();applySwatchPattern(thumb,swatchColor)}else{const imageData=getProductImage(resolvedProduct);if(imageData){const img=document.createElement("img");img.src=imageData.src,imageData.srcset&&(img.srcset=imageData.srcset,img.sizes=imageData.sizes),img.alt=resolvedProduct&&resolvedProduct.title?resolvedProduct.title:item.label||"",img.loading="lazy",img.decoding="async",img.fetchPriority="low",thumb.appendChild(img)}}const capitalizedLabel=capitaliseWords(item.label||item.handle||"");button.dataset.colorDisplay=capitalizedLabel,button.title=capitalizedLabel,button.setAttribute("aria-label",capitalizedLabel),button.appendChild(thumb);const srText=document.createElement("span");srText.className="product-swatch-button__sr",srText.textContent=capitalizedLabel,button.appendChild(srText),itemsEl.appendChild(button)}),groupEl.appendChild(itemsEl);const groupLinkButton=normalizeLinkButton(group.link_button),isLastGroup=groupIndex===data.groups.length-1,linkToRender=groupLinkButton||(isLastGroup?globalLinkButton:null);linkToRender&&(bundleManager?.isActive?.()&&linkToRender.activePdpBundle||itemsEl.appendChild(createGroupLinkElement(linkToRender))),body.appendChild(groupEl)}),resetGroupTitles(),buttons=Array.from(body.querySelectorAll(".product-swatch-button"));const imageSwatchHandles=Array.from(new Set(data.groups.reduce((handles2,group)=>((group?.display_mode||"color").toString().trim().toLowerCase()!=="image"||!Array.isArray(group?.items)||group.items.forEac
261h(item=>{item?.handle&&handles2.push(item.handle)}),handles2),[]))),clearLoading=function(handle){buttons.forEach(function(button){handle&&button.dataset.productHandle!==handle||(button.classList.remove("is-loading"),button.removeAttribute("aria-busy"))})};if(!cacheWarmupScheduled&&buttons.length){const handlesForWarmup=buttons.map(btn=>btn.dataset.productHandle).filter(handle=>typeof handle=="string"&&handle.trim()!=="");scheduleCacheWarmup(handlesForWarmup)}activateButton=(targetButton,commitHandle=!0)=>{targetButton&&(buttons.forEach(btn=>{const isActive=btn===targetButton;btn.classList.toggle("is-active",isActive),btn.setAttribute("aria-pressed",isActive?"true":"false"),isActive&&(btn.classList.remove("is-loading"),btn.removeAttribute("aria-busy"))}),commitHandle&&container.setAttribute("data-current-handle",targetButton.dataset.productHandle||""),updateGroupTitle(targetButton))};const pendingState={handle:null,button:null,previous:null},setButtonPending=(button,isPending)=>{button&&(button.classList.toggle("is-loading",!!isPending),isPending?(button.setAttribute("aria-busy","true"),button.disabled=!0):(button.removeAttribute("aria-busy"),button.disabled=!1))};if(swapToHandle=button=>{if(!button)return;const handle=button.dataset.productHandle;if(!handle||container.getAttribute("data-current-handle")===handle||button.dataset.swapBusy==="true"||!window.swapMainContent||typeof window.swapMainContent!="function")return;pendingState.previous=buttons.find(btn=>btn.classList.contains("is-active"))||null,pendingState.handle=handle,pendingState.button=button,activateButton(button,!1),setButtonPending(button,!0),button.dataset.swapBusy="true";const scroll=button.dataset.swapScroll||"keep",cache=button.dataset.swapCache!=="false";window.swapMainContent(handle,{scroll,cache,trigger:button}).catch(error=>{error&&error.name!=="AbortError"&&console.error(error)}).finally(()=>{delete button.dataset.swapBusy})},buttons.forEach(button=>{if(button.addEventListener("click",event=>{const handle=button.dataset.productHandle;if(!handle)return;const currentHandle2=container.getAttribute("data-current-handle");if(button.dataset.bundleAddBusy==="true"){event.preventDefault(),event.stopPropagation();return}if(bundleManager?.isActive?.()){if(bundleManager.isFull()){event.preventDefault(),event.stopPropagation();return}swatchState.bundleGuidanceForcedMode=null,guidanceDismissed.swatches=!0,updateBundleGuidance(),event.preventDefault(),event.stopPropagation(),button.dataset.bundleAddBusy="true",setButtonPending(button,!0),resolveBundleItemForButton(button).then(bundleItem=>{if(!bundleItem){setButtonPending(button,!1);return}if(!bundleManager.addItem(bundleItem,{source:"swatch-click",sectionId:SECTION_ID}).ok){setButtonPending(button,!1);return}if(currentHandle2===handle){setButtonPending(button,!1),updateButtonVisibility(readCurrentOptions());return}if(ensureProductsLoaded([handle]).then(()=>{hydrateButtonThumbnails()}).catch(()=>{}),typeof swapToHandle=="function"&&typeof window.swapMainContent=="function"){swapToHandle(button);return}currentHandle2!==handle&&(pendingState.previous=buttons.find(btn=>btn.classList.contains("is-active"))||null,pendingState.handle=handle,pendingState.button=button,activateButton(button,!1),setButtonPending(button,!0))}).catch(()=>{setButtonPending(button,!1)}).finally(()=>{delete button.dataset.bundleAddBusy});return}if(ensureProductsLoaded([handle]).then(()=>{hydrateButtonThumbnails()}).catch(()=>{}),typeof swapToHandle=="function"&&typeof window.swapMainContent=="function"){swapToHandle(button),event.preventDefault(),event.stopPropagation();return}currentHandle2!==handle&&(pendingState.previous=buttons.find(btn=>btn.classList.contains("is-active"))||null,pendingState.handle=handle,pendingState.button=button,activateButton(button,!1),setButtonPending(button,!0),event.preventDefault())}),window.swapMainContent&&typeof window.swapMainContent.prefetch=="function"){const prefetch=()=>{window.matchMedia("(min-width: 768px)").matches&&window.swapMainContent.prefetch(button.dataset.productHandle)};button.addEventListener("pointerenter",prefetch,{once:!0}),button.addEventListener("focus",prefetch,{once:!0})}}),Array.from(body.querySelectorAll('[data-activate-pdp-bundle="true"]')).forEac
261h(linkButton=>{linkButton.addEventListener("click",event=>{event.preventDefault(),bundleManager?.activate?.({source:"link_button",sectionId:SECTION_ID})&&renderGroups()})}),typeof AbortController=="function"){const addSwapListener=function(name,handler){document.addEventListener(name,function(event){if(!container.isConnected){listenersController.abort();return}handler(event)},{signal:listenersController.signal})};if(addSwapListener("pdp:swap:start",function(event){!event.detail||event.detail.handle!==pendingState.handle||event.detail.trigger&&event.detail.trigger!==pendingState.button||setButtonPending(pendingState.button,!0)}),addSwapListener("pdp:swap:success",function(event){!event.detail||event.detail.handle!==pendingState.handle||(setButtonPending(pendingState.button,!1),clearLoading(event.detail.handle),container.setAttribute("data-current-handle",pendingState.handle||""),pendingState.handle=null,pendingState.button=null,pendingState.previous=null)}),addSwapListener("pdp:swap:error",function(event){!event.detail||event.detail.handle!==pendingState.handle||(setButtonPending(pendingState.button,!1),clearLoading(),pendingState.previous&&activateButton(pendingState.previous,!0),pendingState.handle=null,pendingState.button=null,pendingState.previous=null)}),container.parentNode){const observer=new MutationObserver(function(){container.isConnected||(listenersController.abort(),observer.disconnect())});observer.observe(container.parentNode,{childList:!0})}}else document.addEventListener("pdp:swap:success",function(){clearLoading()}),document.addEventListener("pdp:swap:error",function(){clearLoading()});const initialActiveButton=buttons.find(btn=>btn.dataset.productHandle===currentHandle)||buttons[0];initialActiveButton&&activateButton(initialActiveButton),updateButtonVisibility(readCurrentOptions()),updateBundleGuidance(),imageSwatchHandles.length&&ensureProductsLoaded(imageSwatchHandles).then(()=>{container.isConnected&&(hydrateButtonThumbnails(),updateButtonVisibility(readCurrentOptions()))}).catch(()=>{})},handleDataReady=event=>{if(!container.isConnected){listenersController.abort();return}!event||!event.detail||event.detail.sectionId&&event.detail.sectionId!==SECTION_ID||renderGroups()};ensureStyles(),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",renderGroups,{once:!0,signal:listenersController.signal}):renderGroups(),document.addEventListener("fct:swatch-data-ready",handleDataReady,{signal:listenersController.signal}),document.addEventListener("product:variant-change",handleVariantChange,{signal:listenersController.signal}),document.addEventListener("fct:pdp-bundle:update",()=>{updateButtonVisibility(readCurrentOptions()),updateBundleGuidance()},{signal:listenersController.signal}),document.addEventListener("fct:pdp-bundle:mode-change",()=>{renderGroups()},{signal:listenersController.signal}),document.addEventListener("change",event=>{const target=event.target;target&&target.closest(`variant-selects[data-section="${SECTION_ID}"]`)&&updateBundleGuidance()},{signal:listenersController.signal}),document.addEventListener("fct:swatch-utils-ready",()=>{updateButtonVisibility(readCurrentOptions())},{once:!0,signal:listenersController.signal})};return{mount,mountAll:()=>{document.querySelectorAll("[data-product-swatch-groups-root]").forEach(container=>{mount(container)})}}})()); 262//# sourceMappingURL=/cdn/shop/t/265/assets/product-swatch-groups.js.map?v=37435385530836497521790356414
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.