@lime-bundles/widget 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +100 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +86 -22
- package/dist/index.js.map +1 -1
- package/dist/lime-bundle.global.js +80 -33
- package/dist/lime-bundle.global.js.map +1 -1
- package/docs/css-variables.md +2 -1
- package/package.json +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var LimeBundles=(()=>{var Y=Object.defineProperty;var
|
|
1
|
+
"use strict";var LimeBundles=(()=>{var Y=Object.defineProperty;var We=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var ze=Object.prototype.hasOwnProperty;var je=(e,t)=>{for(var r in t)Y(e,r,{get:t[r],enumerable:!0})},Ge=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of qe(t))!ze.call(e,n)&&n!==r&&Y(e,n,{get:()=>t[n],enumerable:!(i=We(t,n))||i.enumerable});return e};var Qe=e=>Ge(Y({},"__esModule",{value:!0}),e);var Yt={};je(Yt,{LimeBundleElement:()=>G});var ae=class extends Error{constructor(e){super(e.map(t=>t.message).join("; ")),this.errors=e,this.name="StorefrontApiError"}},Ke="2025-10";function X(e){let t=e.apiVersion??Ke,r=`https://${e.shopDomain}/api/${t}/graphql.json`;return{async query(i,n,a){let o={"Content-Type":"application/json","X-Shopify-Storefront-Access-Token":e.accessToken};e.buyerIp&&(o["Shopify-Storefront-Buyer-IP"]=e.buyerIp);let d=await fetch(r,{method:"POST",headers:o,body:JSON.stringify({query:i,variables:n}),signal:a?.signal});if(!d.ok)throw new ae([{message:`Storefront API error: ${d.status} ${d.statusText}`}]);let l=await d.json();if(l.errors?.length)throw new ae(l.errors);return l.data}}}var pe=`#graphql
|
|
2
2
|
query BundleMetaobject($id: ID!) {
|
|
3
3
|
metaobject(id: $id) {
|
|
4
4
|
id
|
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
availableForSale
|
|
24
24
|
price { amount currencyCode }
|
|
25
25
|
compareAtPrice { amount currencyCode }
|
|
26
|
+
unitPrice { amount currencyCode }
|
|
27
|
+
unitPriceMeasurement { referenceValue referenceUnit }
|
|
26
28
|
selectedOptions { name value }
|
|
27
29
|
}
|
|
28
30
|
}
|
|
@@ -46,6 +48,8 @@
|
|
|
46
48
|
availableForSale
|
|
47
49
|
price { amount currencyCode }
|
|
48
50
|
compareAtPrice { amount currencyCode }
|
|
51
|
+
unitPrice { amount currencyCode }
|
|
52
|
+
unitPriceMeasurement { referenceValue referenceUnit }
|
|
49
53
|
selectedOptions { name value }
|
|
50
54
|
}
|
|
51
55
|
}
|
|
@@ -71,6 +75,8 @@
|
|
|
71
75
|
availableForSale
|
|
72
76
|
price { amount currencyCode }
|
|
73
77
|
compareAtPrice { amount currencyCode }
|
|
78
|
+
unitPrice { amount currencyCode }
|
|
79
|
+
unitPriceMeasurement { referenceValue referenceUnit }
|
|
74
80
|
selectedOptions { name value }
|
|
75
81
|
}
|
|
76
82
|
}
|
|
@@ -82,7 +88,7 @@
|
|
|
82
88
|
}
|
|
83
89
|
}
|
|
84
90
|
}
|
|
85
|
-
`,
|
|
91
|
+
`,be=`#graphql
|
|
86
92
|
query ShopCustomCss {
|
|
87
93
|
shop {
|
|
88
94
|
metafield(namespace: "$app", key: "custom_css") {
|
|
@@ -90,7 +96,7 @@
|
|
|
90
96
|
}
|
|
91
97
|
}
|
|
92
98
|
}
|
|
93
|
-
`,
|
|
99
|
+
`,he=`#graphql
|
|
94
100
|
query BundlesForProduct($handle: String!) {
|
|
95
101
|
product(handle: $handle) {
|
|
96
102
|
id
|
|
@@ -122,6 +128,8 @@
|
|
|
122
128
|
availableForSale
|
|
123
129
|
price { amount currencyCode }
|
|
124
130
|
compareAtPrice { amount currencyCode }
|
|
131
|
+
unitPrice { amount currencyCode }
|
|
132
|
+
unitPriceMeasurement { referenceValue referenceUnit }
|
|
125
133
|
selectedOptions { name value }
|
|
126
134
|
}
|
|
127
135
|
}
|
|
@@ -145,6 +153,8 @@
|
|
|
145
153
|
availableForSale
|
|
146
154
|
price { amount currencyCode }
|
|
147
155
|
compareAtPrice { amount currencyCode }
|
|
156
|
+
unitPrice { amount currencyCode }
|
|
157
|
+
unitPriceMeasurement { referenceValue referenceUnit }
|
|
148
158
|
selectedOptions { name value }
|
|
149
159
|
}
|
|
150
160
|
}
|
|
@@ -170,6 +180,8 @@
|
|
|
170
180
|
availableForSale
|
|
171
181
|
price { amount currencyCode }
|
|
172
182
|
compareAtPrice { amount currencyCode }
|
|
183
|
+
unitPrice { amount currencyCode }
|
|
184
|
+
unitPriceMeasurement { referenceValue referenceUnit }
|
|
173
185
|
selectedOptions { name value }
|
|
174
186
|
}
|
|
175
187
|
}
|
|
@@ -185,42 +197,42 @@
|
|
|
185
197
|
}
|
|
186
198
|
}
|
|
187
199
|
}
|
|
188
|
-
`,
|
|
200
|
+
`,me=`#graphql
|
|
189
201
|
mutation CartCreate($input: CartInput!) {
|
|
190
202
|
cartCreate(input: $input) {
|
|
191
203
|
cart { id checkoutUrl }
|
|
192
204
|
userErrors { field message }
|
|
193
205
|
}
|
|
194
206
|
}
|
|
195
|
-
`,
|
|
207
|
+
`,ge=`#graphql
|
|
196
208
|
mutation CartLinesAdd($cartId: ID!, $lines: [CartLineInput!]!) {
|
|
197
209
|
cartLinesAdd(cartId: $cartId, lines: $lines) {
|
|
198
210
|
cart { id checkoutUrl }
|
|
199
211
|
userErrors { field message }
|
|
200
212
|
}
|
|
201
213
|
}
|
|
202
|
-
`,U=class extends Error{constructor(e,t){super(e),this.reason=t,this.name="BundleParseError"}},D={header:{textColor:"#FFFFFF",headerStyle:"gradient",gradientStart:"#C62828",gradientEnd:"#AD1457",saveBadgeBgColor:"#FFFFFF",saveBadgeTextColor:"#AD1457",saveBadgeBorderColor:"#FFFFFF",saveBadgeBorderWidth:0,saveBadgeBorderRadius:8,countdownBgColor:"#FFF0F3",countdownTextColor:"#C62828"},layout:{backgroundColor:"#FFFFFF",borderColor:"#E5E5E5",borderWidth:1,borderRadius:12},productList:{textColor:"#1A1A1A",imageBorderWidth:0,imageBorderColor:"#E5E5E5",imageBorderRadius:8,variantBorderWidth:1,variantBorderColor:"#E5E5E5",variantBorderRadius:8,showPrice:!0,showCompareAtPrice:!0,showCountBubble:!0,countBubbleBgColor:"#1A1A1A",countBubbleTextColor:"#FFFFFF"},pricing:{showSaveBadge:!0,showComparePrice:!0,showPerUnitPrice:!0,showItemCount:!0,showCompareAtPrice:!0},cta:{ctaText:"Add to cart",primaryColor:"#1A1A1A",buttonTextColor:"#FFFFFF",borderWidth:0,borderColor:"#1A1A1A",borderRadius:12},savingsBar:{visible:!0,bgColor:"#EDFBF1",textColor:"#2DB554",borderWidth:0,borderColor:"#2DB554",borderRadius:8},countdown:{showCountdown:!0},popularBadge:{visible:!0,text:"Most Popular",bgColor:"#1A1A1A",textColor:"#FFFFFF",borderWidth:0,borderColor:"#1A1A1A",borderRadius:12},outOfStockBehavior:"show_greyed_out",showSearch:!0,pickerBgColor:"#FFFFFF",pickerTextColor:"#1A1A1A",pickerBorderWidth:0,pickerBorderColor:"#E5E5E5",pickerBorderRadius:16,pickerSearchBorderWidth:1,pickerSearchBorderColor:"#E5E5E5",pickerSearchBorderRadius:8,pickerProductBorderWidth:0,pickerProductBorderColor:"#E5E5E5",pickerProductBorderRadius:8,pickerShowCountBubble:!0,pickerCountBubbleBgColor:"#1A1A1A",pickerCountBubbleTextColor:"#FFFFFF",pickerAddBgColor:"#1A1A1A",pickerAddLabelColor:"#FFFFFF",pickerAddBorderWidth:0,pickerAddBorderColor:"#1A1A1A",pickerAddBorderRadius:8,pickerVariantBorderWidth:1,pickerVariantBorderColor:"#1A1A1A",pickerVariantBorderRadius:8,tierBorderColor:"#E5E5E5",tierBorderWidth:1,tierBorderRadius:12,tierSelectedBorderColor:"#1A1A1A",tierSelectedBorderWidth:2,defaultTier:"first"};function Ge(e){if(!e||typeof e!="object")return D;let t=e;return{...D,...t,defaultTier:Qe(t.defaultTier),header:{...D.header,...t.header??{}},layout:{...D.layout,...t.layout??{}},productList:{...D.productList,...t.productList??{}},pricing:{...D.pricing,...t.pricing??{}},cta:{...D.cta,...t.cta??{}},savingsBar:{...D.savingsBar,...t.savingsBar??{}},countdown:{...D.countdown,...t.countdown??{}},popularBadge:{...D.popularBadge,...t.popularBadge??{}}}}function Qe(e){return e==="first"||e==="best_value"||typeof e=="number"&&Number.isInteger(e)&&e>=0?e:D.defaultTier}function Ye(e){return{primaryColor:e.cta.primaryColor,backgroundColor:e.layout.backgroundColor,textColor:e.productList.textColor,borderColor:e.layout.borderColor,borderWidth:e.layout.borderWidth,buttonTextColor:e.cta.buttonTextColor,ctaBorderWidth:e.cta.borderWidth,ctaBorderColor:e.cta.borderColor,ctaBorderRadius:e.cta.borderRadius,savingsBarBgColor:e.savingsBar.bgColor,savingsBarTextColor:e.savingsBar.textColor,savingsBarBorderWidth:e.savingsBar.borderWidth,savingsBarBorderColor:e.savingsBar.borderColor,savingsBarBorderRadius:e.savingsBar.borderRadius,borderRadius:e.layout.borderRadius,headerTextColor:e.header.textColor,saveBadgeBgColor:e.header.saveBadgeBgColor,saveBadgeTextColor:e.header.saveBadgeTextColor,saveBadgeBorderColor:e.header.saveBadgeBorderColor,saveBadgeBorderWidth:e.header.saveBadgeBorderWidth,saveBadgeBorderRadius:e.header.saveBadgeBorderRadius,countdownBgColor:e.header.countdownBgColor,countdownTextColor:e.header.countdownTextColor,headerStyle:e.header.headerStyle,headerGradientStart:e.header.gradientStart,headerGradientEnd:e.header.gradientEnd,showSaveBadge:e.pricing.showSaveBadge,imageBorderWidth:e.productList.imageBorderWidth,imageBorderColor:e.productList.imageBorderColor,imageBorderRadius:e.productList.imageBorderRadius,variantBorderWidth:e.productList.variantBorderWidth,variantBorderColor:e.productList.variantBorderColor,variantBorderRadius:e.productList.variantBorderRadius,countBubbleBgColor:e.productList.countBubbleBgColor,countBubbleTextColor:e.productList.countBubbleTextColor,showProductPrice:e.productList.showPrice,showProductCompareAtPrice:e.productList.showCompareAtPrice,showCountBubble:e.productList.showCountBubble,showCountdown:e.countdown.showCountdown,ctaText:e.cta.ctaText,outOfStockBehavior:e.outOfStockBehavior,showComparePrice:e.pricing.showComparePrice,showPerUnitPrice:e.pricing.showPerUnitPrice,showItemCount:e.pricing.showItemCount,showCompareAtPrice:e.pricing.showCompareAtPrice,showMostPopular:e.popularBadge.visible,popularBadgeText:e.popularBadge.text,popularBadgeBgColor:e.popularBadge.bgColor,popularBadgeTextColor:e.popularBadge.textColor,popularBadgeBorderWidth:e.popularBadge.borderWidth,popularBadgeBorderColor:e.popularBadge.borderColor,popularBadgeBorderRadius:e.popularBadge.borderRadius,showSearch:e.showSearch,pickerBgColor:e.pickerBgColor,pickerTextColor:e.pickerTextColor,pickerBorderWidth:e.pickerBorderWidth,pickerBorderColor:e.pickerBorderColor,pickerBorderRadius:e.pickerBorderRadius,pickerSearchBorderWidth:e.pickerSearchBorderWidth,pickerSearchBorderColor:e.pickerSearchBorderColor,pickerSearchBorderRadius:e.pickerSearchBorderRadius,pickerProductBorderWidth:e.pickerProductBorderWidth,pickerProductBorderColor:e.pickerProductBorderColor,pickerProductBorderRadius:e.pickerProductBorderRadius,pickerShowCountBubble:e.pickerShowCountBubble,pickerCountBubbleBgColor:e.pickerCountBubbleBgColor,pickerCountBubbleTextColor:e.pickerCountBubbleTextColor,pickerAddBgColor:e.pickerAddBgColor,pickerAddLabelColor:e.pickerAddLabelColor,pickerAddBorderWidth:e.pickerAddBorderWidth,pickerAddBorderColor:e.pickerAddBorderColor,pickerAddBorderRadius:e.pickerAddBorderRadius,pickerVariantBorderWidth:e.pickerVariantBorderWidth,pickerVariantBorderColor:e.pickerVariantBorderColor,pickerVariantBorderRadius:e.pickerVariantBorderRadius,tierBorderColor:e.tierBorderColor,tierBorderWidth:e.tierBorderWidth,tierBorderRadius:e.tierBorderRadius,tierSelectedBorderColor:e.tierSelectedBorderColor,tierSelectedBorderWidth:e.tierSelectedBorderWidth,defaultTier:e.defaultTier,...e.popularBadge.tierIndex!==void 0&&{mostPopularTierIndex:e.popularBadge.tierIndex}}}var Ke={primaryColor:"--lb-primary-color",backgroundColor:"--lb-bg",textColor:"--lb-text",imageBorderWidth:"--lb-image-border-width",imageBorderColor:"--lb-image-border-color",imageBorderRadius:"--lb-image-border-radius",variantBorderWidth:"--lb-variant-border-width",variantBorderColor:"--lb-variant-border-color",variantBorderRadius:"--lb-variant-radius",countBubbleBgColor:"--lb-qty-badge-bg",countBubbleTextColor:"--lb-qty-badge-color",borderColor:"--lb-border",borderWidth:"--lb-border-width",buttonTextColor:"--lb-btn-text",borderRadius:"--lb-radius",headerTextColor:"--lb-header-text",saveBadgeBgColor:"--lb-save-badge-bg",saveBadgeTextColor:"--lb-save-badge-text",saveBadgeBorderColor:"--lb-save-badge-border-color",saveBadgeBorderWidth:"--lb-save-badge-border-width",saveBadgeBorderRadius:"--lb-save-badge-radius",countdownBgColor:"--lb-countdown-bg",countdownTextColor:"--lb-countdown-text",ctaBorderWidth:"--lb-cta-border-width",ctaBorderColor:"--lb-cta-border-color",ctaBorderRadius:"--lb-cta-radius",savingsBarBgColor:"--lb-savings-bar-bg",savingsBarTextColor:"--lb-savings-bar-text",savingsBarBorderWidth:"--lb-savings-bar-border-width",savingsBarBorderColor:"--lb-savings-bar-border-color",savingsBarBorderRadius:"--lb-savings-bar-radius",tierBorderColor:"--lb-tier-border-color",tierBorderWidth:"--lb-tier-border-width",tierBorderRadius:"--lb-tier-radius",tierSelectedBorderColor:"--lb-tier-selected-border-color",tierSelectedBorderWidth:"--lb-tier-selected-border-width",popularBadgeBgColor:"--lb-popular-badge-bg",popularBadgeTextColor:"--lb-popular-badge-text",popularBadgeBorderWidth:"--lb-popular-badge-border-width",popularBadgeBorderColor:"--lb-popular-badge-border-color",popularBadgeBorderRadius:"--lb-popular-badge-radius",headerGradientStart:"--lb-header-start",headerGradientEnd:"--lb-header-end",pickerBgColor:"--lb-picker-bg",pickerTextColor:"--lb-picker-text",pickerBorderWidth:"--lb-picker-border-width",pickerBorderColor:"--lb-picker-border-color",pickerBorderRadius:"--lb-picker-radius",pickerSearchBorderWidth:"--lb-picker-search-border-width",pickerSearchBorderColor:"--lb-picker-search-border-color",pickerSearchBorderRadius:"--lb-picker-search-radius",pickerProductBorderWidth:"--lb-picker-product-border-width",pickerProductBorderColor:"--lb-picker-product-border-color",pickerProductBorderRadius:"--lb-picker-product-radius",pickerCountBubbleBgColor:"--lb-picker-qty-badge-bg",pickerCountBubbleTextColor:"--lb-picker-qty-badge-color",pickerAddBgColor:"--lb-picker-add-bg",pickerAddLabelColor:"--lb-picker-add-label",pickerAddBorderWidth:"--lb-picker-add-border-width",pickerAddBorderColor:"--lb-picker-add-border-color",pickerAddBorderRadius:"--lb-picker-add-radius",pickerVariantBorderWidth:"--lb-picker-variant-border-width",pickerVariantBorderColor:"--lb-picker-variant-border-color",pickerVariantBorderRadius:"--lb-picker-variant-radius"},Xe=new Set(["borderRadius","borderWidth","saveBadgeBorderWidth","saveBadgeBorderRadius","tierBorderWidth","tierBorderRadius","tierSelectedBorderWidth","savingsBarBorderWidth","savingsBarBorderRadius","ctaBorderWidth","ctaBorderRadius","popularBadgeBorderWidth","popularBadgeBorderRadius","imageBorderWidth","imageBorderRadius","variantBorderWidth","variantBorderRadius","pickerBorderWidth","pickerBorderRadius","pickerSearchBorderWidth","pickerSearchBorderRadius","pickerProductBorderWidth","pickerProductBorderRadius","pickerAddBorderWidth","pickerAddBorderRadius","pickerVariantBorderWidth","pickerVariantBorderRadius"]);function he(e,t){let n=Ye(t);for(let[i,r]of Object.entries(Ke)){let a=n[i];if(a==null)continue;let o=Xe.has(i)?`${a}px`:String(a);e.style.setProperty(r,o)}e.style.setProperty("--lb-product-price-display",t.productList.showPrice?"block":"none"),e.style.setProperty("--lb-product-compare-display",t.productList.showCompareAtPrice?"inline":"none"),e.style.setProperty("--lb-qty-badge-display",t.productList.showCountBubble?"flex":"none"),e.style.setProperty("--lb-picker-qty-badge-display",t.pickerShowCountBubble?"flex":"none"),t.header.headerStyle==="solid"?e.style.setProperty("--lb-header-bg",t.header.gradientStart):e.style.setProperty("--lb-header-bg",`linear-gradient(135deg, ${t.header.gradientStart}, ${t.header.gradientEnd})`)}var Je=new Set(["fixed","mix_match","volume"]),Ze=new Set(["active"]);function X(e,t){try{return et(e,t)}catch(n){if(n instanceof U)return null;throw n}}function et(e,t){let n=new Map(t.map(v=>[v.key,v])),i=n.get("title")?.value??"Bundle",r=n.get("bundle_type")?.value,a=n.get("status")?.value;if(!r||!Je.has(r))throw new U(`Invalid or missing bundle_type: ${r??"null"}`,"invalid_type");let o=r;if(!a||!Ze.has(a))throw new U(`Bundle is not active: status=${a??"null"}`,"inactive");let d=a,l=n.get("starts_at")?.value??null,u=n.get("ends_at")?.value??null,c=new Date;if(l){let v=new Date(l);if(Number.isNaN(v.getTime()))throw new U(`Invalid starts_at: ${l}`,"invalid_type");if(v>c)throw new U(`Bundle not yet started: starts_at=${l}`,"not_started")}if(u){let v=new Date(u);if(Number.isNaN(v.getTime()))throw new U(`Invalid ends_at: ${u}`,"invalid_type");if(v<c)throw new U(`Bundle has expired: ends_at=${u}`,"expired")}let p=tt(n),f=rt(n),h=nt(n),m={id:e,title:i,description:n.get("description")?.value||null,status:d,products:p,discountConfig:f,widgetConfig:h,startsAt:l,endsAt:u,discountLabel:n.get("discount_label")?.value??null,selectedVariantIds:it(n),productQuantities:ie(n,"product_quantities"),variantQuantities:ie(n,"variant_quantities"),abTestId:n.get("ab_test_id")?.value??null,abVariantB:ot(n)};switch(o){case"fixed":return{...m,bundleType:"fixed"};case"volume":return{...m,bundleType:"volume",volumeTiers:at(n)};case"mix_match":return{...m,bundleType:"mix_match",minQuantity:oe(n,"min_quantity",{min:1}),maxQuantity:oe(n,"max_quantity",{min:1})}}}function tt(e){let t=[],n=e.get("products");if(n?.reference&&"variants"in n.reference&&t.push(n.reference),n?.references?.nodes)for(let r of n.references.nodes)"variants"in r?t.push(r):"products"in r&&r.products?.nodes&&t.push(...r.products.nodes);let i=e.get("collection");if(i?.references?.nodes)for(let r of i.references.nodes)"products"in r&&r.products?.nodes&&t.push(...r.products.nodes);return t}function rt(e){return{discountType:e.get("discount_type")?.value??"percentage",discountValue:parseFloat(e.get("discount_value")?.value??"0"),allowStacking:e.get("allow_stacking")?.value==="true"}}function nt(e){return Ge(z(e,"widget_config"))}function it(e){let t=z(e,"selected_variant_ids");if(!Array.isArray(t))return null;let n=[];for(let i of t)Array.isArray(i)?n.push(i.filter(r=>typeof r=="string")):n.push([]);return n}function ie(e,t){let n=z(e,t);if(!n||typeof n!="object"||Array.isArray(n))return{};let i={};for(let[r,a]of Object.entries(n)){let o=typeof a=="number"?a:Number(a);Number.isFinite(o)&&o>=0&&(i[r]=o)}return i}function ot(e){if(!e.get("ab_test_id")?.value)return null;let n={},i=e.get("ab_title")?.value;i&&(n.title=i);let r=e.get("ab_description")?.value;r&&(n.description=r);let a=e.get("ab_discount_type")?.value,o=e.get("ab_discount_value")?.value;if(a&&(a==="percentage"||a==="fixed_amount")&&o){let l=parseFloat(o);Number.isFinite(l)&&(n.discountConfig={discountType:a,discountValue:l,allowStacking:e.get("allow_stacking")?.value==="true"})}let d=z(e,"ab_volume_tiers");return Array.isArray(d)&&(n.volumeTiers=d.filter(l=>typeof l=="object"&&l!==null).map(me)),Object.keys(n).length===0?null:n}function at(e){let t=z(e,"volume_tiers");return Array.isArray(t)?t.filter(n=>typeof n=="object"&&n!==null).map(me):[]}function me(e){let t=Number(e.minQuantity??0),n={minQuantity:Number.isFinite(t)&&t>=0?t:0};return typeof e.percentage=="number"&&Number.isFinite(e.percentage)&&(n.percentage=e.percentage),typeof e.amount=="number"&&Number.isFinite(e.amount)&&(n.amount=e.amount),n}function z(e,t){let n=e.get(t)?.value;if(!n)return null;try{return JSON.parse(n)}catch{return null}}function oe(e,t,n={}){let i=e.get(t)?.value;if(!i)return null;let r=parseInt(i,10);return isNaN(r)||n.min!==void 0&&r<n.min?null:r}function ge(e){let t=e.abVariantB;if(!t)return e;let n=t.title??e.title,i=t.description!==void 0?t.description:e.description,r=t.discountConfig??e.discountConfig;switch(e.bundleType){case"volume":return{...e,title:n,description:i,discountConfig:r,volumeTiers:t.volumeTiers??e.volumeTiers};case"mix_match":return{...e,title:n,description:i,discountConfig:r};case"fixed":return{...e,title:n,description:i,discountConfig:r}}}async function fe(e,t){await Ce(e,{shopDomain:e.shopDomain,eventType:"bundle_impression",bundleGid:t.bundleGid,bundleType:t.bundleType,productId:t.productId,abTestId:t.abTestId,abVariant:t.abVariant,occurredAt:new Date().toISOString()})}async function ve(e,t){await Ce(e,{shopDomain:e.shopDomain,eventType:"bundle_add_to_cart",...t,occurredAt:new Date().toISOString()})}function xe(e,t){if(typeof IntersectionObserver>"u")return t(),()=>{};let n=new IntersectionObserver(i=>{for(let r of i)r.isIntersecting&&(t(),n.unobserve(r.target))},{threshold:.5});return n.observe(e),()=>n.disconnect()}async function Ce(e,t){let n=`${e.appUrl}/api/analytics`,i=JSON.stringify(t);try{(await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:i})).ok||(await new Promise(a=>setTimeout(a,2e3)),await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:i}))}catch{try{typeof navigator<"u"&&navigator.sendBeacon&&navigator.sendBeacon(n,i)}catch{}}}var lt=!1;function dt(){if(lt)return!0;if(typeof window>"u")return!1;let e=window.Shopify;try{return e?.customerPrivacy?.analyticsProcessingAllowed?.()===!0}catch{return!1}}var ae="lb_session",st=720*60*60,ct=720*60*60;function ye(e){return`__Host-_lb_ab_${e}`}async function we(e,t,n,i){if(typeof document>"u")return null;let r=ut(i);if(r&&r.testId===n)return{variant:r.variant,testId:n,persisted:!0};if(!dt())return{variant:"A",testId:n,persisted:!1};let a=bt(),o=ht(a,n);pt(i,n,o);try{fetch(`${e}/api/ab-assign`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({shopDomain:t,testId:n,sessionId:a,variant:o})}).catch(()=>{})}catch{}return{variant:o,testId:n,persisted:!0}}function ut(e){if(typeof document>"u")return null;let n=`${ye(e)}=`,r=document.cookie.split(";").map(l=>l.trim()).find(l=>l.startsWith(n));if(!r)return null;let a=r.substring(n.length),[o,d]=a.split("|");return o!=="A"&&o!=="B"||!d?null:{testId:d,variant:o}}function pt(e,t,n){if(typeof document>"u")return;let i=ye(e),r=`${n}|${t}|${Date.now()}`;document.cookie=`${i}=${r}; Path=/; Max-Age=${ct}; SameSite=Lax; Secure`}function bt(){if(typeof document>"u")return le();let t=document.cookie.split(";").map(i=>i.trim()).find(i=>i.startsWith(`${ae}=`))?.split("=")[1];if(t)return t;let n=le();return document.cookie=`${ae}=${n}; path=/; max-age=${st}; SameSite=Lax; Secure`,n}function le(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}function ht(e,t){let n=e+":"+t,i=2166136261;for(let r=0;r<n.length;r++)i^=n.charCodeAt(r),i=Math.imul(i,16777619);return(i>>>0)%2===0?"A":"B"}var de=1e4,mt=[[/@import/i,"@import rules"],[/@charset/i,"@charset declarations"],[/expression\s*\(/i,"CSS expressions"],[/-moz-binding/i,"-moz-binding"],[/-webkit-binding/i,"-webkit-binding"],[/behavior\s*:/i,"behavior property"]],gt=/^(https:|\/[^/]|\.\/|\.\.\/|#)/;function J(e){if(e.length>de)return{ok:!1,error:`CSS exceeds ${de.toLocaleString("en-US")} character limit`};let t=e.replace(/\/\*[\s\S]*?\*\//g,"");try{t=t.replace(/\\([0-9a-fA-F]{1,6})[ \t\n\f]?/g,(r,a)=>{let o=parseInt(a,16);return o<0||o>1114111?"\uFFFD":String.fromCodePoint(o)}),t=t.replace(/\\\r?\n/g,""),t=t.replace(/\\([^\n\r\f0-9a-fA-F])/g,"$1")}catch{return{ok:!1,error:"CSS contains invalid unicode escape sequences"}}t=t.replace(/</g,"").replace(/>/g,"");for(let[r,a]of mt)if(r.test(t))return{ok:!1,error:`CSS contains blocked pattern: ${a}`};let n=/url\s*\(\s*([\s\S]*?)\s*\)/gi,i;for(;(i=n.exec(t))!==null;){let r=i[1].trim();if((r.startsWith("'")||r.startsWith('"'))&&(r=r.slice(1)),(r.endsWith("'")||r.endsWith('"'))&&(r=r.slice(0,-1)),r=r.trim(),r&&!gt.test(r))return{ok:!1,error:"CSS url() values must use https:// or relative paths"}}return{ok:!0,css:t}}var ft="lb-custom-css-";function _e(e,t){if(typeof document>"u"||!t)return!1;let n=J(t);if(!n.ok||!n.css.trim())return!1;let i=ft+vt(e),r=document.getElementById(i);return r||(r=document.createElement("style"),r.id=i,r.setAttribute("data-lime-bundles","custom-css"),document.head.appendChild(r)),r.textContent!==n.css&&(r.textContent=n.css),!0}function vt(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16)}function P(e){if(e==null)return 0;let t=typeof e=="string"?parseFloat(e):e;return Number.isFinite(t)?Math.round(t*100):0}function _(e,t){try{return new Intl.NumberFormat(void 0,{style:"currency",currency:t}).format(e/100)}catch{return`${t} ${(e/100).toFixed(2)}`}}function Be(e,t){return Math.max(0,e-Math.floor(e*t/100))}function Z(e,t=e.productQuantities,n=e.widgetConfig.pricing.showSaveBadge){let{discountType:i,discountValue:r}=e.discountConfig,a=[],o=0,d=0;for(let p of e.products){let f=p.variants.nodes.find(C=>C.availableForSale)??p.variants.nodes[0];if(!f)continue;let h=P(f.price.amount),m=t[p.id]??1,v=h*m,A=f.compareAtPrice?P(f.compareAtPrice.amount):null;if(a.push({unitCents:h,qty:m,lineCents:v,compareCents:A}),o+=v,i==="percentage"){let C=Be(h,r);d+=C*m}else d+=v}i==="fixed_amount"&&(d=Math.max(0,o-Math.round(r*100)));let l=Math.max(0,o-d),u=e.products[0]?.priceRange.minVariantPrice.currencyCode??"USD",c="";return n&&l>0&&(i==="percentage"&&r>0?c=`-${Math.round(r)}%`:i==="fixed_amount"&&r>0&&(c=`-${_(Math.round(r*100),u)}`)),{rows:a,totalCents:o,saleCents:d,savingsCents:l,headerBadge:c,currency:u}}function Q(e,t){if(t.discountType==="percentage"){let n=Math.floor(e*t.discountValue/100);return Math.max(0,e-n)}return Math.max(0,e-Math.round(t.discountValue*100))}var L=152;function O(e,t={}){if(!e)return"";try{let n=new URL(e);return t.width!==void 0&&n.searchParams.set("width",String(t.width)),t.height!==void 0&&n.searchParams.set("height",String(t.height)),t.crop&&n.searchParams.set("crop",t.crop),n.toString()}catch{return e}}function ke(e){if(!Number.isFinite(e)||e<=0)return"";let t=Math.floor(e/1e3),n=Math.floor(t/86400),i=Math.floor(t%86400/3600),r=Math.floor(t%3600/60),a=t%60,o=d=>String(d).padStart(2,"0");return n>0?`${n}d ${o(i)}h ${o(r)}m ${o(a)}s`:`${o(i)}h ${o(r)}m ${o(a)}s`}function H(e){let t=xt(e);if(t===null||t<=Date.now())return null;let n=t,i=document.createElement("div");i.className="lb-bundle-countdown",i.setAttribute("data-countdown","");let r=document.createElement("div");r.className="lb-bundle-countdown__label";let a=document.createElement("span");a.textContent="Ends in",r.appendChild(a),i.appendChild(r);let o=document.createElement("span");o.className="lb-bundle-countdown__timer",o.setAttribute("data-countdown-timer",""),i.appendChild(o);let d=null;function l(){let c=n-Date.now();if(c<=0){i.style.display="none",u();return}o.textContent=ke(c)}function u(){d!==null&&(clearInterval(d),d=null)}return l(),d=setInterval(l,1e3),{el:i,stop:u}}function xt(e){let t=Date.parse(e);return Number.isFinite(t)?t:null}function $(e){let t=document.createElement("button");t.type="button",t.className="lb-bundle-cta",t.setAttribute("data-add-bundle","");let n=document.createElement("span");n.className="lb-cta-label",n.setAttribute("data-cta-label",""),n.textContent=e,t.appendChild(n);let i=document.createElement("span");return i.className="lb-cta-spinner",i.setAttribute("data-cta-spinner",""),i.setAttribute("aria-hidden","true"),i.innerHTML='<svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><path d="M12 2a10 10 0 0 1 10 10" /></svg>',t.appendChild(i),t}function ee(e,t){let n=e.querySelector("[data-cta-label]");n&&(n.textContent=t)}function s(e,t,n={}){let i=document.createElement(e);t&&(i.className=t);for(let[r,a]of Object.entries(n))i.setAttribute(r,a);return i}var Ct=`
|
|
214
|
+
`,V=class extends Error{constructor(e,t){super(e),this.reason=t,this.name="BundleParseError"}},D={header:{textColor:"#FFFFFF",headerStyle:"gradient",gradientStart:"#C62828",gradientEnd:"#AD1457",saveBadgeBgColor:"#FFFFFF",saveBadgeTextColor:"#AD1457",saveBadgeBorderColor:"#FFFFFF",saveBadgeBorderWidth:0,saveBadgeBorderRadius:8,countdownBgColor:"#FFF0F3",countdownTextColor:"#C62828"},layout:{backgroundColor:"#FFFFFF",borderColor:"#E5E5E5",borderWidth:1,borderRadius:12},productList:{textColor:"#1A1A1A",imageBorderWidth:0,imageBorderColor:"#E5E5E5",imageBorderRadius:8,variantBorderWidth:1,variantBorderColor:"#E5E5E5",variantBorderRadius:8,showPrice:!0,showCompareAtPrice:!0,showCountBubble:!0,countBubbleBgColor:"#1A1A1A",countBubbleTextColor:"#FFFFFF"},pricing:{showSaveBadge:!0,showComparePrice:!0,showPerUnitPrice:!0,showItemCount:!0,showCompareAtPrice:!0},cta:{ctaText:"Add to cart",primaryColor:"#1A1A1A",buttonTextColor:"#FFFFFF",borderWidth:0,borderColor:"#1A1A1A",borderRadius:12},savingsBar:{visible:!0,bgColor:"#EDFBF1",textColor:"#2DB554",borderWidth:0,borderColor:"#2DB554",borderRadius:8},countdown:{showCountdown:!0},popularBadge:{visible:!0,text:"Most Popular",bgColor:"#1A1A1A",textColor:"#FFFFFF",borderWidth:0,borderColor:"#1A1A1A",borderRadius:12},outOfStockBehavior:"show_greyed_out",showSearch:!0,pickerBgColor:"#FFFFFF",pickerTextColor:"#1A1A1A",pickerBorderWidth:0,pickerBorderColor:"#E5E5E5",pickerBorderRadius:16,pickerSearchBorderWidth:1,pickerSearchBorderColor:"#E5E5E5",pickerSearchBorderRadius:8,pickerProductBorderWidth:0,pickerProductBorderColor:"#E5E5E5",pickerProductBorderRadius:8,pickerShowCountBubble:!0,pickerCountBubbleBgColor:"#1A1A1A",pickerCountBubbleTextColor:"#FFFFFF",pickerAddBgColor:"#1A1A1A",pickerAddLabelColor:"#FFFFFF",pickerAddBorderWidth:0,pickerAddBorderColor:"#1A1A1A",pickerAddBorderRadius:8,pickerVariantBorderWidth:1,pickerVariantBorderColor:"#1A1A1A",pickerVariantBorderRadius:8,tierBorderColor:"#E5E5E5",tierBorderWidth:1,tierBorderRadius:12,tierSelectedBorderColor:"#1A1A1A",tierSelectedBorderWidth:2,defaultTier:"first"};function Ye(e){if(!e||typeof e!="object")return D;let t=e;return{...D,...t,defaultTier:Xe(t.defaultTier),header:{...D.header,...t.header??{}},layout:{...D.layout,...t.layout??{}},productList:{...D.productList,...t.productList??{}},pricing:{...D.pricing,...t.pricing??{}},cta:{...D.cta,...t.cta??{}},savingsBar:{...D.savingsBar,...t.savingsBar??{}},countdown:{...D.countdown,...t.countdown??{}},popularBadge:{...D.popularBadge,...t.popularBadge??{}}}}function Xe(e){return e==="first"||e==="best_value"||typeof e=="number"&&Number.isInteger(e)&&e>=0?e:D.defaultTier}function Je(e){return{primaryColor:e.cta.primaryColor,backgroundColor:e.layout.backgroundColor,textColor:e.productList.textColor,borderColor:e.layout.borderColor,borderWidth:e.layout.borderWidth,buttonTextColor:e.cta.buttonTextColor,ctaBorderWidth:e.cta.borderWidth,ctaBorderColor:e.cta.borderColor,ctaBorderRadius:e.cta.borderRadius,savingsBarBgColor:e.savingsBar.bgColor,savingsBarTextColor:e.savingsBar.textColor,savingsBarBorderWidth:e.savingsBar.borderWidth,savingsBarBorderColor:e.savingsBar.borderColor,savingsBarBorderRadius:e.savingsBar.borderRadius,borderRadius:e.layout.borderRadius,headerTextColor:e.header.textColor,saveBadgeBgColor:e.header.saveBadgeBgColor,saveBadgeTextColor:e.header.saveBadgeTextColor,saveBadgeBorderColor:e.header.saveBadgeBorderColor,saveBadgeBorderWidth:e.header.saveBadgeBorderWidth,saveBadgeBorderRadius:e.header.saveBadgeBorderRadius,countdownBgColor:e.header.countdownBgColor,countdownTextColor:e.header.countdownTextColor,headerStyle:e.header.headerStyle,headerGradientStart:e.header.gradientStart,headerGradientEnd:e.header.gradientEnd,showSaveBadge:e.pricing.showSaveBadge,imageBorderWidth:e.productList.imageBorderWidth,imageBorderColor:e.productList.imageBorderColor,imageBorderRadius:e.productList.imageBorderRadius,variantBorderWidth:e.productList.variantBorderWidth,variantBorderColor:e.productList.variantBorderColor,variantBorderRadius:e.productList.variantBorderRadius,countBubbleBgColor:e.productList.countBubbleBgColor,countBubbleTextColor:e.productList.countBubbleTextColor,showProductPrice:e.productList.showPrice,showProductCompareAtPrice:e.productList.showCompareAtPrice,showCountBubble:e.productList.showCountBubble,showCountdown:e.countdown.showCountdown,ctaText:e.cta.ctaText,outOfStockBehavior:e.outOfStockBehavior,showComparePrice:e.pricing.showComparePrice,showPerUnitPrice:e.pricing.showPerUnitPrice,showItemCount:e.pricing.showItemCount,showCompareAtPrice:e.pricing.showCompareAtPrice,showMostPopular:e.popularBadge.visible,popularBadgeText:e.popularBadge.text,popularBadgeBgColor:e.popularBadge.bgColor,popularBadgeTextColor:e.popularBadge.textColor,popularBadgeBorderWidth:e.popularBadge.borderWidth,popularBadgeBorderColor:e.popularBadge.borderColor,popularBadgeBorderRadius:e.popularBadge.borderRadius,showSearch:e.showSearch,pickerBgColor:e.pickerBgColor,pickerTextColor:e.pickerTextColor,pickerBorderWidth:e.pickerBorderWidth,pickerBorderColor:e.pickerBorderColor,pickerBorderRadius:e.pickerBorderRadius,pickerSearchBorderWidth:e.pickerSearchBorderWidth,pickerSearchBorderColor:e.pickerSearchBorderColor,pickerSearchBorderRadius:e.pickerSearchBorderRadius,pickerProductBorderWidth:e.pickerProductBorderWidth,pickerProductBorderColor:e.pickerProductBorderColor,pickerProductBorderRadius:e.pickerProductBorderRadius,pickerShowCountBubble:e.pickerShowCountBubble,pickerCountBubbleBgColor:e.pickerCountBubbleBgColor,pickerCountBubbleTextColor:e.pickerCountBubbleTextColor,pickerAddBgColor:e.pickerAddBgColor,pickerAddLabelColor:e.pickerAddLabelColor,pickerAddBorderWidth:e.pickerAddBorderWidth,pickerAddBorderColor:e.pickerAddBorderColor,pickerAddBorderRadius:e.pickerAddBorderRadius,pickerVariantBorderWidth:e.pickerVariantBorderWidth,pickerVariantBorderColor:e.pickerVariantBorderColor,pickerVariantBorderRadius:e.pickerVariantBorderRadius,tierBorderColor:e.tierBorderColor,tierBorderWidth:e.tierBorderWidth,tierBorderRadius:e.tierBorderRadius,tierSelectedBorderColor:e.tierSelectedBorderColor,tierSelectedBorderWidth:e.tierSelectedBorderWidth,defaultTier:e.defaultTier,...e.popularBadge.tierIndex!==void 0&&{mostPopularTierIndex:e.popularBadge.tierIndex}}}var Ze={primaryColor:"--lb-primary-color",backgroundColor:"--lb-bg",textColor:"--lb-text",imageBorderWidth:"--lb-image-border-width",imageBorderColor:"--lb-image-border-color",imageBorderRadius:"--lb-image-border-radius",variantBorderWidth:"--lb-variant-border-width",variantBorderColor:"--lb-variant-border-color",variantBorderRadius:"--lb-variant-radius",countBubbleBgColor:"--lb-qty-badge-bg",countBubbleTextColor:"--lb-qty-badge-color",borderColor:"--lb-border",borderWidth:"--lb-border-width",buttonTextColor:"--lb-btn-text",borderRadius:"--lb-radius",headerTextColor:"--lb-header-text",saveBadgeBgColor:"--lb-save-badge-bg",saveBadgeTextColor:"--lb-save-badge-text",saveBadgeBorderColor:"--lb-save-badge-border-color",saveBadgeBorderWidth:"--lb-save-badge-border-width",saveBadgeBorderRadius:"--lb-save-badge-radius",countdownBgColor:"--lb-countdown-bg",countdownTextColor:"--lb-countdown-text",ctaBorderWidth:"--lb-cta-border-width",ctaBorderColor:"--lb-cta-border-color",ctaBorderRadius:"--lb-cta-radius",savingsBarBgColor:"--lb-savings-bar-bg",savingsBarTextColor:"--lb-savings-bar-text",savingsBarBorderWidth:"--lb-savings-bar-border-width",savingsBarBorderColor:"--lb-savings-bar-border-color",savingsBarBorderRadius:"--lb-savings-bar-radius",tierBorderColor:"--lb-tier-border-color",tierBorderWidth:"--lb-tier-border-width",tierBorderRadius:"--lb-tier-radius",tierSelectedBorderColor:"--lb-tier-selected-border-color",tierSelectedBorderWidth:"--lb-tier-selected-border-width",popularBadgeBgColor:"--lb-popular-badge-bg",popularBadgeTextColor:"--lb-popular-badge-text",popularBadgeBorderWidth:"--lb-popular-badge-border-width",popularBadgeBorderColor:"--lb-popular-badge-border-color",popularBadgeBorderRadius:"--lb-popular-badge-radius",headerGradientStart:"--lb-header-start",headerGradientEnd:"--lb-header-end",pickerBgColor:"--lb-picker-bg",pickerTextColor:"--lb-picker-text",pickerBorderWidth:"--lb-picker-border-width",pickerBorderColor:"--lb-picker-border-color",pickerBorderRadius:"--lb-picker-radius",pickerSearchBorderWidth:"--lb-picker-search-border-width",pickerSearchBorderColor:"--lb-picker-search-border-color",pickerSearchBorderRadius:"--lb-picker-search-radius",pickerProductBorderWidth:"--lb-picker-product-border-width",pickerProductBorderColor:"--lb-picker-product-border-color",pickerProductBorderRadius:"--lb-picker-product-radius",pickerCountBubbleBgColor:"--lb-picker-qty-badge-bg",pickerCountBubbleTextColor:"--lb-picker-qty-badge-color",pickerAddBgColor:"--lb-picker-add-bg",pickerAddLabelColor:"--lb-picker-add-label",pickerAddBorderWidth:"--lb-picker-add-border-width",pickerAddBorderColor:"--lb-picker-add-border-color",pickerAddBorderRadius:"--lb-picker-add-radius",pickerVariantBorderWidth:"--lb-picker-variant-border-width",pickerVariantBorderColor:"--lb-picker-variant-border-color",pickerVariantBorderRadius:"--lb-picker-variant-radius"},et=new Set(["borderRadius","borderWidth","saveBadgeBorderWidth","saveBadgeBorderRadius","tierBorderWidth","tierBorderRadius","tierSelectedBorderWidth","savingsBarBorderWidth","savingsBarBorderRadius","ctaBorderWidth","ctaBorderRadius","popularBadgeBorderWidth","popularBadgeBorderRadius","imageBorderWidth","imageBorderRadius","variantBorderWidth","variantBorderRadius","pickerBorderWidth","pickerBorderRadius","pickerSearchBorderWidth","pickerSearchBorderRadius","pickerProductBorderWidth","pickerProductBorderRadius","pickerAddBorderWidth","pickerAddBorderRadius","pickerVariantBorderWidth","pickerVariantBorderRadius"]);function fe(e,t){let r=Je(t);for(let[i,n]of Object.entries(Ze)){let a=r[i];if(a==null)continue;let o=et.has(i)?`${a}px`:String(a);e.style.setProperty(n,o)}e.style.setProperty("--lb-product-price-display",t.productList.showPrice?"block":"none"),e.style.setProperty("--lb-product-compare-display",t.productList.showCompareAtPrice?"inline":"none"),e.style.setProperty("--lb-qty-badge-display",t.productList.showCountBubble?"flex":"none"),e.style.setProperty("--lb-picker-qty-badge-display",t.pickerShowCountBubble?"flex":"none"),t.header.headerStyle==="solid"?e.style.setProperty("--lb-header-bg",t.header.gradientStart):e.style.setProperty("--lb-header-bg",`linear-gradient(135deg, ${t.header.gradientStart}, ${t.header.gradientEnd})`)}var tt=new Set(["fixed","mix_match","volume"]),rt=new Set(["active"]);function J(e,t){try{return nt(e,t)}catch(r){if(r instanceof V)return null;throw r}}function nt(e,t){let r=new Map(t.map(f=>[f.key,f])),i=r.get("title")?.value??"Bundle",n=r.get("bundle_type")?.value,a=r.get("status")?.value;if(!n||!tt.has(n))throw new V(`Invalid or missing bundle_type: ${n??"null"}`,"invalid_type");let o=n;if(!a||!rt.has(a))throw new V(`Bundle is not active: status=${a??"null"}`,"inactive");let d=a,l=r.get("starts_at")?.value??null,u=r.get("ends_at")?.value??null,c=new Date;if(l){let f=new Date(l);if(Number.isNaN(f.getTime()))throw new V(`Invalid starts_at: ${l}`,"invalid_type");if(f>c)throw new V(`Bundle not yet started: starts_at=${l}`,"not_started")}if(u){let f=new Date(u);if(Number.isNaN(f.getTime()))throw new V(`Invalid ends_at: ${u}`,"invalid_type");if(f<c)throw new V(`Bundle has expired: ends_at=${u}`,"expired")}let p=it(r),m=ot(r),C=at(r),b={id:e,title:i,description:r.get("description")?.value||null,status:d,products:p,discountConfig:m,widgetConfig:C,startsAt:l,endsAt:u,discountLabel:r.get("discount_label")?.value??null,selectedVariantIds:lt(r),productQuantities:le(r,"product_quantities"),variantQuantities:le(r,"variant_quantities"),abTestId:r.get("ab_test_id")?.value??null,abVariantB:dt(r)};switch(o){case"fixed":return{...b,bundleType:"fixed"};case"volume":return{...b,bundleType:"volume",volumeTiers:st(r)};case"mix_match":return{...b,bundleType:"mix_match",minQuantity:de(r,"min_quantity",{min:1}),maxQuantity:de(r,"max_quantity",{min:1})}}}function it(e){let t=[],r=e.get("products");if(r?.reference&&"variants"in r.reference&&t.push(r.reference),r?.references?.nodes)for(let n of r.references.nodes)"variants"in n?t.push(n):"products"in n&&n.products?.nodes&&t.push(...n.products.nodes);let i=e.get("collection");if(i?.references?.nodes)for(let n of i.references.nodes)"products"in n&&n.products?.nodes&&t.push(...n.products.nodes);return t}function ot(e){return{discountType:e.get("discount_type")?.value??"percentage",discountValue:parseFloat(e.get("discount_value")?.value??"0"),allowStacking:e.get("allow_stacking")?.value==="true"}}function at(e){return Ye(z(e,"widget_config"))}function lt(e){let t=z(e,"selected_variant_ids");if(!Array.isArray(t))return null;let r=[];for(let i of t)Array.isArray(i)?r.push(i.filter(n=>typeof n=="string")):r.push([]);return r}function le(e,t){let r=z(e,t);if(!r||typeof r!="object"||Array.isArray(r))return{};let i={};for(let[n,a]of Object.entries(r)){let o=typeof a=="number"?a:Number(a);Number.isFinite(o)&&o>=0&&o<=99&&(i[n]=Math.floor(o))}return i}function dt(e){if(!e.get("ab_test_id")?.value)return null;let r={},i=e.get("ab_title")?.value;i&&(r.title=i);let n=e.get("ab_description")?.value;n&&(r.description=n);let a=e.get("ab_discount_type")?.value,o=e.get("ab_discount_value")?.value;if(a&&(a==="percentage"||a==="fixed_amount")&&o){let l=parseFloat(o);Number.isFinite(l)&&(r.discountConfig={discountType:a,discountValue:l,allowStacking:e.get("allow_stacking")?.value==="true"})}let d=z(e,"ab_volume_tiers");return Array.isArray(d)&&(r.volumeTiers=d.filter(l=>typeof l=="object"&&l!==null).map(ve)),Object.keys(r).length===0?null:r}function st(e){let t=z(e,"volume_tiers");return Array.isArray(t)?t.filter(r=>typeof r=="object"&&r!==null).map(ve):[]}function ve(e){let t=Number(e.minQuantity??0),r={minQuantity:Number.isFinite(t)&&t>=0?t:0};return typeof e.percentage=="number"&&Number.isFinite(e.percentage)&&(r.percentage=e.percentage),typeof e.amount=="number"&&Number.isFinite(e.amount)&&(r.amount=e.amount),r}function z(e,t){let r=e.get(t)?.value;if(!r)return null;try{return JSON.parse(r)}catch{return null}}function de(e,t,r={}){let i=e.get(t)?.value;if(!i)return null;let n=parseInt(i,10);return isNaN(n)||r.min!==void 0&&n<r.min?null:n}function Z(e,t,r){let i=e.variantQuantities[r];return i!==void 0?i:e.productQuantities[t]??1}function xe(e){let t=e.abVariantB;if(!t)return e;let r=t.title??e.title,i=t.description!==void 0?t.description:e.description,n=t.discountConfig??e.discountConfig;switch(e.bundleType){case"volume":return{...e,title:r,description:i,discountConfig:n,volumeTiers:t.volumeTiers??e.volumeTiers};case"mix_match":return{...e,title:r,description:i,discountConfig:n};case"fixed":return{...e,title:r,description:i,discountConfig:n}}}async function Ce(e,t){await _e(e,{shopDomain:e.shopDomain,eventType:"bundle_impression",bundleGid:t.bundleGid,bundleType:t.bundleType,productId:t.productId,abTestId:t.abTestId,abVariant:t.abVariant,occurredAt:new Date().toISOString()})}async function ye(e,t){await _e(e,{shopDomain:e.shopDomain,eventType:"bundle_add_to_cart",...t,occurredAt:new Date().toISOString()})}function we(e,t){if(typeof IntersectionObserver>"u")return t(),()=>{};let r=new IntersectionObserver(i=>{for(let n of i)n.isIntersecting&&(t(),r.unobserve(n.target))},{threshold:.5});return r.observe(e),()=>r.disconnect()}async function _e(e,t){let r=`${e.appUrl}/api/analytics`,i=JSON.stringify(t);try{(await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:i})).ok||(await new Promise(a=>setTimeout(a,2e3)),await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:i}))}catch{try{typeof navigator<"u"&&navigator.sendBeacon&&navigator.sendBeacon(r,i)}catch{}}}var ct=!1;function ut(){if(ct)return!0;if(typeof window>"u")return!1;let e=window.Shopify;try{return e?.customerPrivacy?.analyticsProcessingAllowed?.()===!0}catch{return!1}}var se="lb_session",pt=720*60*60,bt=720*60*60;function Be(e){return`__Host-_lb_ab_${e}`}async function ke(e,t,r,i){if(typeof document>"u")return null;let n=ht(i);if(n&&n.testId===r)return{variant:n.variant,testId:r,persisted:!0};if(!ut())return{variant:"A",testId:r,persisted:!1};let a=gt(),o=ft(a,r);mt(i,r,o);try{fetch(`${e}/api/ab-assign`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({shopDomain:t,testId:r,sessionId:a,variant:o})}).catch(()=>{})}catch{}return{variant:o,testId:r,persisted:!0}}function ht(e){if(typeof document>"u")return null;let r=`${Be(e)}=`,n=document.cookie.split(";").map(l=>l.trim()).find(l=>l.startsWith(r));if(!n)return null;let a=n.substring(r.length),[o,d]=a.split("|");return o!=="A"&&o!=="B"||!d?null:{testId:d,variant:o}}function mt(e,t,r){if(typeof document>"u")return;let i=Be(e),n=`${r}|${t}|${Date.now()}`;document.cookie=`${i}=${n}; Path=/; Max-Age=${bt}; SameSite=Lax; Secure`}function gt(){if(typeof document>"u")return ce();let t=document.cookie.split(";").map(i=>i.trim()).find(i=>i.startsWith(`${se}=`))?.split("=")[1];if(t)return t;let r=ce();return document.cookie=`${se}=${r}; path=/; max-age=${pt}; SameSite=Lax; Secure`,r}function ce(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}function ft(e,t){let r=e+":"+t,i=2166136261;for(let n=0;n<r.length;n++)i^=r.charCodeAt(n),i=Math.imul(i,16777619);return(i>>>0)%2===0?"A":"B"}var ue=1e4,vt=[[/@import/i,"@import rules"],[/@charset/i,"@charset declarations"],[/expression\s*\(/i,"CSS expressions"],[/-moz-binding/i,"-moz-binding"],[/-webkit-binding/i,"-webkit-binding"],[/behavior\s*:/i,"behavior property"]],xt=/^(https:|\/[^/]|\.\/|\.\.\/|#)/;function ee(e){if(e.length>ue)return{ok:!1,error:`CSS exceeds ${ue.toLocaleString("en-US")} character limit`};let t=e.replace(/\/\*[\s\S]*?\*\//g,"");try{t=t.replace(/\\([0-9a-fA-F]{1,6})[ \t\n\f]?/g,(n,a)=>{let o=parseInt(a,16);return o<0||o>1114111?"\uFFFD":String.fromCodePoint(o)}),t=t.replace(/\\\r?\n/g,""),t=t.replace(/\\([^\n\r\f0-9a-fA-F])/g,"$1")}catch{return{ok:!1,error:"CSS contains invalid unicode escape sequences"}}t=t.replace(/</g,"").replace(/>/g,"");for(let[n,a]of vt)if(n.test(t))return{ok:!1,error:`CSS contains blocked pattern: ${a}`};let r=/url\s*\(\s*([\s\S]*?)\s*\)/gi,i;for(;(i=r.exec(t))!==null;){let n=i[1].trim();if((n.startsWith("'")||n.startsWith('"'))&&(n=n.slice(1)),(n.endsWith("'")||n.endsWith('"'))&&(n=n.slice(0,-1)),n=n.trim(),n&&!xt.test(n))return{ok:!1,error:"CSS url() values must use https:// or relative paths"}}return{ok:!0,css:t}}var Ct="lb-custom-css-";function Se(e,t){if(typeof document>"u"||!t)return!1;let r=ee(t);if(!r.ok||!r.css.trim())return!1;let i=Ct+yt(e),n=document.getElementById(i);return n||(n=document.createElement("style"),n.id=i,n.setAttribute("data-lime-bundles","custom-css"),document.head.appendChild(n)),n.textContent!==r.css&&(n.textContent=r.css),!0}function yt(e){let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=Math.imul(t,16777619);return(t>>>0).toString(16)}function wt(e,t){let r=typeof e=="string"?parseFloat(e):e;try{return new Intl.NumberFormat(void 0,{style:"currency",currency:t}).format(r)}catch{return`${t} ${r.toFixed(2)}`}}var _t={CL:"cl",CM:"cm",FLOZ:"fl oz",FT:"ft",FT2:"ft\xB2",G:"g",GAL:"gal",IN:"in",ITEM:"each",KG:"kg",L:"l",LB:"lb",M:"m",M2:"m\xB2",M3:"m\xB3",MG:"mg",ML:"ml",MM:"mm",OZ:"oz",PT:"pt",QT:"qt",UNKNOWN:"",YD:"yd"};function j(e,t,r){if(!e||!t||t.referenceUnit==="UNKNOWN")return null;let i=parseFloat(e.amount);if(!Number.isFinite(i))return null;let n=_t[t.referenceUnit]??"";if(!n)return null;let a=e.currencyCode||r||"USD",o=wt(i,a),d=t.referenceValue,l=d===1?n:`${d}${n}`;return`${o}/${l}`}function P(e){if(e==null)return 0;let t=typeof e=="string"?parseFloat(e):e;return Number.isFinite(t)?Math.round(t*100):0}function B(e,t){try{return new Intl.NumberFormat(void 0,{style:"currency",currency:t}).format(e/100)}catch{return`${t} ${(e/100).toFixed(2)}`}}function Te(e,t){return Math.max(0,e-Math.floor(e*t/100))}function te(e,t=e.productQuantities,r=e.widgetConfig.pricing.showSaveBadge){let{discountType:i,discountValue:n}=e.discountConfig,a=[],o=0,d=0;for(let p of e.products){let m=p.variants.nodes.find(x=>x.availableForSale)??p.variants.nodes[0];if(!m)continue;let C=P(m.price.amount),b=t[p.id]??1,f=C*b,w=m.compareAtPrice?P(m.compareAtPrice.amount):null;if(a.push({unitCents:C,qty:b,lineCents:f,compareCents:w}),o+=f,i==="percentage"){let x=Te(C,n);d+=x*b}else d+=f}i==="fixed_amount"&&(d=Math.max(0,o-Math.round(n*100)));let l=Math.max(0,o-d),u=e.products[0]?.priceRange.minVariantPrice.currencyCode??"USD",c="";return r&&l>0&&(i==="percentage"&&n>0?c=`-${Math.round(n)}%`:i==="fixed_amount"&&n>0&&(c=`-${B(Math.round(n*100),u)}`)),{rows:a,totalCents:o,saleCents:d,savingsCents:l,headerBadge:c,currency:u}}function K(e,t){if(t.discountType==="percentage"){let r=Math.floor(e*t.discountValue/100);return Math.max(0,e-r)}return Math.max(0,e-Math.round(t.discountValue*100))}var L=152;function O(e,t={}){if(!e)return"";try{let r=new URL(e);return t.width!==void 0&&r.searchParams.set("width",String(t.width)),t.height!==void 0&&r.searchParams.set("height",String(t.height)),t.crop&&r.searchParams.set("crop",t.crop),r.toString()}catch{return e}}function Ae(e){if(!Number.isFinite(e)||e<=0)return"";let t=Math.floor(e/1e3),r=Math.floor(t/86400),i=Math.floor(t%86400/3600),n=Math.floor(t%3600/60),a=t%60,o=d=>String(d).padStart(2,"0");return r>0?`${r}d ${o(i)}h ${o(n)}m ${o(a)}s`:`${o(i)}h ${o(n)}m ${o(a)}s`}function H(e){let t=Bt(e);if(t===null||t<=Date.now())return null;let r=t,i=document.createElement("div");i.className="lb-bundle-countdown",i.setAttribute("data-countdown","");let n=document.createElement("div");n.className="lb-bundle-countdown__label";let a=document.createElement("span");a.textContent="Ends in",n.appendChild(a),i.appendChild(n);let o=document.createElement("span");o.className="lb-bundle-countdown__timer",o.setAttribute("data-countdown-timer",""),i.appendChild(o);let d=null;function l(){let c=r-Date.now();if(c<=0){i.style.display="none",u();return}o.textContent=Ae(c)}function u(){d!==null&&(clearInterval(d),d=null)}return l(),d=setInterval(l,1e3),{el:i,stop:u}}function Bt(e){let t=Date.parse(e);return Number.isFinite(t)?t:null}function $(e){let t=document.createElement("button");t.type="button",t.className="lb-bundle-cta",t.setAttribute("data-add-bundle","");let r=document.createElement("span");r.className="lb-cta-label",r.setAttribute("data-cta-label",""),r.textContent=e,t.appendChild(r);let i=document.createElement("span");return i.className="lb-cta-spinner",i.setAttribute("data-cta-spinner",""),i.setAttribute("aria-hidden","true"),i.innerHTML='<svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><path d="M12 2a10 10 0 0 1 10 10" /></svg>',t.appendChild(i),t}function re(e,t){let r=e.querySelector("[data-cta-label]");r&&(r.textContent=t)}function s(e,t,r={}){let i=document.createElement(e);t&&(i.className=t);for(let[n,a]of Object.entries(r))i.setAttribute(n,a);return i}var kt=`
|
|
203
215
|
<svg class="lb-bundle-placeholder-icon" viewBox="0 0 28 28" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
|
204
216
|
<rect x="4" y="4" width="20" height="20" rx="3"></rect>
|
|
205
217
|
<line x1="4" y1="20" x2="24" y2="20"></line>
|
|
206
218
|
<circle cx="10" cy="12" r="2"></circle>
|
|
207
|
-
</svg>`;function
|
|
219
|
+
</svg>`;function Ee(e,t,r,i){let n=t.widgetConfig,a=(x,S)=>Z(t,x,S),o=[],d=0;if(t.products.forEach((x,S)=>{let E=St(t,x,S);E.qty!==0&&(E.isOos&&(d++,n.outOfStockBehavior==="hide")||o.push(E))}),o.length===0)return;let l=t.products[0]?.priceRange.minVariantPrice.currencyCode??"USD",u=s("div","lb-fixed",{"data-discount-type":t.discountConfig.discountType,"data-discount-value":String(t.discountConfig.discountValue)}),c=Tt(t,l);if(u.appendChild(c.el),n.countdown.showCountdown&&t.endsAt){let x=H(t.endsAt);x&&(u.appendChild(x.el),i?.(x.stop))}let p=s("div","lb-fixed__products"),m=[];o.forEach(x=>{let S=Et(x,l,a,()=>{w()});m.push(S),p.appendChild(S.el)}),u.appendChild(p),u.appendChild(s("div","lb-bundle-divider"));let C=Pt(t);u.appendChild(C.el);let b=n.savingsBar.visible?Lt():null;b&&u.appendChild(b.el);let f=Mt(t,d,()=>{let x=o.filter(S=>S.selected).map(S=>({merchandiseId:S.selected.id,quantity:S.qty,attributes:[{key:"_lime_bundle_gid",value:t.id},{key:"_lime_bundle_type",value:t.bundleType}]}));x.length!==0&&r(x)});u.appendChild(f),u.appendChild(s("p","lb-bundle-error",{"data-error":"","aria-live":"polite"})),u.appendChild(s("span","lb-visually-hidden",{"data-status":"","aria-live":"polite"})),e.appendChild(u),w();function w(){let x=o.reduce((h,k)=>{if(!k.selected)return h;let y=P(k.selected.price.amount);return h+y*k.qty},0),S=Rt(x,t.discountConfig,o),E=Math.max(0,x-S);C.update({totalCents:x,saleCents:S,savingsCents:E,currency:l}),b&&b.update({savingsCents:E,currency:l}),c.refresh(At(t,x,S,l))}}function St(e,t,r){let i=e.selectedVariantIds?.[r]??null,n=t.variants.nodes.filter(u=>u.availableForSale),a=i&&i.length>0?n.filter(u=>i.includes(u.id)):n,o=a.length===0,d=a[0]??null,l=d?Z(e,t.id,d.id):1;return{product:t,eligibleVariants:a,selected:d,qty:l,isOos:o}}function Tt(e,t){let r=e.widgetConfig,i=s("div","lb-bundle-header"),n=s("div","lb-bundle-header__content"),a=s("h3","lb-bundle-title");if(a.textContent=e.title,n.appendChild(a),e.description){let l=s("p","lb-bundle-subtitle");l.textContent=e.description,n.appendChild(l)}i.appendChild(n);let o=s("span","lb-bundle-header__badge",{"data-header-badge":""});i.appendChild(o);let d=te(e,e.productQuantities,r.pricing.showSaveBadge);return d.headerBadge?o.textContent=d.headerBadge:o.style.display="none",{el:i,refresh(l){if(!r.pricing.showSaveBadge){o.style.display="none";return}l?(o.textContent=l,o.style.display=""):o.style.display="none"}}}function At(e,t,r,i){if(!e.widgetConfig.pricing.showSaveBadge)return"";let n=t-r;if(n<=0)return"";let a=e.discountConfig;return a.discountType==="percentage"&&a.discountValue>0?`-${Math.round(a.discountValue)}%`:a.discountType==="fixed_amount"&&a.discountValue>0?`-${B(Math.round(a.discountValue*100),i)}`:`-${B(n,i)}`}function Et(e,t,r,i){let n=s("div",e.isOos?"lb-bundle-product-row lb-bundle-product-row--oos":"lb-bundle-product-row",{"data-product-id":e.product.id.replace(/^.*\//,""),...e.isOos?{"aria-disabled":"true"}:{}}),a=s("div","lb-bundle-thumbnail",{"data-thumbnail":""});if(e.product.featuredImage){let u=document.createElement("img");u.src=O(e.product.featuredImage.url,{width:L,height:L,crop:"center"}),u.alt=e.product.featuredImage.altText??e.product.title,u.width=L,u.height=L,u.loading="lazy",a.appendChild(u)}else a.insertAdjacentHTML("beforeend",kt);let o=null;e.isOos||(o=s("span","lb-bundle-qty-badge",{"data-qty-badge":""}),o.textContent=String(e.qty),a.appendChild(o)),n.appendChild(a);let d=s("div","lb-bundle-product-info"),l=document.createElement("a");if(l.className="lb-bundle-product-name",l.href=`/products/${e.product.handle}`,l.textContent=e.product.title,d.appendChild(l),e.isOos){let u=s("span","lb-bundle-oos-label");u.textContent="Out of stock",d.appendChild(u)}else if(e.selected){let u=s("span","lb-bundle-product-prices"),c=s("span","lb-bundle-product-compare-price",{"data-product-compare-price":""}),p=s("span","lb-bundle-product-price",{"data-product-price":""});u.appendChild(c),u.appendChild(p),d.appendChild(u);let m=s("span","lb-bundle-product-unit-price",{"data-product-unit-price":""});m.setAttribute("hidden",""),d.appendChild(m);let C=b=>{let f=P(b.price.amount);if(p.textContent=B(f,t),b.compareAtPrice){let x=P(b.compareAtPrice.amount);x>f?(c.textContent=B(x,t),c.removeAttribute("hidden")):c.setAttribute("hidden","")}else c.setAttribute("hidden","");let w=j(b.unitPrice,b.unitPriceMeasurement,t);w?(m.textContent=w,m.removeAttribute("hidden")):m.setAttribute("hidden","")};if(C(e.selected),e.eligibleVariants.length>1){let b=document.createElement("select");b.className="lb-bundle-variant-select",b.setAttribute("data-variant-select",""),b.setAttribute("aria-label",`Select variant for ${e.product.title}`),e.eligibleVariants.forEach(f=>{let w=document.createElement("option");w.value=f.id,w.textContent=f.title,f.id===e.selected?.id&&(w.selected=!0),b.appendChild(w)}),b.addEventListener("change",()=>{let f=e.eligibleVariants.find(w=>w.id===b.value);f&&(e.selected=f,e.qty=r(e.product.id,f.id),o&&(o.textContent=String(e.qty)),C(f),i())}),d.appendChild(b)}else if(e.eligibleVariants.length===1&&e.product.variants.nodes.length>1){let b=s("span","lb-bundle-variant-badge");b.textContent=e.eligibleVariants[0].title,d.appendChild(b)}}return n.appendChild(d),{el:n,state:e}}function Pt(e){let t=s("div","lb-bundle-pricing"),r=s("span","lb-bundle-pricing__label");r.textContent="Bundle price",t.appendChild(r);let i=s("span","lb-bundle-pricing__prices"),n=s("span","lb-bundle-compare-price",{"data-compare-price":""});n.style.display="none",i.appendChild(n);let a=s("span","lb-bundle-sale-price",{"data-sale-price":""});return i.appendChild(a),t.appendChild(i),{el:t,update({totalCents:o,saleCents:d,savingsCents:l,currency:u}){a.textContent=B(d,u),e.widgetConfig.pricing.showCompareAtPrice&&l>0?(n.textContent=B(o,u),n.style.display=""):n.style.display="none"}}}function Lt(){let e=s("div","lb-bundle-savings-bar",{"data-savings-bar":""}),t=document.createElement("span");t.textContent="You save",e.appendChild(t);let r=s("span","",{"data-savings-amount":""});return e.appendChild(r),{el:e,update({savingsCents:i,currency:n}){if(i<=0){e.style.display="none";return}e.style.display="",r.textContent=B(i,n)}}}function Mt(e,t,r){let i=t>0?`${t} item${t===1?"":"s"} out of stock`:e.widgetConfig.cta.ctaText||"Add to cart",n=$(i);return t>0?n.disabled=!0:n.addEventListener("click",()=>{n.disabled||r()}),n}function Rt(e,t,r){if(t.discountType==="percentage"){let i=0;for(let n of r){if(!n.selected)continue;let a=P(n.selected.price.amount),o=Math.floor(a*t.discountValue/100),d=Math.max(0,a-o);i+=d*n.qty}return i}return Math.max(0,e-Math.round(t.discountValue*100))}var Le=`
|
|
208
220
|
<svg class="lb-bundle-placeholder-icon" viewBox="0 0 28 28" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
|
209
221
|
<rect x="4" y="4" width="20" height="20" rx="3"></rect>
|
|
210
222
|
<line x1="4" y1="20" x2="24" y2="20"></line>
|
|
211
223
|
<circle cx="10" cy="12" r="2"></circle>
|
|
212
|
-
</svg>`,
|
|
224
|
+
</svg>`,Me=`
|
|
213
225
|
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
214
226
|
<line x1="9" y1="3" x2="9" y2="15" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
|
|
215
227
|
<line x1="3" y1="9" x2="15" y2="9" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
|
|
216
|
-
</svg>`,
|
|
228
|
+
</svg>`,ne=`
|
|
217
229
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
218
230
|
<line x1="5" y1="5" x2="15" y2="15" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
|
|
219
231
|
<line x1="15" y1="5" x2="5" y2="15" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
|
|
220
|
-
</svg>`,
|
|
232
|
+
</svg>`,It=`
|
|
221
233
|
<svg width="16" height="16" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
222
234
|
<path d="M14.348 5.652a.5.5 0 0 0-.707 0L10 9.293 6.36 5.652a.5.5 0 1 0-.708.707L9.293 10l-3.641 3.641a.5.5 0 0 0 .708.707L10 10.707l3.641 3.641a.5.5 0 0 0 .707-.707L10.707 10l3.641-3.641a.5.5 0 0 0 0-.707z"/>
|
|
223
|
-
</svg>`;function Pe(e,t,n,i){let r=t.widgetConfig,a=t.products[0]?.priceRange.minVariantPrice.currencyCode??"USD",o=t.minQuantity??1,d=t.maxQuantity??o,l=Vt(t,r.outOfStockBehavior);if(l.filter(x=>!x.isOos).length<o)return;let c=[],p=s("div","lb-mix-match",{"data-required-quantity":String(o),"data-max-quantity":String(d)}),f=Pt(t);if(p.appendChild(f),r.countdown.showCountdown&&t.endsAt){let x=H(t.endsAt);x&&(p.appendChild(x.el),i?.(x.stop))}let h=Lt(o);p.appendChild(h.el);let m=s("div","lb-mix-match__slots",{"data-selection-slots":""});p.appendChild(m),p.appendChild(s("div","lb-bundle-divider"));let v=It(r.pricing.showCompareAtPrice);p.appendChild(v.el);let A=r.savingsBar.visible?Ft():null;A&&p.appendChild(A.el);let C=s("div","lb-mix-match__price-placeholder",{"data-price-placeholder":""}),k=s("span","lb-mix-match__price-placeholder-text");k.textContent=`Select ${o} items to see price`,C.appendChild(k),p.appendChild(C);let S=Dt(t,l,a,{showSearch:r.showSearch,onAdd:(x,w)=>T(x,w),onRemove:(x,w)=>M(x,w),countFor:(x,w)=>c.filter(F=>F.productId===x&&F.variantId===w).length,isOverMax:()=>c.length>=d});p.appendChild(S.el);let b=$(`Select ${o} items to unlock`);b.disabled=!0,b.addEventListener("click",()=>{if(b.disabled)return;let x=c.map(w=>({merchandiseId:w.variantId,quantity:1,attributes:[{key:"_lime_bundle_gid",value:t.id},{key:"_lime_bundle_type",value:t.bundleType}]}));n(x)}),p.appendChild(b),p.appendChild(s("p","lb-bundle-error",{"data-error":"","aria-live":"polite"})),p.appendChild(s("span","lb-visually-hidden",{"data-status":"","aria-live":"polite"})),e.appendChild(p);let B=l.find(x=>!x.isOos),y=B?.firstAvailableVariant??B?.variants[0];B&&y&&c.push({productId:B.product.id,productTitle:B.product.title,variantId:y.id,variantTitle:y.title,imageUrl:B.product.featuredImage?.url??null,priceCents:P(y.price.amount),compareCents:y.compareAtPrice?P(y.compareAtPrice.amount):null}),g();function T(x,w){c.length>=d||(c.push({productId:x.id,productTitle:x.title,variantId:w.id,variantTitle:w.title,imageUrl:x.featuredImage?.url??null,priceCents:P(w.price.amount),compareCents:w.compareAtPrice?P(w.compareAtPrice.amount):null}),g())}function M(x,w){let F=c.findIndex(q=>q.productId===x&&q.variantId===w);F!==-1&&(c.splice(F,1),g())}function W(x){x<0||x>=c.length||(c.splice(x,1),g())}function g(){R(),h.update(c.length),v.update(c,t,a),A&&A.update(c,t,a),C.style.display=c.length===0?"":"none",S.refreshCounts(),I()}function R(){m.innerHTML="";let x=Math.max(o,c.length);for(let w=0;w<x;w++){let F=c[w];F?m.appendChild(Rt(F,w,a,()=>W(w))):m.appendChild(Mt(w,()=>S.open()))}}function I(){let x=c.length;x<o?(b.disabled=!0,ee(b,`Select ${o-x} more to unlock`)):(b.disabled=!1,ee(b,r.cta.ctaText||"Add to cart"))}}function Pt(e){let t=e.widgetConfig,n=s("div","lb-bundle-header"),i=s("div","lb-bundle-header__content"),r=s("h3","lb-bundle-title");if(r.textContent=e.title,i.appendChild(r),n.appendChild(i),t.pricing.showSaveBadge){let{discountType:a,discountValue:o}=e.discountConfig,d=null;if(a==="percentage"&&o>0?d=`-${Math.round(o)}%`:a==="fixed_amount"&&o>0&&(d=`-${_(Math.round(o*100),e.products[0]?.priceRange.minVariantPrice.currencyCode??"USD")}`),d){let l=s("span","lb-bundle-header__badge");l.textContent=d,n.appendChild(l)}}return n}function Lt(e){let t=s("div","lb-mix-match__progress"),n=s("div","lb-mix-match__progress-labels"),i=s("span","lb-mix-match__progress-count",{"data-progress-count":""});i.textContent=`0 of ${e} selected`,n.appendChild(i);let r=s("span","lb-mix-match__progress-remaining",{"data-progress-remaining":""});r.textContent=`${e} more to go`,n.appendChild(r),t.appendChild(n);let a=s("div","lb-mix-match__progress-track",{role:"progressbar","aria-valuenow":"0","aria-valuemin":"0","aria-valuemax":String(e)}),o=s("div","lb-mix-match__progress-fill",{"data-progress-fill":""});o.style.width="0%",a.appendChild(o),t.appendChild(a);function d(l){let u=Math.min(100,l/e*100);i.textContent=`${l} of ${e} selected`,l>=e?r.textContent="Complete":r.textContent=`${e-l} more to go`,o.style.width=`${u}%`,a.setAttribute("aria-valuenow",String(Math.min(l,e)))}return{el:t,update:d}}function Mt(e,t){let n=s("div","lb-bundle-product-row lb-mix-match__slot lb-mix-match__slot--empty",{"data-slot":String(e+1),tabindex:"0",role:"button","aria-label":"Add a product to the bundle"}),i=s("div","lb-mix-match__empty-thumb");i.innerHTML=Ee,n.appendChild(i);let r=s("span","lb-mix-match__empty-text");return r.textContent="Choose an item",n.appendChild(r),n.addEventListener("click",t),n.addEventListener("keydown",a=>{(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),t())}),n}function Rt(e,t,n,i){let r=s("div","lb-bundle-product-row lb-mix-match__slot lb-mix-match__slot--filled",{"data-slot":String(t+1)}),a=s("div","lb-bundle-thumbnail",{"data-thumbnail":""});if(e.imageUrl){let p=document.createElement("img");p.src=O(e.imageUrl,{width:L,height:L,crop:"center"}),p.alt=e.productTitle,p.width=L,p.height=L,p.loading="lazy",a.appendChild(p)}else a.insertAdjacentHTML("beforeend",Ae);r.appendChild(a);let o=s("div","lb-mix-match__filled-info"),d=s("span","lb-mix-match__filled-title");if(d.textContent=e.productTitle,o.appendChild(d),e.variantTitle&&e.variantTitle!=="Default Title"){let p=s("span","lb-mix-match__filled-variant");p.textContent=e.variantTitle,o.appendChild(p)}let l=s("span","lb-mix-match__filled-price");if(e.compareCents&&e.compareCents>e.priceCents){let p=s("span","lb-mix-match__filled-compare");p.textContent=_(e.compareCents,n),l.appendChild(p)}let u=document.createElement("span");u.textContent=_(e.priceCents,n),l.appendChild(u),o.appendChild(l),r.appendChild(o);let c=document.createElement("button");return c.type="button",c.className="lb-mix-match__slot-remove",c.setAttribute("aria-label",`Remove ${e.productTitle}`),c.innerHTML=te,c.addEventListener("click",p=>{p.stopPropagation(),i()}),r.appendChild(c),r}function It(e){let t=s("div","lb-bundle-pricing",{"data-pricing-section":""});t.style.display="none";let n=s("span","lb-bundle-pricing__label");n.textContent="Bundle price",t.appendChild(n);let i=s("span","lb-bundle-pricing__prices"),r=s("span","lb-bundle-compare-price",{"data-compare-price":""});e&&i.appendChild(r);let a=s("span","lb-bundle-sale-price",{"data-sale-price":""});i.appendChild(a),t.appendChild(i);function o(d,l,u){if(d.length===0){t.style.display="none";return}t.style.display="";let c=d.reduce((f,h)=>f+h.priceCents,0),p=Q(c,l.discountConfig);e&&c>p?(r.textContent=_(c,u),r.style.display=""):r.style.display="none",a.textContent=_(p,u)}return{el:t,update:o}}function Ft(){let e=s("div","lb-bundle-savings-bar",{"data-savings-bar":""});e.style.display="none";let t=document.createElement("span");t.textContent="You save",e.appendChild(t);let n=s("span","",{"data-savings-amount":""});e.appendChild(n);function i(r,a,o){if(r.length===0){e.style.display="none";return}let d=r.reduce((c,p)=>c+p.priceCents,0),l=Q(d,a.discountConfig),u=Math.max(0,d-l);if(u<=0){e.style.display="none";return}e.style.display="",n.textContent=_(u,o)}return{el:e,update:i}}function Dt(e,t,n,i){let r=s("div","lb-mix-match__modal-overlay",{"data-modal-overlay":"","data-bundle-gid":e.id});r.style.display="none";let a=s("div","lb-mix-match__modal",{role:"dialog","aria-modal":"true","aria-labelledby":`lb-modal-title-${Te(e.id)}`,tabindex:"-1"}),o=s("div","lb-mix-match__modal-header"),d=s("h4","lb-mix-match__modal-title",{id:`lb-modal-title-${Te(e.id)}`});d.textContent="Pick an item",o.appendChild(d);let l=document.createElement("button");l.type="button",l.className="lb-mix-match__modal-close",l.setAttribute("data-modal-close",""),l.setAttribute("aria-label","Close"),l.innerHTML=te,l.addEventListener("click",T),o.appendChild(l),a.appendChild(o);let u=null,c=null;if(i.showSearch){let g=s("div","lb-mix-match__modal-search");u=document.createElement("input"),u.type="text",u.className="lb-mix-match__modal-search-input",u.setAttribute("data-modal-search",""),u.setAttribute("role","searchbox"),u.setAttribute("aria-label","Search products"),u.setAttribute("placeholder","Search products"),u.autocomplete="off",u.addEventListener("input",()=>k()),g.appendChild(u),c=document.createElement("button"),c.type="button",c.className="lb-mix-match__modal-search-clear",c.setAttribute("data-modal-search-clear",""),c.setAttribute("aria-label","Clear search"),c.style.display="none",c.innerHTML=Et,c.addEventListener("click",()=>{u&&(u.value="",k(),u.focus())}),g.appendChild(c),a.appendChild(g)}let p=s("div","lb-mix-match__modal-list",{"data-modal-list":""});a.appendChild(p);let f=s("div","lb-mix-match__modal-empty",{"data-modal-empty":""});f.style.display="none";let h=document.createElement("p");h.textContent="No products match your search.",f.appendChild(h),a.appendChild(f);let m=s("span","lb-visually-hidden",{"data-modal-live":"","aria-live":"polite"});a.appendChild(m),r.appendChild(a);let v=!1,A=[];function C(){v||(v=!0,p.innerHTML="",t.forEach(g=>{let R=g.firstAvailableVariant??g.variants[0];if(!R)return;let I=s("div",g.isOos?"lb-mix-match__modal-product lb-mix-match__modal-product--sold-out":"lb-mix-match__modal-product",{"data-product-id":g.product.id.replace(/^.*\//,"")}),x=s("div","lb-mix-match__modal-product-thumb");if(g.product.featuredImage){let E=document.createElement("img");E.src=O(g.product.featuredImage.url,{width:L,height:L,crop:"center"}),E.alt=g.product.featuredImage.altText??g.product.title,E.width=L,E.height=L,E.loading="lazy",x.appendChild(E)}else x.insertAdjacentHTML("beforeend",Ae);I.appendChild(x);let w=s("div","lb-mix-match__modal-product-info"),F=s("span","lb-mix-match__modal-product-title");F.textContent=g.product.title,w.appendChild(F);let q=s("span","lb-mix-match__modal-product-price");if(q.textContent=_(P(R.price.amount),n),w.appendChild(q),g.isOos){let E=s("span","lb-mix-match__modal-sold-out-label");E.textContent="Sold out",w.appendChild(E)}if(I.appendChild(w),g.isOos)A.push({el:I,product:g.product,variant:R,updateCount:()=>{}});else{let E=document.createElement("button");E.type="button",E.className="lb-mix-match__modal-add",E.setAttribute("aria-label",`Add ${g.product.title}`),E.innerHTML=Ee;let N=s("span","lb-bundle-qty-badge");N.style.display="none",E.appendChild(N),E.addEventListener("click",()=>{i.isOverMax()||i.onAdd(g.product,R)}),I.appendChild(E);let V=document.createElement("button");V.type="button",V.className="lb-mix-match__slot-remove",V.setAttribute("aria-label",`Remove one ${g.product.title}`),V.style.display="none",V.innerHTML=te,V.addEventListener("click",G=>{G.stopPropagation(),i.onRemove(g.product.id,R.id)}),I.appendChild(V),A.push({el:I,product:g.product,variant:R,updateCount:()=>{let G=i.countFor(g.product.id,R.id);G>0?(N.textContent=String(G),N.style.display="",V.style.display=""):(N.style.display="none",V.style.display="none")}})}p.appendChild(I)}),W())}function k(){if(!u)return;let g=u.value.trim().toLowerCase();c&&(c.style.display=g?"":"none");let R=0;A.forEach(I=>{let x=!g||I.product.title.toLowerCase().includes(g);I.el.style.display=x?"":"none",x&&R++}),f.style.display=R===0&&g?"":"none"}let S=null;function b(g){if(g.key==="Escape"){g.preventDefault(),T();return}g.key==="Tab"&&Ut(g,a)}let B=!1;function y(){B||i.isOverMax()||(B=!0,C(),S=r.getRootNode().activeElement,r.style.display="",r.classList.add("lb-mix-match__modal-overlay--open"),a.focus(),document.addEventListener("keydown",b),r.addEventListener("click",M))}function T(){B&&(B=!1,r.classList.remove("lb-mix-match__modal-overlay--open"),r.style.display="none",document.removeEventListener("keydown",b),r.removeEventListener("click",M),S instanceof HTMLElement&&S.focus())}function M(g){g.target===r&&T()}function W(){A.forEach(g=>g.updateCount())}return{el:r,open:y,close:T,refreshCounts:W}}function Vt(e,t){let n=[],i=new Set;for(let r of e.products){if(i.has(r.id))continue;i.add(r.id);let a=r.variants.nodes.filter(d=>d.availableForSale),o=a.length===0;o&&t==="hide"||n.push({product:r,variants:r.variants.nodes,firstAvailableVariant:a[0]??null,isOos:o})}return n}function Ut(e,t){let n=t.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');if(n.length===0)return;let i=n[0],r=n[n.length-1],a=t.getRootNode().activeElement;e.shiftKey&&a===i?(e.preventDefault(),r.focus()):!e.shiftKey&&a===r&&(e.preventDefault(),i.focus())}function Te(e){return e.replace(/[^a-zA-Z0-9_-]/g,"-")}function Ie(e,t,n,i){let r=t.widgetConfig,o=t.products[0]?.variants.nodes.find(b=>b.availableForSale);if(!o&&r.outOfStockBehavior==="hide")return;let d=o?P(o.price.amount):0,l=o?.price.currencyCode??"USD",u=t.discountConfig.discountType,c=t.volumeTiers.map((b,B)=>{let y;if(u==="fixed_amount"){let T=Math.round((b.amount??0)*100);y=Math.max(0,d-T)}else{let T=b.percentage??0,M=Math.floor(d*T/100);y=Math.max(0,d-M)}return{tier:b,index:B,qty:b.minQuantity,pricePerUnitCents:y,basePricePerUnitCents:d}}),p=Wt(c),f=r.defaultTier==="best_value"?p:0;typeof r.defaultTier=="number"&&(f=Re(r.defaultTier,0,c.length-1));let h=r.popularBadge.tierIndex!==void 0?Re(r.popularBadge.tierIndex,0,c.length-1):p,m=s("div","lb-volume");if(m.appendChild(Ot(t,c,f,l,u)),r.countdown.showCountdown&&t.endsAt){let b=H(t.endsAt);b&&(m.appendChild(b.el),i?.(b.stop))}let v=s("div","lb-volume__tiers",{role:"radiogroup","aria-label":"Quantity tiers","data-tier-group":""});c.forEach(b=>{let B=Ht(b,b.index===f,l,r.popularBadge.visible&&b.index===h?r.popularBadge.text:null,r.pricing.showComparePrice,r.pricing.showPerUnitPrice);B.addEventListener("click",()=>S(b.index)),B.addEventListener("keydown",y=>{if(y.key==="Enter"||y.key===" "){y.preventDefault(),S(b.index);return}if(y.key==="ArrowDown"||y.key==="ArrowRight"||y.key==="ArrowUp"||y.key==="ArrowLeft"){y.preventDefault();let T=y.key==="ArrowDown"||y.key==="ArrowRight"?1:-1,M=(b.index+T+c.length)%c.length;S(M),v.children[M]?.focus()}}),v.appendChild(B)}),m.appendChild(v),m.appendChild(s("div","lb-bundle-divider"));let A=Le(c,f,l,r.pricing.showItemCount,r.pricing.showCompareAtPrice);m.appendChild(A);let C=r.savingsBar.visible?Me(c,f,l):null;C&&m.appendChild(C);let k=$t(t,()=>{if(!o)return;let b=c[f];b&&n([{merchandiseId:o.id,quantity:b.qty,attributes:[{key:"_lime_bundle_gid",value:t.id},{key:"_lime_bundle_type",value:t.bundleType}]}])});m.appendChild(k),m.appendChild(s("p","lb-bundle-error",{"data-error":"","aria-live":"polite"})),m.appendChild(s("span","lb-visually-hidden",{"data-status":"","aria-live":"polite"})),e.appendChild(m);function S(b){if(b===f||b<0||b>=c.length)return;f=b,Array.from(v.children).forEach((T,M)=>{T.setAttribute("aria-checked",String(M===b)),T.tabIndex=M===b?0:-1});let B=Le(c,b,l,r.pricing.showItemCount,r.pricing.showCompareAtPrice);if(A.replaceWith(B),A=B,C){let T=Me(c,b,l);C.replaceWith(T),C=T}let y=m.querySelector("[data-header-badge]");if(y){let T=Fe(c[b],l,u);T?(y.textContent=T,y.style.display=""):y.style.display="none"}}}function Ot(e,t,n,i,r){let a=e.widgetConfig,o=s("div","lb-bundle-header"),d=s("div","lb-bundle-header__content"),l=s("h3","lb-bundle-title");if(l.textContent=e.title,d.appendChild(l),o.appendChild(d),a.pricing.showSaveBadge){let u=Fe(t[n],i,r);if(u){let c=s("span","lb-bundle-header__badge",{"data-header-badge":""});c.textContent=u,o.appendChild(c)}}return o}function Ht(e,t,n,i,r,a){let o=s("div","lb-volume__tier",{role:"radio","aria-checked":String(t),tabindex:t?"0":"-1","data-tier-index":String(e.index),"data-tier-qty":String(e.qty)}),d=s("span","lb-volume__radio");d.appendChild(s("span","lb-volume__radio-dot")),o.appendChild(d);let l=s("span","lb-volume__tier-grid"),u=s("span","lb-volume__tier-label");u.textContent=`Buy ${e.qty}`,l.appendChild(u);let c=s("span","lb-volume__tier-price");if(r&&e.pricePerUnitCents<e.basePricePerUnitCents){let f=s("span","lb-volume__tier-compare");f.textContent=_(e.basePricePerUnitCents,n),c.appendChild(f)}if(a){let f=document.createElement("span");f.setAttribute("data-tier-price-each",""),f.textContent=_(e.pricePerUnitCents,n),c.appendChild(f);let h=s("span","lb-volume__tier-unit");h.textContent=" each",c.appendChild(h)}l.appendChild(c),o.appendChild(l);let p=s("span","lb-volume__tier-badge");return i?p.textContent=i:p.style.display="none",o.appendChild(p),o}function Le(e,t,n,i,r){let a=e[t],o=a?a.pricePerUnitCents*a.qty:0,d=a?a.basePricePerUnitCents*a.qty:0,l=Math.max(0,d-o),u=s("div","lb-bundle-pricing"),c=s("span","lb-bundle-pricing__label",{"data-total-label":""});if(c.textContent="Total",i&&a){let h=document.createElement("span");h.setAttribute("data-item-count",""),h.textContent=` (${a.qty} item${a.qty===1?"":"s"})`,c.appendChild(h)}u.appendChild(c);let p=s("span","lb-bundle-pricing__prices");if(r&&l>0){let h=s("span","lb-bundle-compare-price",{"data-compare-price":""});h.textContent=_(d,n),p.appendChild(h)}let f=s("span","lb-bundle-sale-price",{"data-total-price":""});return f.textContent=_(o,n),p.appendChild(f),u.appendChild(p),u}function Me(e,t,n){let i=e[t],r=i?i.pricePerUnitCents*i.qty:0,a=i?i.basePricePerUnitCents*i.qty:0,o=Math.max(0,a-r),d=s("div","lb-bundle-savings-bar",{"data-savings-bar":""});o<=0&&(d.style.display="none");let l=document.createElement("span");l.textContent="You save",d.appendChild(l);let u=s("span","",{"data-savings-amount":""});return u.textContent=_(o,n),d.appendChild(u),d}function $t(e,t){let i=e.products[0]?.variants.nodes.some(o=>o.availableForSale),r=i?e.widgetConfig.cta.ctaText||"Add to cart":"Sold out",a=$(r);return i||(a.disabled=!0),a.addEventListener("click",()=>{a.disabled||t()}),a}function Fe(e,t,n){if(!e)return null;let{tier:i}=e;if(n==="fixed_amount"){let r=i.amount??0;return r>0?`-${_(Math.round(r*100),t)}`:null}if(n==="percentage"){let r=i.percentage??0;return r>0?`-${Math.round(r)}%`:null}return null}function Wt(e){let t=0,n=0;return e.forEach((i,r)=>{let a=i.basePricePerUnitCents-i.pricePerUnitCents;a>t&&(t=a,n=r)}),n}function Re(e,t,n){return Math.max(t,Math.min(n,e))}var re=`/* Lime Bundles \u2014 shared base styles for all bundle widget types */
|
|
235
|
+
</svg>`;function Re(e,t,r,i){let n=t.widgetConfig,a=t.products[0]?.priceRange.minVariantPrice.currencyCode??"USD",o=t.minQuantity??1,d=t.maxQuantity??o,l=Nt(t,n.outOfStockBehavior);if(l.filter(v=>!v.isOos).length<o)return;let c=[],p=s("div","lb-mix-match",{"data-required-quantity":String(o),"data-max-quantity":String(d)}),m=Ft(t);if(p.appendChild(m),n.countdown.showCountdown&&t.endsAt){let v=H(t.endsAt);v&&(p.appendChild(v.el),i?.(v.stop))}let C=Dt(o);p.appendChild(C.el);let b=s("div","lb-mix-match__slots",{"data-selection-slots":""});p.appendChild(b),p.appendChild(s("div","lb-bundle-divider"));let f=Ot(n.pricing.showCompareAtPrice);p.appendChild(f.el);let w=n.savingsBar.visible?Ht():null;w&&p.appendChild(w.el);let x=s("div","lb-mix-match__price-placeholder",{"data-price-placeholder":""}),S=s("span","lb-mix-match__price-placeholder-text");S.textContent=`Select ${o} items to see price`,x.appendChild(S),p.appendChild(x);let E=$t(t,l,a,{showSearch:n.showSearch,onAdd:(v,_)=>T(v,_),onRemove:(v,_)=>R(v,_),countFor:(v,_)=>c.filter(F=>F.productId===v&&F.variantId===_).length,isOverMax:()=>c.length>=d});p.appendChild(E.el);let h=$(`Select ${o} items to unlock`);h.disabled=!0,h.addEventListener("click",()=>{if(h.disabled)return;let v=c.map(_=>({merchandiseId:_.variantId,quantity:1,attributes:[{key:"_lime_bundle_gid",value:t.id},{key:"_lime_bundle_type",value:t.bundleType}]}));r(v)}),p.appendChild(h),p.appendChild(s("p","lb-bundle-error",{"data-error":"","aria-live":"polite"})),p.appendChild(s("span","lb-visually-hidden",{"data-status":"","aria-live":"polite"})),e.appendChild(p);let k=l.find(v=>!v.isOos),y=k?.firstAvailableVariant??k?.variants[0];k&&y&&c.push({productId:k.product.id,productTitle:k.product.title,variantId:y.id,variantTitle:y.title,imageUrl:k.product.featuredImage?.url??null,priceCents:P(y.price.amount),compareCents:y.compareAtPrice?P(y.compareAtPrice.amount):null}),g();function T(v,_){c.length>=d||(c.push({productId:v.id,productTitle:v.title,variantId:_.id,variantTitle:_.title,imageUrl:v.featuredImage?.url??null,priceCents:P(_.price.amount),compareCents:_.compareAtPrice?P(_.compareAtPrice.amount):null}),g())}function R(v,_){let F=c.findIndex(W=>W.productId===v&&W.variantId===_);F!==-1&&(c.splice(F,1),g())}function N(v){v<0||v>=c.length||(c.splice(v,1),g())}function g(){M(),C.update(c.length),f.update(c,t,a),w&&w.update(c,t,a),x.style.display=c.length===0?"":"none",E.refreshCounts(),I()}function M(){b.innerHTML="";let v=Math.max(o,c.length);for(let _=0;_<v;_++){let F=c[_];F?b.appendChild(Vt(F,_,a,()=>N(_))):b.appendChild(Ut(_,()=>E.open()))}}function I(){let v=c.length;v<o?(h.disabled=!0,re(h,`Select ${o-v} more to unlock`)):(h.disabled=!1,re(h,n.cta.ctaText||"Add to cart"))}}function Ft(e){let t=e.widgetConfig,r=s("div","lb-bundle-header"),i=s("div","lb-bundle-header__content"),n=s("h3","lb-bundle-title");if(n.textContent=e.title,i.appendChild(n),r.appendChild(i),t.pricing.showSaveBadge){let{discountType:a,discountValue:o}=e.discountConfig,d=null;if(a==="percentage"&&o>0?d=`-${Math.round(o)}%`:a==="fixed_amount"&&o>0&&(d=`-${B(Math.round(o*100),e.products[0]?.priceRange.minVariantPrice.currencyCode??"USD")}`),d){let l=s("span","lb-bundle-header__badge");l.textContent=d,r.appendChild(l)}}return r}function Dt(e){let t=s("div","lb-mix-match__progress"),r=s("div","lb-mix-match__progress-labels"),i=s("span","lb-mix-match__progress-count",{"data-progress-count":""});i.textContent=`0 of ${e} selected`,r.appendChild(i);let n=s("span","lb-mix-match__progress-remaining",{"data-progress-remaining":""});n.textContent=`${e} more to go`,r.appendChild(n),t.appendChild(r);let a=s("div","lb-mix-match__progress-track",{role:"progressbar","aria-valuenow":"0","aria-valuemin":"0","aria-valuemax":String(e)}),o=s("div","lb-mix-match__progress-fill",{"data-progress-fill":""});o.style.width="0%",a.appendChild(o),t.appendChild(a);function d(l){let u=Math.min(100,l/e*100);i.textContent=`${l} of ${e} selected`,l>=e?n.textContent="Complete":n.textContent=`${e-l} more to go`,o.style.width=`${u}%`,a.setAttribute("aria-valuenow",String(Math.min(l,e)))}return{el:t,update:d}}function Ut(e,t){let r=s("div","lb-bundle-product-row lb-mix-match__slot lb-mix-match__slot--empty",{"data-slot":String(e+1),tabindex:"0",role:"button","aria-label":"Add a product to the bundle"}),i=s("div","lb-mix-match__empty-thumb");i.innerHTML=Me,r.appendChild(i);let n=s("span","lb-mix-match__empty-text");return n.textContent="Choose an item",r.appendChild(n),r.addEventListener("click",t),r.addEventListener("keydown",a=>{(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),t())}),r}function Vt(e,t,r,i){let n=s("div","lb-bundle-product-row lb-mix-match__slot lb-mix-match__slot--filled",{"data-slot":String(t+1)}),a=s("div","lb-bundle-thumbnail",{"data-thumbnail":""});if(e.imageUrl){let p=document.createElement("img");p.src=O(e.imageUrl,{width:L,height:L,crop:"center"}),p.alt=e.productTitle,p.width=L,p.height=L,p.loading="lazy",a.appendChild(p)}else a.insertAdjacentHTML("beforeend",Le);n.appendChild(a);let o=s("div","lb-mix-match__filled-info"),d=s("span","lb-mix-match__filled-title");if(d.textContent=e.productTitle,o.appendChild(d),e.variantTitle&&e.variantTitle!=="Default Title"){let p=s("span","lb-mix-match__filled-variant");p.textContent=e.variantTitle,o.appendChild(p)}let l=s("span","lb-mix-match__filled-price");if(e.compareCents&&e.compareCents>e.priceCents){let p=s("span","lb-mix-match__filled-compare");p.textContent=B(e.compareCents,r),l.appendChild(p)}let u=document.createElement("span");u.textContent=B(e.priceCents,r),l.appendChild(u),o.appendChild(l),n.appendChild(o);let c=document.createElement("button");return c.type="button",c.className="lb-mix-match__slot-remove",c.setAttribute("aria-label",`Remove ${e.productTitle}`),c.innerHTML=ne,c.addEventListener("click",p=>{p.stopPropagation(),i()}),n.appendChild(c),n}function Ot(e){let t=s("div","lb-bundle-pricing",{"data-pricing-section":""});t.style.display="none";let r=s("span","lb-bundle-pricing__label");r.textContent="Bundle price",t.appendChild(r);let i=s("span","lb-bundle-pricing__prices"),n=s("span","lb-bundle-compare-price",{"data-compare-price":""});e&&i.appendChild(n);let a=s("span","lb-bundle-sale-price",{"data-sale-price":""});i.appendChild(a),t.appendChild(i);function o(d,l,u){if(d.length===0){t.style.display="none";return}t.style.display="";let c=d.reduce((m,C)=>m+C.priceCents,0),p=K(c,l.discountConfig);e&&c>p?(n.textContent=B(c,u),n.style.display=""):n.style.display="none",a.textContent=B(p,u)}return{el:t,update:o}}function Ht(){let e=s("div","lb-bundle-savings-bar",{"data-savings-bar":""});e.style.display="none";let t=document.createElement("span");t.textContent="You save",e.appendChild(t);let r=s("span","",{"data-savings-amount":""});e.appendChild(r);function i(n,a,o){if(n.length===0){e.style.display="none";return}let d=n.reduce((c,p)=>c+p.priceCents,0),l=K(d,a.discountConfig),u=Math.max(0,d-l);if(u<=0){e.style.display="none";return}e.style.display="",r.textContent=B(u,o)}return{el:e,update:i}}function $t(e,t,r,i){let n=s("div","lb-mix-match__modal-overlay",{"data-modal-overlay":"","data-bundle-gid":e.id});n.style.display="none";let a=s("div","lb-mix-match__modal",{role:"dialog","aria-modal":"true","aria-labelledby":`lb-modal-title-${Pe(e.id)}`,tabindex:"-1"}),o=s("div","lb-mix-match__modal-header"),d=s("h4","lb-mix-match__modal-title",{id:`lb-modal-title-${Pe(e.id)}`});d.textContent="Pick an item",o.appendChild(d);let l=document.createElement("button");l.type="button",l.className="lb-mix-match__modal-close",l.setAttribute("data-modal-close",""),l.setAttribute("aria-label","Close"),l.innerHTML=ne,l.addEventListener("click",T),o.appendChild(l),a.appendChild(o);let u=null,c=null;if(i.showSearch){let g=s("div","lb-mix-match__modal-search");u=document.createElement("input"),u.type="text",u.className="lb-mix-match__modal-search-input",u.setAttribute("data-modal-search",""),u.setAttribute("role","searchbox"),u.setAttribute("aria-label","Search products"),u.setAttribute("placeholder","Search products"),u.autocomplete="off",u.addEventListener("input",()=>S()),g.appendChild(u),c=document.createElement("button"),c.type="button",c.className="lb-mix-match__modal-search-clear",c.setAttribute("data-modal-search-clear",""),c.setAttribute("aria-label","Clear search"),c.style.display="none",c.innerHTML=It,c.addEventListener("click",()=>{u&&(u.value="",S(),u.focus())}),g.appendChild(c),a.appendChild(g)}let p=s("div","lb-mix-match__modal-list",{"data-modal-list":""});a.appendChild(p);let m=s("div","lb-mix-match__modal-empty",{"data-modal-empty":""});m.style.display="none";let C=document.createElement("p");C.textContent="No products match your search.",m.appendChild(C),a.appendChild(m);let b=s("span","lb-visually-hidden",{"data-modal-live":"","aria-live":"polite"});a.appendChild(b),n.appendChild(a);let f=!1,w=[];function x(){f||(f=!0,p.innerHTML="",t.forEach(g=>{let M=g.firstAvailableVariant??g.variants[0];if(!M)return;let I=s("div",g.isOos?"lb-mix-match__modal-product lb-mix-match__modal-product--sold-out":"lb-mix-match__modal-product",{"data-product-id":g.product.id.replace(/^.*\//,"")}),v=s("div","lb-mix-match__modal-product-thumb");if(g.product.featuredImage){let A=document.createElement("img");A.src=O(g.product.featuredImage.url,{width:L,height:L,crop:"center"}),A.alt=g.product.featuredImage.altText??g.product.title,A.width=L,A.height=L,A.loading="lazy",v.appendChild(A)}else v.insertAdjacentHTML("beforeend",Le);I.appendChild(v);let _=s("div","lb-mix-match__modal-product-info"),F=s("span","lb-mix-match__modal-product-title");F.textContent=g.product.title,_.appendChild(F);let W=s("span","lb-mix-match__modal-product-price");W.textContent=B(P(M.price.amount),r),_.appendChild(W);let oe=j(M.unitPrice,M.unitPriceMeasurement,r);if(oe){let A=s("span","lb-mix-match__modal-product-unit-price lb-bundle-product-unit-price");A.textContent=oe,_.appendChild(A)}if(g.isOos){let A=s("span","lb-mix-match__modal-sold-out-label");A.textContent="Sold out",_.appendChild(A)}if(I.appendChild(_),g.isOos)w.push({el:I,product:g.product,variant:M,updateCount:()=>{}});else{let A=document.createElement("button");A.type="button",A.className="lb-mix-match__modal-add",A.setAttribute("aria-label",`Add ${g.product.title}`),A.innerHTML=Me;let q=s("span","lb-bundle-qty-badge");q.style.display="none",A.appendChild(q),A.addEventListener("click",()=>{i.isOverMax()||i.onAdd(g.product,M)}),I.appendChild(A);let U=document.createElement("button");U.type="button",U.className="lb-mix-match__slot-remove",U.setAttribute("aria-label",`Remove one ${g.product.title}`),U.style.display="none",U.innerHTML=ne,U.addEventListener("click",Q=>{Q.stopPropagation(),i.onRemove(g.product.id,M.id)}),I.appendChild(U),w.push({el:I,product:g.product,variant:M,updateCount:()=>{let Q=i.countFor(g.product.id,M.id);Q>0?(q.textContent=String(Q),q.style.display="",U.style.display=""):(q.style.display="none",U.style.display="none")}})}p.appendChild(I)}),N())}function S(){if(!u)return;let g=u.value.trim().toLowerCase();c&&(c.style.display=g?"":"none");let M=0;w.forEach(I=>{let v=!g||I.product.title.toLowerCase().includes(g);I.el.style.display=v?"":"none",v&&M++}),m.style.display=M===0&&g?"":"none"}let E=null;function h(g){if(g.key==="Escape"){g.preventDefault(),T();return}g.key==="Tab"&&Wt(g,a)}let k=!1;function y(){k||i.isOverMax()||(k=!0,x(),E=n.getRootNode().activeElement,n.style.display="",n.classList.add("lb-mix-match__modal-overlay--open"),a.focus(),document.addEventListener("keydown",h),n.addEventListener("click",R))}function T(){k&&(k=!1,n.classList.remove("lb-mix-match__modal-overlay--open"),n.style.display="none",document.removeEventListener("keydown",h),n.removeEventListener("click",R),E instanceof HTMLElement&&E.focus())}function R(g){g.target===n&&T()}function N(){w.forEach(g=>g.updateCount())}return{el:n,open:y,close:T,refreshCounts:N}}function Nt(e,t){let r=[],i=new Set;for(let n of e.products){if(i.has(n.id))continue;i.add(n.id);let a=n.variants.nodes.filter(d=>d.availableForSale),o=a.length===0;o&&t==="hide"||r.push({product:n,variants:n.variants.nodes,firstAvailableVariant:a[0]??null,isOos:o})}return r}function Wt(e,t){let r=t.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');if(r.length===0)return;let i=r[0],n=r[r.length-1],a=t.getRootNode().activeElement;e.shiftKey&&a===i?(e.preventDefault(),n.focus()):!e.shiftKey&&a===n&&(e.preventDefault(),i.focus())}function Pe(e){return e.replace(/[^a-zA-Z0-9_-]/g,"-")}function Ue(e,t,r,i){let n=t.widgetConfig,o=t.products[0]?.variants.nodes.find(h=>h.availableForSale);if(!o&&n.outOfStockBehavior==="hide")return;let d=o?P(o.price.amount):0,l=o?.price.currencyCode??"USD",u=t.discountConfig.discountType,c=t.volumeTiers.map((h,k)=>{let y;if(u==="fixed_amount"){let T=Math.round((h.amount??0)*100);y=Math.max(0,d-T)}else{let T=h.percentage??0,R=Math.floor(d*T/100);y=Math.max(0,d-R)}return{tier:h,index:k,qty:h.minQuantity,pricePerUnitCents:y,basePricePerUnitCents:d}}),p=Gt(c),m=n.defaultTier==="best_value"?p:0;typeof n.defaultTier=="number"&&(m=De(n.defaultTier,0,c.length-1));let C=n.popularBadge.tierIndex!==void 0?De(n.popularBadge.tierIndex,0,c.length-1):p,b=s("div","lb-volume");if(b.appendChild(qt(t,c,m,l,u)),n.countdown.showCountdown&&t.endsAt){let h=H(t.endsAt);h&&(b.appendChild(h.el),i?.(h.stop))}let f=s("div","lb-volume__tiers",{role:"radiogroup","aria-label":"Quantity tiers","data-tier-group":""});c.forEach(h=>{let k=zt(h,h.index===m,l,n.popularBadge.visible&&h.index===C?n.popularBadge.text:null,n.pricing.showComparePrice,n.pricing.showPerUnitPrice);k.addEventListener("click",()=>E(h.index)),k.addEventListener("keydown",y=>{if(y.key==="Enter"||y.key===" "){y.preventDefault(),E(h.index);return}if(y.key==="ArrowDown"||y.key==="ArrowRight"||y.key==="ArrowUp"||y.key==="ArrowLeft"){y.preventDefault();let T=y.key==="ArrowDown"||y.key==="ArrowRight"?1:-1,R=(h.index+T+c.length)%c.length;E(R),f.children[R]?.focus()}}),f.appendChild(k)}),b.appendChild(f),b.appendChild(s("div","lb-bundle-divider"));let w=Ie(c,m,l,n.pricing.showItemCount,n.pricing.showCompareAtPrice);b.appendChild(w);let x=n.savingsBar.visible?Fe(c,m,l):null;x&&b.appendChild(x);let S=jt(t,()=>{if(!o)return;let h=c[m];h&&r([{merchandiseId:o.id,quantity:h.qty,attributes:[{key:"_lime_bundle_gid",value:t.id},{key:"_lime_bundle_type",value:t.bundleType}]}])});b.appendChild(S),b.appendChild(s("p","lb-bundle-error",{"data-error":"","aria-live":"polite"})),b.appendChild(s("span","lb-visually-hidden",{"data-status":"","aria-live":"polite"})),e.appendChild(b);function E(h){if(h===m||h<0||h>=c.length)return;m=h,Array.from(f.children).forEach((T,R)=>{T.setAttribute("aria-checked",String(R===h)),T.tabIndex=R===h?0:-1});let k=Ie(c,h,l,n.pricing.showItemCount,n.pricing.showCompareAtPrice);if(w.replaceWith(k),w=k,x){let T=Fe(c,h,l);x.replaceWith(T),x=T}let y=b.querySelector("[data-header-badge]");if(y){let T=Ve(c[h],l,u);T?(y.textContent=T,y.style.display=""):y.style.display="none"}}}function qt(e,t,r,i,n){let a=e.widgetConfig,o=s("div","lb-bundle-header"),d=s("div","lb-bundle-header__content"),l=s("h3","lb-bundle-title");if(l.textContent=e.title,d.appendChild(l),o.appendChild(d),a.pricing.showSaveBadge){let u=Ve(t[r],i,n);if(u){let c=s("span","lb-bundle-header__badge",{"data-header-badge":""});c.textContent=u,o.appendChild(c)}}return o}function zt(e,t,r,i,n,a){let o=s("div","lb-volume__tier",{role:"radio","aria-checked":String(t),tabindex:t?"0":"-1","data-tier-index":String(e.index),"data-tier-qty":String(e.qty)}),d=s("span","lb-volume__radio");d.appendChild(s("span","lb-volume__radio-dot")),o.appendChild(d);let l=s("span","lb-volume__tier-grid"),u=s("span","lb-volume__tier-label");u.textContent=`Buy ${e.qty}`,l.appendChild(u);let c=s("span","lb-volume__tier-price");if(n&&e.pricePerUnitCents<e.basePricePerUnitCents){let m=s("span","lb-volume__tier-compare");m.textContent=B(e.basePricePerUnitCents,r),c.appendChild(m)}if(a){let m=document.createElement("span");m.setAttribute("data-tier-price-each",""),m.textContent=B(e.pricePerUnitCents,r),c.appendChild(m);let C=s("span","lb-volume__tier-unit");C.textContent=" each",c.appendChild(C)}l.appendChild(c),o.appendChild(l);let p=s("span","lb-volume__tier-badge");return i?p.textContent=i:p.style.display="none",o.appendChild(p),o}function Ie(e,t,r,i,n){let a=e[t],o=a?a.pricePerUnitCents*a.qty:0,d=a?a.basePricePerUnitCents*a.qty:0,l=Math.max(0,d-o),u=s("div","lb-bundle-pricing"),c=s("span","lb-bundle-pricing__label",{"data-total-label":""});if(c.textContent="Total",i&&a){let C=document.createElement("span");C.setAttribute("data-item-count",""),C.textContent=` (${a.qty} item${a.qty===1?"":"s"})`,c.appendChild(C)}u.appendChild(c);let p=s("span","lb-bundle-pricing__prices");if(n&&l>0){let C=s("span","lb-bundle-compare-price",{"data-compare-price":""});C.textContent=B(d,r),p.appendChild(C)}let m=s("span","lb-bundle-sale-price",{"data-total-price":""});return m.textContent=B(o,r),p.appendChild(m),u.appendChild(p),u}function Fe(e,t,r){let i=e[t],n=i?i.pricePerUnitCents*i.qty:0,a=i?i.basePricePerUnitCents*i.qty:0,o=Math.max(0,a-n),d=s("div","lb-bundle-savings-bar",{"data-savings-bar":""});o<=0&&(d.style.display="none");let l=document.createElement("span");l.textContent="You save",d.appendChild(l);let u=s("span","",{"data-savings-amount":""});return u.textContent=B(o,r),d.appendChild(u),d}function jt(e,t){let i=e.products[0]?.variants.nodes.some(o=>o.availableForSale),n=i?e.widgetConfig.cta.ctaText||"Add to cart":"Sold out",a=$(n);return i||(a.disabled=!0),a.addEventListener("click",()=>{a.disabled||t()}),a}function Ve(e,t,r){if(!e)return null;let{tier:i}=e;if(r==="fixed_amount"){let n=i.amount??0;return n>0?`-${B(Math.round(n*100),t)}`:null}if(r==="percentage"){let n=i.percentage??0;return n>0?`-${Math.round(n)}%`:null}return null}function Gt(e){let t=0,r=0;return e.forEach((i,n)=>{let a=i.basePricePerUnitCents-i.pricePerUnitCents;a>t&&(t=a,r=n)}),r}function De(e,t,r){return Math.max(t,Math.min(r,e))}var ie=`/* Lime Bundles \u2014 shared base styles for all bundle widget types */
|
|
224
236
|
|
|
225
237
|
.lb-bundle-widget.lb-bundle-widget,
|
|
226
238
|
.lb-bundle-widget.lb-bundle-widget * {
|
|
@@ -229,7 +241,6 @@
|
|
|
229
241
|
|
|
230
242
|
.lb-bundle-widget {
|
|
231
243
|
/* Internal CSS-only vars (not merchant-configurable). */
|
|
232
|
-
--lb-text-muted: #666666;
|
|
233
244
|
--lb-thumbnail-bg: #F0F0F0;
|
|
234
245
|
--lb-widget-pad: 20px;
|
|
235
246
|
--lb-progress-color: var(--lb-primary-color);
|
|
@@ -252,7 +263,7 @@
|
|
|
252
263
|
margin: 0 calc(-1 * var(--lb-widget-pad)) 20px;
|
|
253
264
|
padding: 12px 20px;
|
|
254
265
|
background: var(--lb-countdown-bg);
|
|
255
|
-
border-top: 1px solid
|
|
266
|
+
border-top: 1px solid color-mix(in srgb, var(--lb-text) 6%, transparent);
|
|
256
267
|
display: flex;
|
|
257
268
|
align-items: center;
|
|
258
269
|
justify-content: space-between;
|
|
@@ -292,11 +303,20 @@
|
|
|
292
303
|
display: none;
|
|
293
304
|
}
|
|
294
305
|
|
|
295
|
-
/*
|
|
296
|
-
|
|
306
|
+
/* Sibling widget spacing \u2014 separates multiple bundles on the same product page.
|
|
307
|
+
Uses \`~\` (general sibling) rather than \`+\` (adjacent) because each Liquid
|
|
308
|
+
loop iteration emits a {% style %} block before its widget div, so the
|
|
309
|
+
rendered DOM alternates <style><widget><style><widget>. The \`+\` combinator
|
|
310
|
+
requires immediate adjacency and would match nothing; \`~\` matches every
|
|
311
|
+
widget after the first regardless of elements between. Single-widget pages
|
|
312
|
+
stay unaffected (no prior \`.lb-bundle-widget\` sibling to match against).
|
|
313
|
+
Only \`margin-top\` \u2014 do NOT override \`padding-top\` here. The gradient header
|
|
314
|
+
uses \`margin-top: calc(-1 * var(--lb-widget-pad))\` to reach the widget's
|
|
315
|
+
inner border edge, assuming padding-top == --lb-widget-pad. Changing
|
|
316
|
+
padding-top on the subsequent widget breaks that math and leaves a visible
|
|
317
|
+
gap above the header. */
|
|
318
|
+
.lb-bundle-widget ~ .lb-bundle-widget {
|
|
297
319
|
margin-top: 24px;
|
|
298
|
-
padding-top: 24px;
|
|
299
|
-
border-top: 1px solid var(--lb-border);
|
|
300
320
|
}
|
|
301
321
|
|
|
302
322
|
/* Header \u2014 gradient banner with title + savings badge */
|
|
@@ -339,7 +359,7 @@
|
|
|
339
359
|
font-size: 16px;
|
|
340
360
|
font-weight: 400;
|
|
341
361
|
line-height: 20px;
|
|
342
|
-
color: var(--lb-text
|
|
362
|
+
color: color-mix(in srgb, var(--lb-text) 60%, transparent);
|
|
343
363
|
margin: 4px 0 0;
|
|
344
364
|
}
|
|
345
365
|
|
|
@@ -408,7 +428,7 @@
|
|
|
408
428
|
.lb-bundle-thumbnail svg {
|
|
409
429
|
width: 28px;
|
|
410
430
|
height: 28px;
|
|
411
|
-
color:
|
|
431
|
+
color: color-mix(in srgb, var(--lb-text) 35%, transparent);
|
|
412
432
|
}
|
|
413
433
|
|
|
414
434
|
.lb-bundle-product-info {
|
|
@@ -463,6 +483,22 @@
|
|
|
463
483
|
display: none;
|
|
464
484
|
}
|
|
465
485
|
|
|
486
|
+
/* Unit price (e.g. "$0.50/100ml") \u2014 only rendered when the merchant has
|
|
487
|
+
configured unit pricing on the variant in the Shopify admin. No merchant
|
|
488
|
+
toggle: present in admin \u2192 shown; absent \u2192 hidden. Styled as muted
|
|
489
|
+
secondary text beneath the price row so it doesn't compete visually. */
|
|
490
|
+
.lb-bundle-product-unit-price {
|
|
491
|
+
display: block;
|
|
492
|
+
font-size: 11px;
|
|
493
|
+
line-height: 16px;
|
|
494
|
+
color: color-mix(in srgb, var(--lb-text) 60%, transparent);
|
|
495
|
+
margin-top: 2px;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
.lb-bundle-product-unit-price[hidden] {
|
|
499
|
+
display: none;
|
|
500
|
+
}
|
|
501
|
+
|
|
466
502
|
.lb-bundle-variant-badge {
|
|
467
503
|
display: inline-block;
|
|
468
504
|
border: var(--lb-variant-border-width) solid var(--lb-variant-border-color);
|
|
@@ -470,14 +506,14 @@
|
|
|
470
506
|
padding: 8px 12px;
|
|
471
507
|
font-size: 12px;
|
|
472
508
|
line-height: 16px;
|
|
473
|
-
color: var(--lb-text
|
|
509
|
+
color: color-mix(in srgb, var(--lb-text) 60%, transparent);
|
|
474
510
|
margin-top: 8px;
|
|
475
511
|
}
|
|
476
512
|
|
|
477
513
|
.lb-bundle-quantity {
|
|
478
514
|
font-size: 12px;
|
|
479
515
|
line-height: 16px;
|
|
480
|
-
color: var(--lb-text
|
|
516
|
+
color: color-mix(in srgb, var(--lb-text) 60%, transparent);
|
|
481
517
|
margin-left: 8px;
|
|
482
518
|
white-space: nowrap;
|
|
483
519
|
}
|
|
@@ -532,7 +568,7 @@
|
|
|
532
568
|
font-size: 16px;
|
|
533
569
|
font-weight: 600;
|
|
534
570
|
line-height: 20px;
|
|
535
|
-
padding: 12px
|
|
571
|
+
padding: 8px 12px;
|
|
536
572
|
border-radius: var(--lb-savings-bar-radius);
|
|
537
573
|
margin-bottom: 12px;
|
|
538
574
|
}
|
|
@@ -677,7 +713,7 @@
|
|
|
677
713
|
.lb-bundle-placeholder-icon {
|
|
678
714
|
width: 28px;
|
|
679
715
|
height: 28px;
|
|
680
|
-
stroke:
|
|
716
|
+
stroke: color-mix(in srgb, var(--lb-text) 35%, transparent);
|
|
681
717
|
stroke-width: 1.5;
|
|
682
718
|
fill: none;
|
|
683
719
|
}
|
|
@@ -699,7 +735,7 @@
|
|
|
699
735
|
.lb-ab-pending {
|
|
700
736
|
visibility: hidden;
|
|
701
737
|
}
|
|
702
|
-
`,
|
|
738
|
+
`,Oe=`/* Lime Bundles \u2014 Fixed bundle styles */
|
|
703
739
|
|
|
704
740
|
.lb-fixed__products {
|
|
705
741
|
display: flex;
|
|
@@ -756,7 +792,7 @@
|
|
|
756
792
|
outline: 2px solid var(--lb-primary-color);
|
|
757
793
|
outline-offset: 2px;
|
|
758
794
|
}
|
|
759
|
-
`,
|
|
795
|
+
`,He=`/* Lime Bundles \u2014 Mix & Match styles */
|
|
760
796
|
|
|
761
797
|
/* === Progress Bar === */
|
|
762
798
|
.lb-mix-match__progress {
|
|
@@ -1092,7 +1128,7 @@
|
|
|
1092
1128
|
border: var(--lb-picker-product-border-width) solid var(--lb-picker-product-border-color);
|
|
1093
1129
|
box-sizing: border-box;
|
|
1094
1130
|
overflow: visible;
|
|
1095
|
-
background:
|
|
1131
|
+
background: var(--lb-thumbnail-bg);
|
|
1096
1132
|
}
|
|
1097
1133
|
|
|
1098
1134
|
/* Qty badge inside the picker modal inherits picker-product border (width + color) plus
|
|
@@ -1133,6 +1169,17 @@
|
|
|
1133
1169
|
margin: 4px 0 0;
|
|
1134
1170
|
}
|
|
1135
1171
|
|
|
1172
|
+
.lb-mix-match__modal-product-unit-price {
|
|
1173
|
+
font-size: 11px;
|
|
1174
|
+
line-height: 16px;
|
|
1175
|
+
color: color-mix(in srgb, var(--lb-text) 60%, transparent);
|
|
1176
|
+
margin: 2px 0 0;
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1179
|
+
.lb-mix-match__modal-product-unit-price[hidden] {
|
|
1180
|
+
display: none;
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1136
1183
|
.lb-mix-match__variant-select {
|
|
1137
1184
|
font-size: 12px;
|
|
1138
1185
|
margin: 4px 0 0;
|
|
@@ -1242,7 +1289,7 @@
|
|
|
1242
1289
|
transition: none;
|
|
1243
1290
|
}
|
|
1244
1291
|
}
|
|
1245
|
-
|
|
1292
|
+
`,$e=`/* Lime Bundles \u2014 Volume / Quantity Breaks styles */
|
|
1246
1293
|
|
|
1247
1294
|
.lb-volume__tiers {
|
|
1248
1295
|
display: flex;
|
|
@@ -1352,7 +1399,7 @@
|
|
|
1352
1399
|
}
|
|
1353
1400
|
|
|
1354
1401
|
|
|
1355
|
-
`,
|
|
1402
|
+
`,Ne=`/* Lime Bundles \u2014 web-component loading skeleton (not mirrored to theme assets) */
|
|
1356
1403
|
|
|
1357
1404
|
.lb-bundle-widget--loading {
|
|
1358
1405
|
display: block;
|
|
@@ -1448,10 +1495,10 @@
|
|
|
1448
1495
|
animation: none;
|
|
1449
1496
|
}
|
|
1450
1497
|
}
|
|
1451
|
-
`;var
|
|
1452
|
-
`),this.shadow.appendChild(t),this.shopCustomCss){let i=document.createElement("style");i.setAttribute("data-lime-bundles","shop-custom-css"),i.textContent=this.shopCustomCss,this.shadow.appendChild(i)}for(let i of this.bundles){let
|
|
1453
|
-
<style>${
|
|
1454
|
-
<style>${
|
|
1498
|
+
`;var Qt=e=>`lb_cart_id:${e}`;function Kt(e){if(e)return e.trim()||null;if(typeof document<"u"){let t=document.querySelector('meta[name="shopify:product-handle"]');if(t?.content)return t.content.trim()||null}if(typeof window<"u"){let t=window.location.pathname.match(/\/products\/([^/?#]+)/);if(t?.[1])return decodeURIComponent(t[1])}return null}var G=class extends HTMLElement{static observedAttributes=["shop-domain","storefront-token","bundle-gid","product-handle","app-url","analytics","locale"];shadow;bundles=[];abortController=null;impressionCleanups=[];renderCleanups=[];shopCustomCss=null;constructor(){super(),this.shadow=this.attachShadow({mode:"open"})}connectedCallback(){this.fetchBundle()}disconnectedCallback(){this.abortController?.abort(),this.teardownImpressions(),this.teardownRenderers()}teardownImpressions(){for(let t of this.impressionCleanups)t();this.impressionCleanups=[]}teardownRenderers(){for(let t of this.renderCleanups)t();this.renderCleanups=[]}attributeChangedCallback(t,r,i){r===i||!this.isConnected||(t==="bundle-gid"||t==="product-handle"||t==="shop-domain"||t==="storefront-token")&&this.shopDomain&&this.storefrontToken&&this.fetchBundle()}get shopDomain(){return this.getAttribute("shop-domain")??""}get storefrontToken(){return this.getAttribute("storefront-token")??""}get bundleGid(){return this.getAttribute("bundle-gid")??""}get productHandleAttr(){return this.getAttribute("product-handle")??""}get appUrl(){return this.getAttribute("app-url")??""}get analyticsEnabled(){return this.getAttribute("analytics")!=="false"}async fetchBundle(){if(!this.shopDomain||!this.storefrontToken){this.renderError("Missing required attributes: shop-domain, storefront-token");return}this.abortController?.abort();let t=new AbortController;this.abortController=t,this.renderLoading();let r=X({shopDomain:this.shopDomain,accessToken:this.storefrontToken});try{let i,n=!1;if(this.bundleGid)n=!0,i=this.fetchSingleBundle(r,t.signal);else{let d=Kt(this.productHandleAttr);if(!d){this.teardownImpressions(),this.renderError("No bundle-gid or product-handle provided, and the current URL doesn't match /products/<handle>.");return}i=this.fetchProductBundles(r,t.signal,d)}let a=r.query(be,void 0,{signal:t.signal}).catch(()=>null);if(await i,t.signal.aborted)return;if(n&&this.bundles.length===0){this.teardownImpressions(),this.renderError("Bundle not found");return}let o=await a;if(o?.shop?.metafield?.value){Se(this.shopDomain,o.shop.metafield.value);let d=ee(o.shop.metafield.value);d.ok&&(this.shopCustomCss=d.css)}await this.applyABVariants(),this.renderBundles()}catch(i){if(t.signal.aborted)return;this.bundles=[],this.teardownImpressions(),this.renderError(i instanceof Error?i.message:"Failed to load bundle")}}async applyABVariants(){if(!this.appUrl||this.bundles.length===0)return;let t=await Promise.all(this.bundles.map(async r=>{if(!r.abTestId||!r.abVariantB)return r;try{if((await ke(this.appUrl,this.shopDomain,r.abTestId,r.id))?.variant==="B")return xe(r)}catch(i){console.warn(`[lime-bundle] A/B assignment failed for bundle ${r.id}; falling back to Variant A.`,i)}return r}));this.bundles=t}async fetchSingleBundle(t,r){let i=await t.query(pe,{id:this.bundleGid},{signal:r});if(!i.metaobject){this.bundles=[];return}let n=J(i.metaobject.id,i.metaobject.fields);this.bundles=n?[n]:[]}async fetchProductBundles(t,r,i){let n=await t.query(he,{handle:i},{signal:r});if(!n.product){this.bundles=[];return}let a=n.product.metafield?.references?.nodes??[],o=[];for(let d of a){let l=J(d.id,d.fields);l&&o.push(l)}this.bundles=o}handleAddToCart=async(t,r)=>{let i=new CustomEvent("lime-bundle:add-to-cart",{detail:{lines:r},bubbles:!0,composed:!0,cancelable:!0}),n=this.dispatchEvent(i);this.reportAddToCartEvent(t,r),n&&await this.defaultAddToCart(r)};async defaultAddToCart(t){if(typeof window>"u")return;let r=X({shopDomain:this.shopDomain,accessToken:this.storefrontToken}),i=window.localStorage,n=Qt(this.shopDomain),a=i?.getItem(n)??null;try{let o=null;if(a){let l=(await r.query(ge,{cartId:a,lines:t})).cartLinesAdd;l?.userErrors?.length?i?.removeItem(n):l?.cart&&(o=l.cart.checkoutUrl)}if(!o){let l=(await r.query(me,{input:{lines:t}})).cartCreate;l?.cart&&(i?.setItem(n,l.cart.id),o=l.cart.checkoutUrl)}o?window.location.assign(o):this.dispatchEvent(new CustomEvent("lime-bundle:error",{detail:{message:"Cart creation failed",code:"CART_ERROR"},bubbles:!0,composed:!0}))}catch(o){this.dispatchEvent(new CustomEvent("lime-bundle:error",{detail:{message:o instanceof Error?o.message:"Cart mutation failed",code:"CART_ERROR"},bubbles:!0,composed:!0}))}}reportAddToCartEvent(t,r){if(!this.analyticsEnabled||!this.appUrl)return;let i=r.reduce((a,o)=>a+o.quantity,0),n=r.reduce((a,o)=>{let l=t.products.find(c=>c.variants.nodes.some(p=>p.id===o.merchandiseId))?.variants.nodes.find(c=>c.id===o.merchandiseId),u=l?parseFloat(l.price.amount):0;return a+u*o.quantity},0);ye({shopDomain:this.shopDomain,appUrl:this.appUrl},{bundleGid:t.id,bundleType:t.bundleType,productId:t.products[0]?.id??"",quantity:i,totalPrice:Math.round(n*100)/100})}renderBundles(){this.teardownImpressions(),this.teardownRenderers(),this.shadow.innerHTML="";let t=document.createElement("style");if(t.textContent=[ie,Oe,He,$e].join(`
|
|
1499
|
+
`),this.shadow.appendChild(t),this.shopCustomCss){let i=document.createElement("style");i.setAttribute("data-lime-bundles","shop-custom-css"),i.textContent=this.shopCustomCss,this.shadow.appendChild(i)}for(let i of this.bundles){let n=document.createElement("div");n.className="lb-bundle-widget",n.setAttribute("role","region"),n.setAttribute("aria-label",i.title),n.setAttribute("data-bundle-type",i.bundleType),n.setAttribute("data-bundle-gid",i.id),fe(n,i.widgetConfig);let a=d=>this.handleAddToCart(i,d),o=d=>this.renderCleanups.push(d);switch(i.bundleType){case"fixed":Ee(n,i,a,o);break;case"mix_match":Re(n,i,a,o);break;case"volume":Ue(n,i,a,o);break}this.shadow.appendChild(n),this.setupImpressionFor(i,n)}let r=this.bundles[0];this.dispatchEvent(new CustomEvent("lime-bundle:loaded",{detail:{bundleCount:this.bundles.length,bundleTypes:this.bundles.map(i=>i.bundleType),bundleType:r?.bundleType,title:r?.title},bubbles:!0,composed:!0}))}setupImpressionFor(t,r){if(!this.analyticsEnabled||!this.appUrl)return;let i=we(r,()=>{Ce({shopDomain:this.shopDomain,appUrl:this.appUrl},{bundleGid:t.id,bundleType:t.bundleType})});this.impressionCleanups.push(i)}renderLoading(){this.shadow.innerHTML=`
|
|
1500
|
+
<style>${ie}</style>
|
|
1501
|
+
<style>${Ne}</style>
|
|
1455
1502
|
<div class="lb-bundle-widget lb-bundle-widget--loading" aria-busy="true" aria-label="Loading bundle">
|
|
1456
1503
|
<div class="lb-skeleton lb-skeleton--title"></div>
|
|
1457
1504
|
<div class="lb-skeleton--products">
|
|
@@ -1485,5 +1532,5 @@
|
|
|
1485
1532
|
<div class="lb-skeleton lb-skeleton--cta"></div>
|
|
1486
1533
|
</div>
|
|
1487
1534
|
</div>
|
|
1488
|
-
`}renderError(t){this.shadow.innerHTML="",this.dispatchEvent(new CustomEvent("lime-bundle:error",{detail:{message:t,code:"LOAD_ERROR"},bubbles:!0,composed:!0}))}};typeof customElements<"u"&&!customElements.get("lime-bundle")&&customElements.define("lime-bundle",
|
|
1535
|
+
`}renderError(t){this.shadow.innerHTML="",this.dispatchEvent(new CustomEvent("lime-bundle:error",{detail:{message:t,code:"LOAD_ERROR"},bubbles:!0,composed:!0}))}};typeof customElements<"u"&&!customElements.get("lime-bundle")&&customElements.define("lime-bundle",G);return Qe(Yt);})();
|
|
1489
1536
|
//# sourceMappingURL=lime-bundle.global.js.map
|