PageSourceSearch

https://clubrecess.com/cdn/shop/t/265/assets/product-swatch-groups.js?v=37435385530836497521790356414

js clubrecess.com collected 2026-10-10 00:36:44 UTC 44,321 bytes, 262 lines download raw bytes

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&&current&&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="&times;",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.