@best-bundles/bundle-ui 0.0.45 → 0.0.47
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/components/BundleBuilderDrawer.d.ts.map +1 -1
- package/dist/components/BundleBuilderPanel.d.ts.map +1 -1
- package/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/context/BundleProvider.d.ts +12 -1
- package/dist/context/BundleProvider.d.ts.map +1 -1
- package/dist/i18n.d.ts +1 -1
- package/dist/i18n.d.ts.map +1 -1
- package/dist/index.js +2031 -1522
- package/dist/index.js.map +1 -1
- package/dist/liquid/bundle-ui.iife.css +1 -1
- package/dist/liquid/bundle-ui.iife.js +24 -19
- package/dist/liquid/bundle-ui.iife.js.map +1 -1
- package/dist/liquid/iife.d.ts +8 -1
- package/dist/liquid/iife.d.ts.map +1 -1
- package/dist/stories/BundleBuilderPanel.stories.d.ts +1 -0
- package/dist/stories/BundleBuilderPanel.stories.d.ts.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/constants.ts","../src/api/fetchActiveBundleConfigs.ts","../src/api/fetchBundleConfig.ts","../src/api/fetchBundleConfigStatus.ts","../src/utils/stock.ts","../src/utils/analytics.ts","../src/i18n.ts","../src/context/BundleProvider.tsx","../src/hooks/useBundleBuilder.ts","../src/hooks/useBundleBuilderDrawer.ts","../src/components/BundleButton.tsx","../../../node_modules/tween-functions/index.js","../../../node_modules/react-confetti/dist/react-confetti.mjs","../../../node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/lucide-react/dist/esm/icons/plus.js","../../../node_modules/lucide-react/dist/esm/icons/search.js","../../../node_modules/lucide-react/dist/esm/icons/trash-2.js","../src/components/BundleBuilderDrawer.tsx","../src/components/BundleBuilderPanel.tsx","../src/components/VolumeDiscountPanel.tsx","../src/adapters/LiquidAdapter.ts"],"sourcesContent":["export const BundleLineAttributeKeys = {\n bundleId: \"_bundle_id\",\n bundleConfig: \"_bundle_config\",\n bundleSource: \"_bundle_source\",\n bundleTitle: \"_bundle_title\",\n} as const;\n\n","import type { PublicActiveBundleConfigsResponse } from \"../types\";\n\nexport async function fetchActiveBundleConfigs(params: {\n apiBaseUrl: string;\n shop: string;\n signal?: AbortSignal;\n}): Promise<PublicActiveBundleConfigsResponse> {\n const url = new URL(\"/api/public/bundle-configs-active\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicActiveBundleConfigsResponse;\n}\n","import type { PublicBundleConfigResponse } from \"../types\";\n\nexport async function fetchBundleConfig(params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n fresh?: boolean;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigResponse> {\n const url = new URL(\"/api/public/bundle-config\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n if (params.configHandle) {\n url.searchParams.set(\"handle\", params.configHandle);\n }\n if (params.fresh) {\n url.searchParams.set(\"fresh\", \"1\");\n }\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n // The endpoint uses 4xx/5xx for some errors; normalize to {ok:false}.\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigResponse;\n}\n","import type { PublicBundleConfigStatusResponse } from \"../types\";\n\nexport async function fetchBundleConfigStatus(params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigStatusResponse> {\n const url = new URL(\"/api/public/bundle-config-status\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n if (params.configHandle) {\n url.searchParams.set(\"handle\", params.configHandle);\n }\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigStatusResponse;\n}\n","import type { BundleEligibleVariant } from \"../types\";\n\nexport function getVariantSelectionLimit(variant: BundleEligibleVariant | null | undefined) {\n if (!variant || variant.availableForSale === false) return 0;\n if (variant.inventoryPolicy === \"CONTINUE\") return Number.POSITIVE_INFINITY;\n // Untracked inventory can surface as null/0 sellable quantity while still available for sale.\n if (variant.sellableOnlineQuantity == null) return Number.POSITIVE_INFINITY;\n\n const quantity = Number(variant.sellableOnlineQuantity);\n if (!Number.isFinite(quantity)) return Number.POSITIVE_INFINITY;\n if (quantity <= 0 && variant.availableForSale === true) return Number.POSITIVE_INFINITY;\n return Math.max(0, Math.floor(quantity));\n}\n\nexport function isVariantAtStockLimit(\n variant: BundleEligibleVariant | null | undefined,\n quantity: number,\n) {\n const limit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(limit)) return false;\n return Math.max(0, Math.floor(quantity || 0)) >= limit;\n}\n","const ANONYMOUS_USER_ID_KEY = \"bb_anonymous_user_id\";\n\n/**\n * Gets or creates an anonymous user ID stored in localStorage.\n * This ID persists across sessions to attribute events to the same user.\n */\nexport function getOrCreateAnonymousUserId(): string {\n if (typeof window === \"undefined\" || typeof localStorage === \"undefined\") {\n // Fallback for SSR or environments without localStorage\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n try {\n const existing = localStorage.getItem(ANONYMOUS_USER_ID_KEY);\n if (existing && typeof existing === \"string\" && existing.length > 0) {\n return existing;\n }\n\n // Generate new ID\n let newId: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) {\n newId = cryptoAny.randomUUID();\n } else {\n throw new Error(\"crypto.randomUUID not available\");\n }\n } catch {\n // Fallback UUID generation\n newId = `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n localStorage.setItem(ANONYMOUS_USER_ID_KEY, newId);\n return newId;\n } catch {\n // If localStorage fails, generate a temporary ID\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n\nexport type AnalyticsEventType =\n | \"DRAWER_OPENED\"\n | \"DRAWER_CLOSED\"\n | \"VARIANT_SELECTION_CHANGED\"\n | \"BUNDLE_ADDED_TO_BASKET\";\n\n/** Mixpanel event names used for the bundle funnel (backend maps these to Mixpanel). */\nexport type MixpanelBundleEventName =\n | \"bundle_opened\"\n | \"bundle_closed\"\n | \"bundle_started\"\n | \"bundle_completed\"\n | \"bundle_added_to_cart\"\n | \"checkout_started_with_bundle\";\n\nexport type DrawerOpenedEvent = {\n eventType: \"DRAWER_OPENED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_opened\";\n};\n\nexport type DrawerClosedEvent = {\n eventType: \"DRAWER_CLOSED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_closed\";\n};\n\nexport type VariantSelectionChangedEvent = {\n eventType: \"VARIANT_SELECTION_CHANGED\";\n shop: string;\n anonymousUserId: string;\n before: Record<string, number>; // variantId -> quantity\n after: Record<string, number>;\n timestamp: string;\n mixpanelEvent?: \"bundle_started\" | \"bundle_completed\";\n};\n\nexport type BundleAddedToBasketEvent = {\n eventType: \"BUNDLE_ADDED_TO_BASKET\";\n shop: string;\n anonymousUserId: string;\n bundleId: string;\n productVariantIds: string[];\n grossPrice: number;\n discountedPrice: number;\n currency?: string;\n discountThresholdIdentifier: string; // rule handle\n discountLabel: string;\n discountPercentage: number | null;\n discountedAmount: number;\n timestamp: string;\n checkout?: boolean;\n mixpanelEvent?: \"bundle_added_to_cart\" | \"checkout_started_with_bundle\";\n};\n\nexport type AnalyticsEvent =\n | DrawerOpenedEvent\n | DrawerClosedEvent\n | VariantSelectionChangedEvent\n | BundleAddedToBasketEvent;\n\n/**\n * Sends an analytics event to the backend API endpoint.\n * Failures are silently caught to prevent breaking bundle functionality.\n */\nexport async function trackEvent(\n analyticsEndpoint: string,\n shop: string,\n event: AnalyticsEvent,\n): Promise<void> {\n if (typeof window === \"undefined\") {\n return; // Skip in SSR\n }\n\n try {\n const url = new URL(analyticsEndpoint, window.location.origin);\n url.searchParams.set(\"shop\", shop);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(event),\n // Don't wait for response - fire and forget\n keepalive: true,\n });\n\n if (!response.ok) {\n console.warn(\n `[Bundle Analytics] Event tracking failed with status ${response.status}:`,\n await response.text().catch(() => \"Unable to read response\"),\n );\n }\n } catch (error) {\n // Log error for debugging but don't break bundle functionality\n console.warn(\"[Bundle Analytics] Failed to track event:\", error);\n }\n}\n","export type BundleUiLocale = \"en\" | \"fr\" | \"de\" | \"es\";\n\nexport type BundleUiMessageKey =\n | \"bundle.title.default\"\n | \"bundle.loading\"\n | \"bundle.empty\"\n | \"bundle.drawer.aria\"\n | \"bundle.search\"\n | \"bundle.search.expanded\"\n | \"bundle.search.placeholder\"\n | \"bundle.search.clear\"\n | \"bundle.close\"\n | \"bundle.section.discount_tiers\"\n | \"bundle.section.your_bundle\"\n | \"bundle.section.select_items\"\n | \"bundle.select.items\"\n | \"bundle.size.min\"\n | \"bundle.stock.max_reached\"\n | \"bundle.stock.max_added\"\n | \"bundle.stock.sold_out\"\n | \"bundle.item.generic\"\n | \"bundle.slot\"\n | \"bundle.unlocks\"\n | \"bundle.totals\"\n | \"bundle.discount.badge\"\n | \"bundle.discount.off_label\"\n | \"bundle.celebration.received_discount\"\n | \"bundle.cta.adding\"\n | \"bundle.cta.processing\"\n | \"bundle.cta.checkout\"\n | \"bundle.cta.add_to_bundle\"\n | \"bundle.cta.add_to_basket\"\n | \"bundle.cta.add_more\"\n | \"bundle.powered_by\"\n | \"bundle.button.default\"\n | \"bundle.provider.inactive_error\"\n | \"bundle.provider.load_error\"\n | \"bundle.provider.stock_error\"\n | \"bundle.provider.add_error\"\n | \"bundle.a11y.add_to_bundle\"\n | \"bundle.a11y.remove_from_bundle\"\n | \"bundle.a11y.quantity\"\n | \"bundle.a11y.sold_out\"\n | \"bundle.a11y.max_available_selected\"\n | \"bundle.a11y.increase\"\n | \"bundle.a11y.decrease\";\n\nexport type BundleUiMessages = Partial<Record<BundleUiMessageKey, string>>;\n\ntype Dict = Record<BundleUiMessageKey, string>;\n\nconst EN: Dict = {\n \"bundle.title.default\": \"Build your bundle\",\n \"bundle.loading\": \"Loading...\",\n \"bundle.empty\": \"Your selected eligible products for bundling will show here\",\n \"bundle.drawer.aria\": \"Bundle builder\",\n \"bundle.search\": \"Search\",\n \"bundle.search.expanded\": \"Search (expanded)\",\n \"bundle.search.placeholder\": \"Search\",\n \"bundle.search.clear\": \"Clear search\",\n \"bundle.close\": \"Close\",\n \"bundle.section.discount_tiers\": \"Discount tiers\",\n \"bundle.section.your_bundle\": \"Your bundle\",\n \"bundle.section.select_items\": \"Choose items\",\n \"bundle.select.items\": \"Select items\",\n \"bundle.size.min\": \"(min {{min}})\",\n \"bundle.stock.max_reached\": \"Max Reached\",\n \"bundle.stock.max_added\": \"Max Added To Cart\",\n \"bundle.stock.sold_out\": \"Sold Out\",\n \"bundle.item.generic\": \"Item\",\n \"bundle.slot\": \"Slot {{slot}}\",\n \"bundle.unlocks\": \"Unlocks {{discount}}\",\n \"bundle.totals\": \"Totals\",\n \"bundle.discount.badge\": \"{{discount}}% Discount\",\n \"bundle.discount.off_label\": \"{{discount}}% off\",\n \"bundle.celebration.received_discount\": \"You received a {{discount}}% discount!\",\n \"bundle.cta.adding\": \"Adding...\",\n \"bundle.cta.processing\": \"Processing...\",\n \"bundle.cta.checkout\": \"Checkout\",\n \"bundle.cta.add_to_bundle\": \"Add\",\n \"bundle.cta.add_to_basket\": \"Add to Basket\",\n \"bundle.cta.add_more\": \"Add {{count}} more {{productWord}}\",\n \"bundle.powered_by\": \"powered by\",\n \"bundle.button.default\": \"Build a bundle\",\n \"bundle.provider.inactive_error\": \"Bundle is inactive.\",\n \"bundle.provider.load_error\": \"Failed to load bundle config.\",\n \"bundle.provider.stock_error\": \"Some bundle items are no longer available in the requested quantity. Please review your selection.\",\n \"bundle.provider.add_error\": \"We couldn't add this bundle right now. Please try again.\",\n \"bundle.a11y.add_to_bundle\": \"Add {{name}} to bundle\",\n \"bundle.a11y.remove_from_bundle\": \"Remove {{name}} from bundle\",\n \"bundle.a11y.quantity\": \"{{name}} quantity {{qty}}\",\n \"bundle.a11y.sold_out\": \"{{name}} is sold out\",\n \"bundle.a11y.max_available_selected\": \"{{name}} max available selected\",\n \"bundle.a11y.increase\": \"Increase {{name}}\",\n \"bundle.a11y.decrease\": \"Decrease {{name}}\",\n};\n\nconst FR: Dict = {\n ...EN,\n \"bundle.title.default\": \"Creez votre bundle\",\n \"bundle.loading\": \"Chargement...\",\n \"bundle.empty\": \"Vos produits eligibles selectionnes pour le bundle apparaitront ici\",\n \"bundle.drawer.aria\": \"Constructeur de bundle\",\n \"bundle.search\": \"Rechercher\",\n \"bundle.search.expanded\": \"Rechercher (deplie)\",\n \"bundle.search.placeholder\": \"Rechercher\",\n \"bundle.search.clear\": \"Effacer la recherche\",\n \"bundle.close\": \"Fermer\",\n \"bundle.section.discount_tiers\": \"Paliers de remise\",\n \"bundle.section.your_bundle\": \"Votre bundle\",\n \"bundle.section.select_items\": \"Choisir des articles\",\n \"bundle.select.items\": \"Selectionner des articles\",\n \"bundle.stock.max_reached\": \"Maximum atteint\",\n \"bundle.stock.max_added\": \"Maximum deja dans le panier\",\n \"bundle.stock.sold_out\": \"Rupture de stock\",\n \"bundle.totals\": \"Totaux\",\n \"bundle.discount.badge\": \"{{discount}}% de réduction\",\n \"bundle.discount.off_label\": \"{{discount}}% de réduction\",\n \"bundle.celebration.received_discount\": \"Vous avez recu une reduction de {{discount}}% !\",\n \"bundle.cta.checkout\": \"Paiement\",\n \"bundle.cta.add_to_bundle\": \"Ajouter\",\n \"bundle.cta.add_to_basket\": \"Ajouter au panier\",\n \"bundle.cta.add_more\": \"Ajoutez encore {{count}} {{productWord}}\",\n \"bundle.powered_by\": \"propulse par\",\n \"bundle.button.default\": \"Creer un bundle\",\n};\n\nconst DE: Dict = {\n ...EN,\n \"bundle.title.default\": \"Bundle erstellen\",\n \"bundle.loading\": \"Wird geladen...\",\n \"bundle.empty\": \"Ihre ausgewahlten bundelbaren Produkte werden hier angezeigt\",\n \"bundle.drawer.aria\": \"Bundle-Builder\",\n \"bundle.search\": \"Suchen\",\n \"bundle.search.expanded\": \"Suche (erweitert)\",\n \"bundle.search.placeholder\": \"Suchen\",\n \"bundle.search.clear\": \"Suche loschen\",\n \"bundle.close\": \"Schliessen\",\n \"bundle.section.discount_tiers\": \"Rabattstufen\",\n \"bundle.section.your_bundle\": \"Ihr Bundle\",\n \"bundle.section.select_items\": \"Artikel auswahlen\",\n \"bundle.select.items\": \"Artikel auswahlen\",\n \"bundle.stock.max_reached\": \"Maximum erreicht\",\n \"bundle.stock.max_added\": \"Maximum bereits im Warenkorb\",\n \"bundle.stock.sold_out\": \"Ausverkauft\",\n \"bundle.totals\": \"Summen\",\n \"bundle.discount.badge\": \"{{discount}}% Rabatt\",\n \"bundle.discount.off_label\": \"{{discount}}% Rabatt\",\n \"bundle.celebration.received_discount\": \"Sie haben {{discount}}% Rabatt erhalten!\",\n \"bundle.cta.checkout\": \"Zur Kasse\",\n \"bundle.cta.add_to_bundle\": \"Hinzufügen\",\n \"bundle.cta.add_to_basket\": \"In den Warenkorb\",\n \"bundle.cta.add_more\": \"Fuge noch {{count}} {{productWord}} hinzu\",\n \"bundle.powered_by\": \"powered by\",\n \"bundle.button.default\": \"Bundle erstellen\",\n};\n\nconst ES: Dict = {\n ...EN,\n \"bundle.title.default\": \"Crea tu bundle\",\n \"bundle.loading\": \"Cargando...\",\n \"bundle.empty\": \"Tus productos elegibles seleccionados para el bundle se mostraran aqui\",\n \"bundle.drawer.aria\": \"Constructor de bundles\",\n \"bundle.search\": \"Buscar\",\n \"bundle.search.expanded\": \"Buscar (expandido)\",\n \"bundle.search.placeholder\": \"Buscar\",\n \"bundle.search.clear\": \"Limpiar busqueda\",\n \"bundle.close\": \"Cerrar\",\n \"bundle.section.discount_tiers\": \"Niveles de descuento\",\n \"bundle.section.your_bundle\": \"Tu bundle\",\n \"bundle.section.select_items\": \"Elegir articulos\",\n \"bundle.select.items\": \"Seleccionar articulos\",\n \"bundle.stock.max_reached\": \"Maximo alcanzado\",\n \"bundle.stock.max_added\": \"Maximo agregado al carrito\",\n \"bundle.stock.sold_out\": \"Agotado\",\n \"bundle.totals\": \"Totales\",\n \"bundle.discount.badge\": \"{{discount}}% de descuento\",\n \"bundle.discount.off_label\": \"{{discount}}% de descuento\",\n \"bundle.celebration.received_discount\": \"Has recibido un {{discount}}% de descuento!\",\n \"bundle.cta.checkout\": \"Pagar\",\n \"bundle.cta.add_to_bundle\": \"Agregar\",\n \"bundle.cta.add_to_basket\": \"Agregar al carrito\",\n \"bundle.cta.add_more\": \"Agrega {{count}} {{productWord}} mas\",\n \"bundle.powered_by\": \"impulsado por\",\n \"bundle.button.default\": \"Crear bundle\",\n};\n\nconst DICTS: Record<BundleUiLocale, Dict> = {\n en: EN,\n fr: FR,\n de: DE,\n es: ES,\n};\n\nexport function normalizeBundleLocale(raw: string | null | undefined): BundleUiLocale {\n const value = String(raw ?? \"\").trim().toLowerCase();\n if (!value) return \"en\";\n const base = value.split(\"-\")[0] ?? \"en\";\n if (base === \"fr\" || base === \"de\" || base === \"en\" || base === \"es\") return base;\n return \"en\";\n}\n\nexport function translateBundleUi(\n locale: BundleUiLocale,\n key: BundleUiMessageKey,\n vars?: Record<string, string | number>,\n overrides?: BundleUiMessages,\n): string {\n const template = overrides?.[key] ?? DICTS[locale]?.[key] ?? EN[key] ?? key;\n if (!vars) return template;\n return Object.entries(vars).reduce((text, [name, value]) => {\n return text.replaceAll(`{{${name}}}`, String(value));\n }, template);\n}\n\nexport function formatBundleCurrency(amount: string | number, currencyCode: string | null, locale: string) {\n const n = Number(amount);\n if (!Number.isFinite(n)) return String(amount);\n\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(locale || undefined, { style: \"currency\", currency: currencyCode }).format(n);\n } catch {\n // ignore and fall through\n }\n }\n\n return `$${n.toFixed(2)}`;\n}\n\nexport function getProductWord(locale: BundleUiLocale, count: number) {\n const plural = count === 1 ? \"one\" : \"many\";\n if (locale === \"fr\") return plural === \"one\" ? \"produit\" : \"produits\";\n if (locale === \"de\") return plural === \"one\" ? \"Produkt\" : \"Produkte\";\n if (locale === \"es\") return plural === \"one\" ? \"producto\" : \"productos\";\n return plural === \"one\" ? \"product\" : \"products\";\n}\n","import { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { fetchActiveBundleConfigs } from \"../api/fetchActiveBundleConfigs\";\nimport { fetchBundleConfig as defaultFetchBundleConfig } from \"../api/fetchBundleConfig\";\nimport { fetchBundleConfigStatus } from \"../api/fetchBundleConfigStatus\";\nimport { BundleLineAttributeKeys } from \"../constants\";\nimport type {\n BundleCartAdapter,\n BundleConfig,\n BundleEligibleVariant,\n PublicActiveBundleConfigsResponse,\n PublicBundleConfigResponse,\n PublicBundleConfigStatusResponse,\n StyleSettings,\n} from \"../types\";\nimport { getVariantSelectionLimit } from \"../utils/stock\";\nimport { getOrCreateAnonymousUserId, trackEvent } from \"../utils/analytics\";\nimport type { BundleUiLocale, BundleUiMessageKey, BundleUiMessages } from \"../i18n\";\nimport { normalizeBundleLocale, translateBundleUi } from \"../i18n\";\n\ntype BundleProviderData = {\n currencyCode: string | null;\n config: BundleConfig;\n eligibleVariants: BundleEligibleVariant[];\n};\n\ntype BundleProviderCacheEntry = BundleProviderData;\ntype BundleConfigCache = Record<string, BundleProviderCacheEntry>;\ntype BundleSelectionState = Record<string, number>;\ntype BundleSelectionOrder = string[];\ntype OpenSource = \"api\" | \"hash\" | \"click\";\n\nexport type BundleProviderProps = {\n apiBaseUrl: string;\n shop: string;\n cartAdapter: BundleCartAdapter;\n configHandle?: string;\n initialData?: BundleProviderData;\n configFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n fresh?: boolean;\n signal?: AbortSignal;\n }) => Promise<PublicBundleConfigResponse>;\n activeConfigsFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n signal?: AbortSignal;\n }) => Promise<PublicActiveBundleConfigsResponse>;\n configStatusFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n }) => Promise<PublicBundleConfigStatusResponse>;\n analyticsEndpoint?: string;\n allowDrawerWhenInactive?: boolean;\n locale?: string;\n messages?: BundleUiMessages;\n children: React.ReactNode;\n};\n\nexport type BundleBuilderContextValue = {\n isOpen: boolean;\n open: () => void;\n openForHandle: (handle: string, source?: OpenSource) => void;\n close: () => void;\n toggle: () => void;\n syncCartQuantities: () => Promise<void>;\n currentHandle: string;\n setConfigHandle: (handle: string) => void;\n loadHandle: (handle: string) => void;\n\n loading: boolean;\n submitting: boolean;\n error: string | null;\n\n currencyCode: string | null;\n config: BundleConfig | null;\n eligibleVariants: BundleEligibleVariant[];\n\n selections: BundleSelectionState;\n selectionOrder: BundleSelectionOrder;\n getVariantMaxSelectableQuantity: (merchandiseId: string) => number | null;\n setQuantity: (merchandiseId: string, quantity: number) => void;\n clearSelections: () => void;\n\n bundleSize: number;\n minRequired: number;\n canSubmit: boolean;\n submit: () => Promise<void>;\n submitAndCheckout: () => Promise<void>;\n locale: BundleUiLocale;\n t: (key: BundleUiMessageKey, vars?: Record<string, string | number>) => string;\n};\n\nexport const BundleBuilderContext = createContext<BundleBuilderContextValue | null>(null);\n\nconst BUNDLE_DRAWER_HASH = \"#best-bundles\";\nconst EMPTY_ELIGIBLE_VARIANTS: BundleEligibleVariant[] = [];\n\nfunction normalizeBundleHandle(raw: string | null | undefined) {\n const value = String(raw ?? \"\").trim().toLowerCase();\n if (!value) return \"default\";\n const cleaned = value\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+/, \"\")\n .replace(/-+$/, \"\")\n .replace(/-{2,}/g, \"-\");\n return cleaned || \"default\";\n}\n\nfunction getBundleHashHandle(hash: string): string | null {\n const value = String(hash ?? \"\").trim().toLowerCase();\n if (!value.startsWith(BUNDLE_DRAWER_HASH)) return null;\n if (value === BUNDLE_DRAWER_HASH) return \"default\";\n const prefix = `${BUNDLE_DRAWER_HASH}:`;\n if (!value.startsWith(prefix)) return null;\n return normalizeBundleHandle(value.slice(prefix.length));\n}\n\ntype StyleSettingCssVarKey = Exclude<keyof StyleSettings, \"confettiColors\">;\nconst STYLE_SETTINGS_TO_CSS_VAR: Record<StyleSettingCssVarKey, string> = {\n primaryColor: \"--bb-cta-bg\",\n primaryHoverColor: \"--bb-cta-bg-hover\",\n primaryTextColor: \"--bb-cta-text\",\n backgroundColor: \"--bb-surface-bg\",\n backdropColor: \"--bb-backdrop-bg\",\n textColor: \"--bb-text-color\",\n titleColor: \"--bb-title-color\",\n mutedTextColor: \"--bb-muted-color\",\n borderRadius: \"--bb-panel-radius\",\n borderColor: \"--bb-border-color\",\n borderStrongColor: \"--bb-border-strong-color\",\n focusRingColor: \"--bb-focus-ring\",\n tierBorderColor: \"--bb-tier-border\",\n tierTextColor: \"--bb-tier-text\",\n tierBackgroundColor: \"--bb-tier-bg\",\n celebrationTextColor: \"--bb-celebration-text\",\n celebrationBgTop: \"--bb-celebration-bg-top\",\n celebrationBgBottom: \"--bb-celebration-bg-bottom\",\n celebrationBorderColor: \"--bb-celebration-border\",\n fontFamilyBody: \"--bb-font-family-body\",\n fontFamilyTitle: \"--bb-font-family-title\",\n};\n\nconst GOOGLE_FONTS_LINK_ID = \"bb-google-fonts\";\n\nfunction fontNameToParam(name: string): string {\n const s = (name ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n return s ? encodeURIComponent(s).replace(/%20/g, \"+\") : \"\";\n}\n\nfunction injectGoogleFontsLink(styles: StyleSettings | undefined) {\n if (typeof document === \"undefined\" || !document.head) return;\n if (!styles) {\n document.getElementById(GOOGLE_FONTS_LINK_ID)?.remove();\n return;\n }\n const body = (styles.fontFamilyBody ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const title = (styles.fontFamilyTitle ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const families: string[] = [];\n if (body) families.push(\"family=\" + fontNameToParam(body));\n if (title && title !== body) families.push(\"family=\" + fontNameToParam(title));\n const existing = document.getElementById(GOOGLE_FONTS_LINK_ID) as HTMLLinkElement | null;\n if (families.length === 0) {\n existing?.remove();\n return;\n }\n const href = `https://fonts.googleapis.com/css2?${families.join(\"&\")}&display=swap`;\n if (existing) {\n if (existing.getAttribute(\"href\") !== href) existing.setAttribute(\"href\", href);\n return;\n }\n const link = document.createElement(\"link\");\n link.id = GOOGLE_FONTS_LINK_ID;\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n}\n\nfunction injectStyleVariables(styles: StyleSettings | undefined) {\n if (!styles) return;\n injectGoogleFontsLink(styles);\n const root = document.documentElement;\n (Object.entries(STYLE_SETTINGS_TO_CSS_VAR) as Array<[StyleSettingCssVarKey, string]>).forEach(([key, cssVar]) => {\n let value = styles[key];\n if (value) {\n if ((key === \"fontFamilyBody\" || key === \"fontFamilyTitle\") && /^\\s*\\S+\\s+\\S/.test(value) && !/^[\"']/.test(value.trim())) {\n value = `\"${value.trim().replace(/^[\"']|[\"']$/g, \"\")}\"`;\n }\n root.style.setProperty(cssVar, value);\n }\n });\n}\n\nfunction getEffectiveStyleSettings(configSettings: StyleSettings | undefined): StyleSettings | undefined {\n if (typeof window === \"undefined\") return configSettings;\n const preview = (window as Window & { __BUNDLE_PREVIEW_STYLES__?: StyleSettings }).__BUNDLE_PREVIEW_STYLES__;\n if (preview && typeof preview === \"object\") return preview;\n return configSettings;\n}\n\nfunction safeRandomUUID() {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) return cryptoAny.randomUUID();\n } catch {\n // ignore\n }\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction clampQty(n: number) {\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.floor(n));\n}\n\nfunction clampToVariantLimit(quantity: number, limit: number) {\n const normalized = clampQty(quantity);\n if (!Number.isFinite(limit)) return normalized;\n return Math.min(normalized, Math.max(0, Math.floor(limit)));\n}\n\nfunction shouldUseActiveConfigPreload(\n allowDrawerWhenInactive: boolean,\n initialData?: BundleProviderData,\n) {\n return !allowDrawerWhenInactive && !initialData;\n}\n\nexport function BundleProvider(props: BundleProviderProps) {\n const {\n apiBaseUrl,\n shop,\n cartAdapter,\n configHandle = \"default\",\n initialData,\n configFetcher,\n activeConfigsFetcher,\n configStatusFetcher,\n analyticsEndpoint: providedAnalyticsEndpoint,\n allowDrawerWhenInactive = false,\n locale: inputLocale,\n messages,\n children,\n } = props;\n\n const locale = normalizeBundleLocale(inputLocale);\n const t = useCallback((key: BundleUiMessageKey, vars?: Record<string, string | number>) => {\n return translateBundleUi(locale, key, vars, messages);\n }, [locale, messages]);\n\n const normalizedInitialHandle = normalizeBundleHandle(configHandle);\n const analyticsEndpoint = providedAnalyticsEndpoint ?? `${apiBaseUrl}/api/public/bundle-analytics`;\n const useActivePreload = shouldUseActiveConfigPreload(allowDrawerWhenInactive, initialData);\n\n const [isOpen, setIsOpen] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [cartSyncing, setCartSyncing] = useState(false);\n const [cartQuantitiesByMerchandiseId, setCartQuantitiesByMerchandiseId] = useState<Record<string, number>>({});\n const [currentHandle, setCurrentHandleState] = useState(normalizedInitialHandle);\n const [configCache, setConfigCache] = useState<BundleConfigCache>(() => (\n initialData ? { [normalizedInitialHandle]: initialData } : {}\n ));\n const [bootstrapLoading, setBootstrapLoading] = useState(useActivePreload);\n const [blockingHandleLoad, setBlockingHandleLoad] = useState<string | null>(\n !useActivePreload && !initialData ? normalizedInitialHandle : null,\n );\n const [statusCheckPending, setStatusCheckPending] = useState<string | null>(null);\n const [pendingOpenHandle, setPendingOpenHandle] = useState<{ handle: string; source: OpenSource } | null>(null);\n const [selectionsState, setSelectionsState] = useState<{ selections: BundleSelectionState; order: BundleSelectionOrder }>(\n () => ({ selections: {}, order: [] }),\n );\n\n const preloadAbortRef = useRef<AbortController | null>(null);\n const handleFetchAbortRef = useRef<AbortController | null>(null);\n const statusAbortRef = useRef<AbortController | null>(null);\n const cartSyncSeqRef = useRef(0);\n const currentHandleRef = useRef(currentHandle);\n const configCacheRef = useRef(configCache);\n const bootstrapLoadingRef = useRef(bootstrapLoading);\n const openForHandleRef = useRef<((handle: string, source?: OpenSource) => void) | null>(null);\n const fetcher = configFetcher ?? defaultFetchBundleConfig;\n const activePreloadFetcher = activeConfigsFetcher ?? fetchActiveBundleConfigs;\n const statusFetcher = configStatusFetcher ?? fetchBundleConfigStatus;\n\n const loadCartQuantities = useCallback(async () => {\n if (typeof cartAdapter.getLineQuantitiesByMerchandiseId !== \"function\") return null;\n const quantities = await cartAdapter.getLineQuantitiesByMerchandiseId();\n return Object.entries(quantities ?? {}).reduce<Record<string, number>>((acc, [id, quantity]) => {\n const q = clampQty(quantity);\n if (q > 0) acc[id] = q;\n return acc;\n }, {});\n }, [cartAdapter]);\n\n const refreshCartQuantities = useCallback(async () => {\n const syncSeq = ++cartSyncSeqRef.current;\n setCartSyncing(true);\n try {\n const quantities = await loadCartQuantities();\n if (quantities && syncSeq === cartSyncSeqRef.current) {\n setCartQuantitiesByMerchandiseId(quantities);\n }\n return quantities;\n } catch {\n return null;\n } finally {\n if (syncSeq === cartSyncSeqRef.current) setCartSyncing(false);\n }\n }, [loadCartQuantities]);\n\n useEffect(() => {\n currentHandleRef.current = currentHandle;\n }, [currentHandle]);\n\n useEffect(() => {\n configCacheRef.current = configCache;\n }, [configCache]);\n\n useEffect(() => {\n bootstrapLoadingRef.current = bootstrapLoading;\n }, [bootstrapLoading]);\n\n useEffect(() => {\n void refreshCartQuantities();\n }, [refreshCartQuantities]);\n\n const setConfigHandle = useCallback((handle: string) => {\n setCurrentHandleState(normalizeBundleHandle(handle));\n }, []);\n\n const close = useCallback(() => {\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_CLOSED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_closed\",\n }).catch((trackError) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer closed:\", trackError);\n });\n } catch (trackError) {\n console.warn(\"[Bundle Analytics] Error in close() callback:\", trackError);\n }\n }\n setIsOpen(false);\n if (typeof window !== \"undefined\" && window.location.hash.toLowerCase().startsWith(BUNDLE_DRAWER_HASH)) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n }, [analyticsEndpoint, shop]);\n\n const openDrawerOnly = useCallback(() => {\n setIsOpen((current) => {\n if (current) return current;\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_OPENED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_opened\",\n }).catch((trackError) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer opened:\", trackError);\n });\n } catch (trackError) {\n console.warn(\"[Bundle Analytics] Error in open() callback:\", trackError);\n }\n }\n return true;\n });\n }, [analyticsEndpoint, shop]);\n\n const applyLatestConfigResponse = useCallback((handle: string, response: PublicBundleConfigResponse) => {\n if (!response.ok) {\n setConfigCache((prev) => {\n if (!prev[handle]) return prev;\n const next = { ...prev };\n delete next[handle];\n return next;\n });\n if (!allowDrawerWhenInactive && currentHandleRef.current === handle) {\n setError(response.ok ? t(\"bundle.provider.inactive_error\") : (response.error || t(\"bundle.provider.load_error\")));\n setIsOpen(false);\n if (typeof window !== \"undefined\" && window.location.hash.toLowerCase().startsWith(BUNDLE_DRAWER_HASH)) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n }\n return false;\n }\n\n if (response.config.isActive === false && !allowDrawerWhenInactive) {\n setConfigCache((prev) => {\n if (!prev[handle]) return prev;\n const next = { ...prev };\n delete next[handle];\n return next;\n });\n if (currentHandleRef.current === handle) {\n setError(t(\"bundle.provider.inactive_error\"));\n setIsOpen(false);\n if (typeof window !== \"undefined\" && window.location.hash.toLowerCase().startsWith(BUNDLE_DRAWER_HASH)) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n }\n return false;\n }\n\n setConfigCache((prev) => ({\n ...prev,\n [handle]: {\n currencyCode: response.currencyCode ?? null,\n config: response.config,\n eligibleVariants: response.eligibleVariants ?? [],\n },\n }));\n if (currentHandleRef.current === handle) {\n setError(null);\n }\n return true;\n }, [allowDrawerWhenInactive, t]);\n\n const refreshHandleConfig = useCallback((handle: string, options?: { blocking?: boolean }) => {\n const normalizedHandle = normalizeBundleHandle(handle);\n handleFetchAbortRef.current?.abort();\n const ac = new AbortController();\n handleFetchAbortRef.current = ac;\n\n if (options?.blocking) {\n setBlockingHandleLoad(normalizedHandle);\n }\n setError(null);\n\n fetcher({\n apiBaseUrl,\n shop,\n configHandle: normalizedHandle,\n fresh: options?.blocking === true && !configCacheRef.current[normalizedHandle],\n signal: ac.signal,\n })\n .then((response) => {\n if (ac.signal.aborted) return;\n applyLatestConfigResponse(normalizedHandle, response);\n })\n .catch((fetchError: unknown) => {\n if (ac.signal.aborted) return;\n const message = fetchError instanceof Error ? fetchError.message : t(\"bundle.provider.load_error\");\n if (currentHandleRef.current === normalizedHandle) setError(message);\n })\n .finally(() => {\n if (ac.signal.aborted) return;\n setBlockingHandleLoad((current) => current === normalizedHandle ? null : current);\n });\n }, [apiBaseUrl, applyLatestConfigResponse, fetcher, shop, t]);\n\n const loadHandle = useCallback((handle: string) => {\n const normalizedHandle = normalizeBundleHandle(handle);\n const cachedEntry = configCacheRef.current[normalizedHandle];\n setCurrentHandleState(normalizedHandle);\n setError(null);\n refreshHandleConfig(normalizedHandle, { blocking: !cachedEntry });\n }, [refreshHandleConfig]);\n\n const openForHandle = useCallback((handle: string, source: OpenSource = \"api\") => {\n const normalizedHandle = normalizeBundleHandle(handle);\n const cachedEntry = configCacheRef.current[normalizedHandle];\n\n if (useActivePreload && bootstrapLoadingRef.current && !cachedEntry) {\n setPendingOpenHandle({ handle: normalizedHandle, source });\n return;\n }\n\n setCurrentHandleState(normalizedHandle);\n\n if (allowDrawerWhenInactive) {\n openDrawerOnly();\n refreshHandleConfig(normalizedHandle, { blocking: !cachedEntry });\n return;\n }\n\n if (cachedEntry?.config?.isActive) {\n setError(null);\n openDrawerOnly();\n refreshHandleConfig(normalizedHandle, { blocking: false });\n return;\n }\n\n setStatusCheckPending(normalizedHandle);\n statusAbortRef.current?.abort();\n const ac = new AbortController();\n statusAbortRef.current = ac;\n\n statusFetcher({\n apiBaseUrl,\n shop,\n configHandle: normalizedHandle,\n signal: ac.signal,\n })\n .then((status) => {\n if (ac.signal.aborted) return;\n setStatusCheckPending((current) => current === normalizedHandle ? null : current);\n if (!status.ok || status.isActive !== true) {\n if (source === \"hash\" && typeof window !== \"undefined\" && getBundleHashHandle(window.location.hash) === normalizedHandle) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n return;\n }\n\n setError(null);\n setCurrentHandleState(normalizedHandle);\n openDrawerOnly();\n refreshHandleConfig(normalizedHandle, { blocking: true });\n })\n .catch(() => {\n if (ac.signal.aborted) return;\n setStatusCheckPending((current) => current === normalizedHandle ? null : current);\n });\n }, [\n allowDrawerWhenInactive,\n apiBaseUrl,\n openDrawerOnly,\n refreshHandleConfig,\n shop,\n statusFetcher,\n useActivePreload,\n ]);\n\n const open = useCallback(() => {\n void refreshCartQuantities();\n openForHandle(currentHandleRef.current, \"api\");\n }, [openForHandle, refreshCartQuantities]);\n\n useEffect(() => {\n openForHandleRef.current = openForHandle;\n }, [openForHandle]);\n\n const toggle = useCallback(() => {\n if (isOpen) {\n close();\n return;\n }\n void refreshCartQuantities();\n openForHandle(currentHandleRef.current, \"api\");\n }, [close, isOpen, openForHandle, refreshCartQuantities]);\n\n useEffect(() => {\n setCurrentHandleState(normalizeBundleHandle(configHandle));\n }, [configHandle]);\n\n useEffect(() => {\n if (!useActivePreload) {\n setBootstrapLoading(false);\n if (!initialData) {\n refreshHandleConfig(normalizedInitialHandle, { blocking: true });\n }\n return;\n }\n\n preloadAbortRef.current?.abort();\n const ac = new AbortController();\n preloadAbortRef.current = ac;\n setBootstrapLoading(true);\n\n activePreloadFetcher({ apiBaseUrl, shop, signal: ac.signal })\n .then((response: PublicActiveBundleConfigsResponse) => {\n if (ac.signal.aborted) return;\n if (!response.ok) return;\n setConfigCache((prev) => {\n const next: BundleConfigCache = { ...prev };\n for (const [handle, entry] of Object.entries(response.configs ?? {})) {\n next[normalizeBundleHandle(handle)] = {\n currencyCode: entry.currencyCode ?? null,\n config: entry.config,\n eligibleVariants: entry.eligibleVariants ?? [],\n };\n }\n return next;\n });\n })\n .catch(() => {\n // Ignore preload failures; open flow falls back to status + single fetch.\n })\n .finally(() => {\n if (ac.signal.aborted) return;\n setBootstrapLoading(false);\n });\n\n return () => ac.abort();\n }, [activePreloadFetcher, apiBaseUrl, initialData, normalizedInitialHandle, refreshHandleConfig, shop, useActivePreload]);\n\n useEffect(() => {\n if (bootstrapLoading || !pendingOpenHandle) return;\n openForHandle(pendingOpenHandle.handle, pendingOpenHandle.source);\n setPendingOpenHandle(null);\n }, [bootstrapLoading, openForHandle, pendingOpenHandle]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const openIfHash = () => {\n const handleInHash = getBundleHashHandle(window.location.hash);\n if (!handleInHash) return;\n openForHandleRef.current?.(handleInHash, \"hash\");\n };\n openIfHash();\n window.addEventListener(\"hashchange\", openIfHash);\n return () => window.removeEventListener(\"hashchange\", openIfHash);\n }, []);\n\n const currentEntry = configCache[currentHandle] ?? null;\n const config = currentEntry?.config ?? null;\n const eligibleVariants = currentEntry?.eligibleVariants ?? EMPTY_ELIGIBLE_VARIANTS;\n const currencyCode = currentEntry?.currencyCode ?? null;\n const loading = (!config && (blockingHandleLoad === currentHandle || statusCheckPending === currentHandle))\n || (allowDrawerWhenInactive && !config && blockingHandleLoad != null);\n\n useEffect(() => {\n const effective = getEffectiveStyleSettings(config?.styleSettings);\n if (effective) injectStyleVariables(effective);\n }, [config?.styleSettings]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handlePreviewStyles = () => {\n const effective = getEffectiveStyleSettings(undefined);\n if (effective) injectStyleVariables(effective);\n };\n window.addEventListener(\"bundle-preview-styles-updated\", handlePreviewStyles);\n return () => window.removeEventListener(\"bundle-preview-styles-updated\", handlePreviewStyles);\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const win = window as Window & {\n __BUNDLE_PREVIEW_CONFIG__?: BundleConfig;\n __BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__?: BundleEligibleVariant[];\n __BUNDLE_PREVIEW_VARIANTS_LOADING__?: boolean;\n };\n const applyPreviewConfig = () => {\n const previewConfig = win.__BUNDLE_PREVIEW_CONFIG__;\n if (!previewConfig) return;\n const previewVariants = Array.isArray(win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__)\n ? win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__\n : [];\n const previewVariantsLoading = win.__BUNDLE_PREVIEW_VARIANTS_LOADING__ === true;\n setConfigCache((prev) => ({\n ...prev,\n [currentHandleRef.current]: {\n currencyCode: currencyCode ?? null,\n config: previewConfig,\n eligibleVariants: previewVariantsLoading\n ? (prev[currentHandleRef.current]?.eligibleVariants ?? [])\n : previewVariants,\n },\n }));\n if (previewVariantsLoading) {\n setBlockingHandleLoad(currentHandleRef.current);\n } else {\n setBlockingHandleLoad((current) => current === currentHandleRef.current ? null : current);\n }\n };\n if (win.__BUNDLE_PREVIEW_CONFIG__) applyPreviewConfig();\n window.addEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n return () => window.removeEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n }, [currencyCode]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? Number.NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const variantSelectionLimitById = useMemo(() => {\n return new Map(\n eligibleVariants.map((variant) => {\n const baseLimit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(baseLimit)) return [variant.id, baseLimit] as const;\n const inCart = clampQty(cartQuantitiesByMerchandiseId[variant.id] ?? 0);\n return [variant.id, Math.max(0, Math.floor(baseLimit) - inCart)] as const;\n }),\n );\n }, [eligibleVariants, cartQuantitiesByMerchandiseId]);\n\n const eligibleVariantIdsSet = useMemo(() => {\n return new Set(\n eligibleVariants\n .filter((variant) => getVariantSelectionLimit(variant) > 0)\n .map((variant) => variant.id),\n );\n }, [eligibleVariants]);\n\n const minRequired = useMemo(() => {\n const rules = config?.rules ?? [];\n const ruleMin = rules.length ? Math.min(...rules.map((rule) => rule.minBundleSize)) : 2;\n const normalizedRuleMin = Number.isFinite(ruleMin) && ruleMin > 0 ? ruleMin : 2;\n const configuredRaw = Number(config?.minBundleSize ?? Number.NaN);\n const configuredMin =\n Number.isFinite(configuredRaw) && Number.isInteger(configuredRaw)\n ? Math.max(2, Math.min(100, configuredRaw))\n : null;\n return configuredMin == null\n ? normalizedRuleMin\n : Math.min(normalizedRuleMin, configuredMin);\n }, [config?.minBundleSize, config?.rules]);\n\n const setQuantity = useCallback((merchandiseId: string, quantity: number) => {\n if (cartSyncing) return;\n if (!eligibleVariantIdsSet.has(merchandiseId)) {\n if (!loading) return;\n }\n\n const variantLimit = variantSelectionLimitById.get(merchandiseId) ?? (loading ? Number.POSITIVE_INFINITY : 0);\n const q = clampToVariantLimit(quantity, variantLimit);\n setSelectionsState((prev) => {\n const prevQty = prev.selections[merchandiseId] ?? 0;\n const requestedDelta = q - prevQty;\n const currentBundleSize = Object.values(prev.selections).reduce((sum, value) => sum + (value || 0), 0);\n const variantRemaining =\n Number.isFinite(variantLimit)\n ? Math.max(0, Math.floor(variantLimit) - prevQty)\n : requestedDelta;\n const delta =\n requestedDelta > 0\n ? Math.min(\n requestedDelta,\n Math.max(0, maxBundleSize - currentBundleSize),\n variantRemaining,\n )\n : requestedDelta;\n\n const nextQty = prevQty + delta;\n\n let nextSelections: BundleSelectionState;\n if (nextQty <= 0) {\n const rest = { ...prev.selections };\n delete rest[merchandiseId];\n nextSelections = rest;\n } else if (prevQty === nextQty) {\n nextSelections = prev.selections;\n } else {\n nextSelections = { ...prev.selections, [merchandiseId]: nextQty };\n }\n\n let nextOrder = prev.order;\n if (delta > 0) {\n nextOrder = [...prev.order, ...Array.from({ length: delta }, () => merchandiseId)];\n } else if (delta < 0) {\n let remainingToRemove = -delta;\n const keptReversed: string[] = [];\n for (let i = prev.order.length - 1; i >= 0; i--) {\n const id = prev.order[i];\n if (id === merchandiseId && remainingToRemove > 0) {\n remainingToRemove--;\n continue;\n }\n keptReversed.push(id);\n }\n keptReversed.reverse();\n nextOrder = keptReversed;\n }\n\n if (nextSelections === prev.selections && nextOrder === prev.order) return prev;\n\n const prevBundleSize = currentBundleSize;\n const nextBundleSize = Object.values(nextSelections).reduce((sum, value) => sum + (value || 0), 0);\n\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const basePayload = {\n eventType: \"VARIANT_SELECTION_CHANGED\" as const,\n shop,\n anonymousUserId,\n before: { ...prev.selections },\n after: { ...nextSelections },\n timestamp: new Date().toISOString(),\n };\n trackEvent(analyticsEndpoint, shop, basePayload);\n\n if (prevBundleSize === 0 && nextBundleSize >= 1) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_started\",\n });\n }\n if (prevBundleSize < minRequired && nextBundleSize >= minRequired) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_completed\",\n });\n }\n } catch {\n // Analytics should not break functionality.\n }\n }\n\n return { selections: nextSelections, order: nextOrder };\n });\n }, [analyticsEndpoint, cartSyncing, eligibleVariantIdsSet, loading, maxBundleSize, minRequired, shop, variantSelectionLimitById]);\n\n useEffect(() => {\n if (loading) return;\n setSelectionsState((prev) => {\n const nextSelectionsEntries = Object.entries(prev.selections)\n .map(([id, quantity]) => {\n if (!eligibleVariantIdsSet.has(id)) return null;\n const limit = variantSelectionLimitById.get(id) ?? 0;\n const nextQuantity = clampToVariantLimit(quantity, limit);\n if (nextQuantity <= 0) return null;\n return [id, nextQuantity] as const;\n })\n .filter(Boolean) as Array<readonly [string, number]>;\n const nextSelections = Object.fromEntries(nextSelectionsEntries) as BundleSelectionState;\n const remainingById = new Map(nextSelectionsEntries);\n const nextOrder = prev.order.filter((id) => {\n const remaining = remainingById.get(id) ?? 0;\n if (remaining <= 0) return false;\n remainingById.set(id, remaining - 1);\n return true;\n });\n\n if (\n nextOrder.length === prev.order.length &&\n nextSelectionsEntries.length === Object.keys(prev.selections).length &&\n nextSelectionsEntries.every(([id, quantity]) => prev.selections[id] === quantity)\n ) {\n return prev;\n }\n\n return { selections: nextSelections, order: nextOrder };\n });\n }, [eligibleVariantIdsSet, loading, variantSelectionLimitById]);\n\n useEffect(() => {\n setSelectionsState({ selections: {}, order: [] });\n }, [currentHandle]);\n\n const clearSelections = useCallback(() => setSelectionsState({ selections: {}, order: [] }), []);\n const syncCartQuantities = useCallback(async () => {\n await refreshCartQuantities();\n }, [refreshCartQuantities]);\n const getVariantMaxSelectableQuantity = useCallback((merchandiseId: string) => {\n const limit = variantSelectionLimitById.get(merchandiseId);\n if (limit == null || !Number.isFinite(limit)) return null;\n return Math.max(0, Math.floor(limit));\n }, [variantSelectionLimitById]);\n const selections = selectionsState.selections;\n const selectionOrder = selectionsState.order;\n\n const bundleSize = useMemo(() => Object.values(selections).reduce((sum, quantity) => sum + (quantity || 0), 0), [selections]);\n\n const canSubmit = useMemo(() => {\n if (loading || cartSyncing || submitting) return false;\n if (error) return false;\n if (!config?.isActive) return false;\n if (bundleSize < minRequired) return false;\n return true;\n }, [bundleSize, cartSyncing, config?.isActive, error, loading, minRequired, submitting]);\n\n const performCartAddition = useCallback(async (options?: { onComplete?: () => void; checkout?: boolean }) => {\n if (!canSubmit || !config) return;\n\n const bundleId = safeRandomUUID();\n const bundleTitle = (config.title ?? \"\").trim().slice(0, 255);\n const latestCartQuantities = await refreshCartQuantities();\n const effectiveLimitById = new Map(\n eligibleVariants.map((variant) => {\n const baseLimit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(baseLimit)) return [variant.id, baseLimit] as const;\n const inCart = clampQty((latestCartQuantities ?? cartQuantitiesByMerchandiseId)[variant.id] ?? 0);\n return [variant.id, Math.max(0, Math.floor(baseLimit) - inCart)] as const;\n }),\n );\n const lines = Object.entries(selections)\n .map(([merchandiseId, quantity]) => ({\n merchandiseId,\n quantity: clampToVariantLimit(quantity, effectiveLimitById.get(merchandiseId) ?? 0),\n }))\n .filter((line) => line.quantity > 0)\n .filter((line) => eligibleVariantIdsSet.has(line.merchandiseId))\n .map((line) => ({\n merchandiseId: line.merchandiseId,\n quantity: line.quantity,\n attributes: [\n { key: BundleLineAttributeKeys.bundleId, value: bundleId },\n { key: BundleLineAttributeKeys.bundleConfig, value: currentHandle },\n { key: BundleLineAttributeKeys.bundleSource, value: \"bundle_builder\" },\n ...(bundleTitle ? [{ key: BundleLineAttributeKeys.bundleTitle, value: bundleTitle }] : []),\n ],\n }));\n\n if (!lines.length) return;\n\n const byId = new Map(eligibleVariants.map((variant) => [variant.id, variant] as const));\n let grossPrice = 0;\n for (const line of lines) {\n const q = line.quantity ?? 0;\n if (q <= 0) continue;\n const variant = byId.get(line.merchandiseId);\n const price = Number(variant?.price);\n if (!Number.isFinite(price)) continue;\n grossPrice += price * q;\n }\n grossPrice = Math.round(grossPrice * 100) / 100;\n\n const rulesSorted = [...(config.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n let appliedRule: (typeof rulesSorted)[number] | null = null;\n for (const rule of rulesSorted) {\n if (bundleSize >= rule.minBundleSize) appliedRule = rule;\n }\n\n const appliedDiscountPercent = appliedRule\n ? (() => {\n const pct = Number.parseFloat(appliedRule!.discountPercent);\n return Number.isFinite(pct) && pct > 0 ? pct : null;\n })()\n : null;\n\n const discountedPrice = appliedDiscountPercent\n ? Math.round(grossPrice * (1 - appliedDiscountPercent / 100) * 100) / 100\n : grossPrice;\n const discountedAmount = grossPrice - discountedPrice;\n const productVariantIds = lines.map((line) => line.merchandiseId);\n const discountThresholdIdentifier = appliedRule?.handle ?? \"\";\n const discountLabel = appliedRule?.label?.trim() || \"\";\n\n setSubmitting(true);\n try {\n if (options?.checkout) {\n await cartAdapter.linesAddForCheckout(lines);\n } else {\n await cartAdapter.linesAdd(lines);\n }\n\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const isCheckout = !!options?.checkout;\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"BUNDLE_ADDED_TO_BASKET\",\n shop,\n anonymousUserId,\n bundleId,\n productVariantIds,\n grossPrice,\n discountedPrice,\n currency: currencyCode ?? undefined,\n discountThresholdIdentifier,\n discountLabel,\n discountPercentage: appliedDiscountPercent,\n discountedAmount,\n timestamp: new Date().toISOString(),\n checkout: isCheckout,\n mixpanelEvent: isCheckout ? \"checkout_started_with_bundle\" : \"bundle_added_to_cart\",\n });\n } catch {\n // Analytics should not break functionality.\n }\n }\n\n clearSelections();\n close();\n void refreshCartQuantities();\n options?.onComplete?.();\n setError(null);\n } catch (addError) {\n const rawMessage = addError instanceof Error ? addError.message : \"\";\n const isStockError = /stock|sold out|inventory|insufficient|available|422/i.test(rawMessage);\n setError(\n isStockError\n ? t(\"bundle.provider.stock_error\")\n : t(\"bundle.provider.add_error\"),\n );\n void refreshCartQuantities();\n } finally {\n setSubmitting(false);\n }\n }, [\n analyticsEndpoint,\n bundleSize,\n canSubmit,\n cartAdapter,\n clearSelections,\n close,\n config,\n currencyCode,\n cartQuantitiesByMerchandiseId,\n currentHandle,\n eligibleVariantIdsSet,\n eligibleVariants,\n refreshCartQuantities,\n selections,\n shop,\n t,\n ]);\n\n const submit = useCallback(async () => {\n await performCartAddition({\n onComplete: () => {\n cartAdapter.openCartUI?.();\n },\n });\n }, [cartAdapter, performCartAddition]);\n\n const submitAndCheckout = useCallback(async () => {\n await performCartAddition({\n checkout: true,\n onComplete: () => {\n cartAdapter.navigateToCheckout?.();\n },\n });\n }, [cartAdapter, performCartAddition]);\n\n const value: BundleBuilderContextValue = useMemo(() => ({\n isOpen,\n open,\n openForHandle,\n close,\n toggle,\n currentHandle,\n setConfigHandle,\n loadHandle,\n syncCartQuantities,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n clearSelections,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n }), [\n bundleSize,\n canSubmit,\n clearSelections,\n close,\n config,\n currencyCode,\n currentHandle,\n eligibleVariants,\n error,\n isOpen,\n loading,\n minRequired,\n open,\n openForHandle,\n selectionOrder,\n selections,\n setConfigHandle,\n loadHandle,\n syncCartQuantities,\n getVariantMaxSelectableQuantity,\n setQuantity,\n submit,\n submitAndCheckout,\n submitting,\n toggle,\n locale,\n t,\n ]);\n\n return <BundleBuilderContext.Provider value={value}>{children}</BundleBuilderContext.Provider>;\n}\n","import { useContext } from \"react\";\nimport { BundleBuilderContext } from \"../context/BundleProvider\";\n\nexport function useBundleBuilder() {\n const ctx = useContext(BundleBuilderContext);\n if (!ctx) {\n throw new Error(\"useBundleBuilder must be used within <BundleProvider />\");\n }\n return ctx;\n}\n\n","import { useBundleBuilder } from \"./useBundleBuilder\";\n\nexport type BundleBuilderDrawerControls = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n};\n\n/**\n * Convenience hook for controlling the drawer (alternative to using <BundleButton />).\n * Must be used within <BundleProvider />.\n */\nexport function useBundleBuilderDrawer(): BundleBuilderDrawerControls {\n const { isOpen, open, close, toggle } = useBundleBuilder();\n return { isOpen, open, close, toggle };\n}\n\n","import React from \"react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleButton.module.css\";\n\nexport type BundleButtonProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function BundleButton(props: BundleButtonProps) {\n const { toggle, t } = useBundleBuilder();\n return (\n <button\n type=\"button\"\n onClick={toggle}\n className={[styles.button, props.className].filter(Boolean).join(\" \")}\n >\n {props.children ?? t(\"bundle.button.default\")}\n </button>\n );\n}\n","'use strict';\n\n// t: current time, b: beginning value, _c: final value, d: total duration\nvar tweenFunctions = {\n linear: function(t, b, _c, d) {\n var c = _c - b;\n return c * t / d + b;\n },\n easeInQuad: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t + b;\n },\n easeOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (t /= d) * (t - 2) + b;\n },\n easeInOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t + b;\n } else {\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n }\n },\n easeInCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t + b;\n },\n easeOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t + 1) + b;\n },\n easeInOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n },\n easeInQuart: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t + b;\n },\n easeOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n },\n easeInOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t + b;\n } else {\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n },\n easeInQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t * t + b;\n },\n easeOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n },\n easeInOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n },\n easeInSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n },\n easeOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n },\n easeInOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n },\n easeInExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n },\n easeOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n },\n easeInOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n } else {\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n },\n easeInCirc: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n },\n easeOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n },\n easeInOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n } else {\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n },\n easeInElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n },\n easeOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n },\n easeInOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d / 2) === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n } else {\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b;\n }\n },\n easeInBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n },\n easeOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n },\n easeInOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n } else {\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }\n },\n easeInBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n v = tweenFunctions.easeOutBounce(d - t, 0, c, d);\n return c - v + b;\n },\n easeOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n },\n easeInOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n if (t < d / 2) {\n v = tweenFunctions.easeInBounce(t * 2, 0, c, d);\n return v * 0.5 + b;\n } else {\n v = tweenFunctions.easeOutBounce(t * 2 - d, 0, c, d);\n return v * 0.5 + c * 0.5 + b;\n }\n }\n};\n\nmodule.exports = tweenFunctions;\n","import { jsx } from 'react/jsx-runtime';\nimport React from 'react';\nimport * as tweens from 'tween-functions';\n\nfunction degreesToRads(degrees) {\n return (degrees * Math.PI) / 180;\n}\nfunction randomRange(min, max) {\n return min + Math.random() * (max - min);\n}\nfunction randomInt(min, max) {\n return Math.floor(min + Math.random() * (max - min + 1));\n}\n\nvar ParticleShape;\n(function (ParticleShape) {\n ParticleShape[ParticleShape[\"Circle\"] = 0] = \"Circle\";\n ParticleShape[ParticleShape[\"Square\"] = 1] = \"Square\";\n ParticleShape[ParticleShape[\"Strip\"] = 2] = \"Strip\";\n})(ParticleShape || (ParticleShape = {}));\nvar RotationDirection;\n(function (RotationDirection) {\n RotationDirection[RotationDirection[\"Positive\"] = 1] = \"Positive\";\n RotationDirection[RotationDirection[\"Negative\"] = -1] = \"Negative\";\n})(RotationDirection || (RotationDirection = {}));\nconst DEFAULT_FRAME_TIME = 1000 / 60;\nclass Particle {\n constructor(context, getOptions, x, y) {\n this.getOptions = getOptions;\n const { colors, initialVelocityX, initialVelocityY } = this.getOptions();\n this.context = context;\n this.x = x;\n this.y = y;\n this.w = randomRange(5, 20);\n this.h = randomRange(5, 20);\n this.radius = randomRange(5, 10);\n this.vx =\n typeof initialVelocityX === 'number'\n ? randomRange(-initialVelocityX, initialVelocityX)\n : randomRange(initialVelocityX.min, initialVelocityX.max);\n this.vy =\n typeof initialVelocityY === 'number'\n ? randomRange(-initialVelocityY, 0)\n : randomRange(initialVelocityY.min, initialVelocityY.max);\n this.shape = randomInt(0, 2);\n this.angle = degreesToRads(randomRange(0, 360));\n this.angularSpin = randomRange(-0.2, 0.2);\n this.color = colors[Math.floor(Math.random() * colors.length)];\n this.rotateY = randomRange(0, 1);\n this.rotationDirection = randomRange(0, 1)\n ? RotationDirection.Positive\n : RotationDirection.Negative;\n }\n update(elapsed) {\n const { gravity, wind, friction, opacity, drawShape } = this.getOptions();\n const frameTimeMultiplier = elapsed / DEFAULT_FRAME_TIME;\n this.x += this.vx * frameTimeMultiplier;\n this.y += this.vy * frameTimeMultiplier;\n this.vy += gravity * frameTimeMultiplier;\n this.vx += wind * frameTimeMultiplier;\n this.vx *= friction ** frameTimeMultiplier;\n this.vy *= friction ** frameTimeMultiplier;\n if (this.rotateY >= 1 &&\n this.rotationDirection === RotationDirection.Positive) {\n this.rotationDirection = RotationDirection.Negative;\n }\n else if (this.rotateY <= -1 &&\n this.rotationDirection === RotationDirection.Negative) {\n this.rotationDirection = RotationDirection.Positive;\n }\n const rotateDelta = 0.1 * this.rotationDirection * frameTimeMultiplier;\n this.rotateY += rotateDelta;\n this.angle += this.angularSpin;\n this.context.save();\n this.context.translate(this.x, this.y);\n this.context.rotate(this.angle);\n this.context.scale(1, this.rotateY);\n this.context.rotate(this.angle);\n this.context.beginPath();\n this.context.fillStyle = this.color;\n this.context.strokeStyle = this.color;\n this.context.globalAlpha = opacity;\n this.context.lineCap = 'round';\n this.context.lineWidth = 2;\n if (drawShape && typeof drawShape === 'function') {\n drawShape.call(this, this.context);\n }\n else {\n switch (this.shape) {\n case ParticleShape.Circle: {\n this.context.beginPath();\n this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);\n this.context.fill();\n break;\n }\n case ParticleShape.Square: {\n this.context.fillRect(-this.w / 2, -this.h / 2, this.w, this.h);\n break;\n }\n case ParticleShape.Strip: {\n this.context.fillRect(-this.w / 6, -this.h / 2, this.w / 3, this.h);\n break;\n }\n }\n }\n this.context.closePath();\n this.context.restore();\n }\n}\n\nclass ParticleGenerator {\n constructor(canvas, getOptions) {\n this.x = 0;\n this.y = 0;\n this.w = 0;\n this.h = 0;\n this.lastNumberOfPieces = 0;\n this.tweenProgress = 0;\n this.tweenFrom = 0;\n this.particles = [];\n this.particlesGenerated = 0;\n this.removeParticleAt = (i) => {\n this.particles.splice(i, 1);\n };\n this.getParticle = () => {\n const newParticleX = randomRange(this.x, this.w + this.x);\n const newParticleY = randomRange(this.y, this.h + this.y);\n return new Particle(this.context, this.getOptions, newParticleX, newParticleY);\n };\n this.animate = (elapsed) => {\n const { canvas, context, particlesGenerated, lastNumberOfPieces } = this;\n const { run, recycle, numberOfPieces, debug, tweenFunction, tweenDuration, } = this.getOptions();\n if (!run) {\n return false;\n }\n const nP = this.particles.length;\n const activeCount = recycle ? nP : particlesGenerated;\n // Initial population\n if (activeCount < numberOfPieces) {\n // Use the numberOfPieces prop as a key to reset the easing timing\n if (lastNumberOfPieces !== numberOfPieces) {\n this.tweenProgress = 0;\n this.tweenFrom = activeCount;\n this.lastNumberOfPieces = numberOfPieces;\n }\n // Clamp tweenProgress between 0 and tweenDuration\n this.tweenProgress = Math.min(tweenDuration, Math.max(0, this.tweenProgress + elapsed));\n const tweenedVal = tweenFunction(this.tweenProgress, this.tweenFrom, numberOfPieces, tweenDuration);\n const numToAdd = Math.round(tweenedVal - activeCount);\n for (let i = 0; i < numToAdd; i++) {\n this.particles.push(this.getParticle());\n }\n this.particlesGenerated += numToAdd;\n }\n if (debug) {\n // Draw debug text\n context.font = '12px sans-serif';\n context.fillStyle = '#333';\n context.textAlign = 'right';\n context.fillText(`Particles: ${nP}`, canvas.width - 10, canvas.height - 20);\n }\n // Maintain the population, iterating backwards to prevent issues when removing particles\n for (let i = this.particles.length - 1; i >= 0; i--) {\n const p = this.particles[i];\n // Update each particle's position\n p.update(elapsed);\n // Prune the off-canvas particles\n if (p.y > canvas.height ||\n p.y < -100 ||\n p.x > canvas.width + 100 ||\n p.x < -100) {\n if (recycle && activeCount <= numberOfPieces) {\n // Replace the particle with a brand new one\n this.particles[i] = this.getParticle();\n }\n else {\n this.removeParticleAt(i);\n }\n }\n }\n return nP > 0 || activeCount < numberOfPieces;\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.getOptions = getOptions;\n }\n}\n\nconst confettiDefaults = {\n width: typeof window !== 'undefined' ? window.innerWidth : 300,\n height: typeof window !== 'undefined' ? window.innerHeight : 200,\n numberOfPieces: 200,\n friction: 0.99,\n wind: 0,\n gravity: 0.1,\n initialVelocityX: 4,\n initialVelocityY: 10,\n colors: [\n '#f44336',\n '#e91e63',\n '#9c27b0',\n '#673ab7',\n '#3f51b5',\n '#2196f3',\n '#03a9f4',\n '#00bcd4',\n '#009688',\n '#4CAF50',\n '#8BC34A',\n '#CDDC39',\n '#FFEB3B',\n '#FFC107',\n '#FF9800',\n '#FF5722',\n '#795548',\n ],\n opacity: 1.0,\n debug: false,\n tweenFunction: tweens.easeInOutQuad,\n tweenDuration: 5000,\n recycle: true,\n run: true,\n};\nclass Confetti {\n constructor(canvas, opts) {\n this.lastFrameTime = 0;\n this.setOptionsWithDefaults = (opts) => {\n const computedConfettiDefaults = {\n confettiSource: {\n x: 0,\n y: 0,\n w: this.canvas.width,\n h: 0,\n },\n };\n this._options = {\n ...computedConfettiDefaults,\n ...confettiDefaults,\n ...opts,\n };\n Object.assign(this, opts.confettiSource);\n };\n this.update = (timestamp = 0) => {\n const { options: { run, onConfettiComplete, frameRate }, canvas, context, } = this;\n // Cap elapsed time to 50ms to prevent large time steps\n const elapsed = Math.min(timestamp - this.lastFrameTime, 50);\n // Throttle the frame rate if set\n if (frameRate && elapsed < 1000 / frameRate) {\n this.rafId = requestAnimationFrame(this.update);\n return;\n }\n this.lastFrameTime = timestamp - (frameRate ? elapsed % frameRate : 0);\n if (run) {\n context.fillStyle = 'white';\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n if (this.generator.animate(elapsed)) {\n this.rafId = requestAnimationFrame(this.update);\n }\n else {\n if (onConfettiComplete &&\n typeof onConfettiComplete === 'function' &&\n this.generator.particlesGenerated > 0) {\n onConfettiComplete.call(this, this);\n }\n this._options.run = false;\n }\n };\n this.reset = () => {\n if (this.generator && this.generator.particlesGenerated > 0) {\n this.generator.particlesGenerated = 0;\n this.generator.particles = [];\n this.generator.lastNumberOfPieces = 0;\n }\n };\n this.stop = () => {\n this.options = { run: false };\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = undefined;\n }\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.generator = new ParticleGenerator(this.canvas, () => this.options);\n this.options = opts;\n this.update();\n }\n get options() {\n return this._options;\n }\n set options(opts) {\n const lastRunState = this._options?.run;\n const lastRecycleState = this._options?.recycle;\n this.setOptionsWithDefaults(opts);\n if (this.generator) {\n Object.assign(this.generator, this.options.confettiSource);\n if (typeof opts.recycle === 'boolean' &&\n opts.recycle &&\n lastRecycleState === false) {\n this.generator.lastNumberOfPieces = this.generator.particles.length;\n }\n }\n if (typeof opts.run === 'boolean' && opts.run && lastRunState === false) {\n this.update();\n }\n }\n}\n\nconst ref = React.createRef();\nclass ReactConfettiInternal extends React.Component {\n constructor(props) {\n super(props);\n this.canvas = React.createRef();\n this.canvas = props.canvasRef || ref;\n }\n componentDidMount() {\n if (this.canvas.current) {\n const opts = extractCanvasProps(this.props)[0];\n this.confetti = new Confetti(this.canvas.current, opts);\n }\n }\n componentDidUpdate() {\n const confettiOptions = extractCanvasProps(this.props)[0];\n if (this.confetti) {\n this.confetti.options = confettiOptions;\n }\n }\n componentWillUnmount() {\n if (this.confetti) {\n this.confetti.stop();\n }\n this.confetti = undefined;\n }\n render() {\n const [confettiOptions, passedProps] = extractCanvasProps(this.props);\n const canvasStyles = {\n zIndex: 2,\n position: 'absolute',\n pointerEvents: 'none',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n ...passedProps.style,\n };\n return (jsx(\"canvas\", { width: confettiOptions.width, height: confettiOptions.height, ref: this.canvas, ...passedProps, style: canvasStyles }));\n }\n}\nReactConfettiInternal.defaultProps = {\n ...confettiDefaults,\n};\nReactConfettiInternal.displayName = 'ReactConfetti';\nfunction extractCanvasProps(props) {\n const confettiOptions = {};\n const refs = {};\n const rest = {};\n const confettiOptionKeys = [\n ...Object.keys(confettiDefaults),\n 'confettiSource',\n 'drawShape',\n 'onConfettiComplete',\n 'frameRate',\n ];\n const refProps = ['canvasRef'];\n for (const prop in props) {\n const val = props[prop];\n if (confettiOptionKeys.includes(prop)) {\n confettiOptions[prop] = val;\n }\n else if (refProps.includes(prop)) {\n refProps[prop] = val;\n }\n else {\n rest[prop] = val;\n }\n }\n return [confettiOptions, rest, refs];\n}\nconst ReactConfetti = React.forwardRef((props, ref) => jsx(ReactConfettiInternal, { canvasRef: ref, ...props }));\n\nexport { ReactConfetti as default };\n//# sourceMappingURL=react-confetti.mjs.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport Confetti from \"react-confetti\";\nimport { Link, Search } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport { formatBundleCurrency, getProductWord } from \"../i18n\";\nimport styles from \"./BundleBuilderDrawer.module.css\";\n\nexport type BundleBuilderDrawerProps = {\n className?: string;\n};\n\nexport function BundleBuilderDrawer(props: BundleBuilderDrawerProps) {\n const {\n isOpen,\n close,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n } = useBundleBuilder();\n\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const footerRef = useRef<HTMLElement | null>(null);\n const celebrationChipRef = useRef<HTMLDivElement | null>(null);\n\n const [windowSize, setWindowSize] = useState<{ width: number; height: number }>(() => {\n if (typeof window === \"undefined\") return { width: 0, height: 0 };\n return { width: window.innerWidth, height: window.innerHeight };\n });\n\n const [confettiKey, setConfettiKey] = useState(0);\n const [confettiSource, setConfettiSource] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n const [isConfettiActive, setIsConfettiActive] = useState(false);\n const confettiTimerRef = useRef<number | null>(null);\n const prevBundleSizeForConfettiRef = useRef<number>(bundleSize);\n const confettiSettleMs = 7000;\n\n const [celebrationKey, setCelebrationKey] = useState(0);\n const [celebrationText, setCelebrationText] = useState<string | null>(null);\n const [isCelebrationActive, setIsCelebrationActive] = useState(false);\n const celebrationTimerRef = useRef<number | null>(null);\n const celebrationDurationMs = 2800;\n\n const DEFAULT_CONFETTI_COLORS = [\n \"#2563eb\",\n \"#3b82f6\",\n \"#60a5fa\",\n \"#93c5fd\",\n \"#bae6fd\",\n \"#e0f2fe\",\n ] as const;\n\n const confettiColors = useMemo(() => {\n const c = config?.styleSettings?.confettiColors;\n if (Array.isArray(c) && c.length >= 6) {\n return c.slice(0, 6).map((s, i) =>\n typeof s === \"string\" && s.trim() ? s : DEFAULT_CONFETTI_COLORS[i],\n );\n }\n return [...DEFAULT_CONFETTI_COLORS];\n }, [config?.styleSettings?.confettiColors]);\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" · \");\n };\n\n const getVariantPrimaryName = (v: (typeof eligibleVariants)[number]) => {\n return v.product?.title ?? v.displayName ?? v.title;\n };\n\n const getVariantA11yLabel = (v: (typeof eligibleVariants)[number]) => {\n const name = getVariantPrimaryName(v);\n const opts = formatVariantOptions(v.selectedOptions);\n return [name, opts].filter(Boolean).join(\" — \");\n };\n\n const [isMounted, setIsMounted] = useState(isOpen);\n const closeTimerRef = useRef<number | null>(null);\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n\n return formatBundleCurrency(n, currencyCode, locale);\n };\n\n const title = config?.title?.trim() || t(\"bundle.title.default\");\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n\n const sorted = useMemo(() => {\n return [...eligibleVariants].sort((a, b) => a.displayName.localeCompare(b.displayName));\n }, [eligibleVariants]);\n\n const filteredVariants = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n if (!q) return sorted;\n\n const tokens = q.split(/\\s+/).filter(Boolean);\n const matches = (v: (typeof sorted)[number]) => {\n const parts: string[] = [];\n parts.push(v.displayName);\n if (v.product?.title) parts.push(v.product.title);\n for (const o of v.selectedOptions ?? []) {\n parts.push(o.name);\n parts.push(o.value);\n }\n const haystack = parts.join(\" \").toLowerCase();\n return tokens.every((t) => haystack.includes(t));\n };\n\n return sorted.filter(matches);\n }, [searchQuery, sorted]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n // Keep cents stable for display.\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n // Slot index (0-based) => rule that becomes active at that slot.\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const slotCount = useMemo(() => {\n // Placeholders show until highest tier; if user adds more, extend (scroll).\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n // Track animation state for dual button split animation\n const [isDualButtonAnimationLoaded, setIsDualButtonAnimationLoaded] = useState(true);\n const prevItemsRemainingRef = useRef(itemsRemaining);\n\n // Trigger animation when itemsRemaining changes from > 0 to 0 in add_to_cart_checkout mode\n useEffect(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n const wasPositive = prevItemsRemainingRef.current > 0;\n const isNowZero = itemsRemaining === 0;\n\n if (wasPositive && isNowZero) {\n // Trigger animation\n setIsDualButtonAnimationLoaded(false);\n } else {\n // Reset animation\n setIsDualButtonAnimationLoaded(true);\n }\n }\n prevItemsRemainingRef.current = itemsRemaining;\n }, [itemsRemaining, config?.ctaButtonMode]);\n\n const panelRef = useRef<HTMLDivElement | null>(null);\n const bodyRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = bodyRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\"${variantId}\"]`);\n if (!row) return;\n\n const c = container.getBoundingClientRect();\n const r = row.getBoundingClientRect();\n const padding = 8;\n const isFullyVisible = r.top >= c.top + padding && r.bottom <= c.bottom - padding;\n if (isFullyVisible) return;\n\n const maxTop = Math.max(0, container.scrollHeight - container.clientHeight);\n const rowCenterOffset = (r.top - c.top) + r.height / 2;\n const targetTop = container.scrollTop + rowCenterOffset - container.clientHeight / 2;\n const nextTop = Math.min(maxTop, Math.max(0, targetTop));\n container.scrollTo({ top: nextTop, behavior: \"smooth\" });\n };\n\n useEffect(() => {\n if (!isOpen) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") close();\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [close, isOpen]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setWindowSize({ width: window.innerWidth, height: window.innerHeight });\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n useEffect(() => {\n if (closeTimerRef.current != null) {\n window.clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n if (isOpen) {\n setIsMounted(true);\n return;\n }\n\n // Keep mounted long enough to play exit animation.\n closeTimerRef.current = window.setTimeout(() => {\n setIsMounted(false);\n closeTimerRef.current = null;\n }, 220);\n }, [isOpen]);\n\n useEffect(() => {\n return () => {\n if (closeTimerRef.current != null) window.clearTimeout(closeTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isSearchOpen) return;\n const raf = requestAnimationFrame(() => searchInputRef.current?.focus());\n return () => cancelAnimationFrame(raf);\n }, [isOpen, isSearchOpen]);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n\n // When hitting a threshold, try to reveal the NEXT threshold (aligned right) if it's off-screen to the right.\n // If no remaining thresholds, scroll the newest added item into view.\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n // Only scroll rightward when the target is off-screen to the right.\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const prev = prevBundleSizeForConfettiRef.current;\n prevBundleSizeForConfettiRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n // Trigger when crossing an exact configured threshold (e.g. 2 items, 3 items, etc.).\n const hitRule = rulesSorted.find((r) => r.minBundleSize === bundleSize);\n if (!hitRule) return;\n\n // Celebration chip (centered)\n setCelebrationText(\n t(\"bundle.celebration.received_discount\", {\n discount: formatPercent0dp(hitRule.discountPercent),\n }),\n );\n setCelebrationKey((k) => k + 1);\n setIsCelebrationActive(true);\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n celebrationTimerRef.current = window.setTimeout(() => {\n setIsCelebrationActive(false);\n celebrationTimerRef.current = null;\n }, celebrationDurationMs);\n }, [bundleSize, isOpen, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isCelebrationActive) return;\n if (!celebrationText) return;\n\n // After the chip renders, measure its rect and shoot confetti from it.\n const raf = requestAnimationFrame(() => {\n const chipEl = celebrationChipRef.current;\n const rect = chipEl?.getBoundingClientRect();\n\n // Fallback: use the drawer panel center if chip rect isn't available yet.\n const panelRect = panelRef.current?.getBoundingClientRect();\n const originX = rect ? rect.left + rect.width / 2 : panelRect ? panelRect.left + panelRect.width / 2 : window.innerWidth / 2;\n const originY = rect ? rect.top + rect.height / 2 : panelRect ? panelRect.top + panelRect.height / 2 : window.innerHeight / 2;\n\n const source = {\n x: originX - 2,\n y: originY - 2,\n w: 4,\n h: 4,\n };\n\n setConfettiSource(source);\n setConfettiKey((k) => k + 1);\n setIsConfettiActive(true);\n\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n confettiTimerRef.current = window.setTimeout(() => {\n setIsConfettiActive(false);\n confettiTimerRef.current = null;\n }, confettiSettleMs);\n });\n\n return () => cancelAnimationFrame(raf);\n }, [celebrationKey, celebrationText, confettiSettleMs, isCelebrationActive, isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n panelRef.current?.focus();\n }, [isOpen]);\n\n if (!isMounted) return null;\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t(\"bundle.drawer.aria\")}\n className={[styles.backdrop, isOpen ? styles.backdropOpen : styles.backdropClosed, props.className].filter(Boolean).join(\" \")}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) close();\n }}\n >\n {isConfettiActive && confettiSource && windowSize.width > 0 && windowSize.height > 0 ? (\n <Confetti\n key={confettiKey}\n width={windowSize.width}\n height={windowSize.height}\n confettiSource={confettiSource}\n colors={confettiColors}\n recycle={false}\n numberOfPieces={70}\n tweenDuration={100}\n gravity={0.45}\n initialVelocityY={{ min: -10, max: -30 }}\n initialVelocityX={{ min: -6, max: 6 }}\n style={{ position: \"fixed\", inset: 0, pointerEvents: \"none\", zIndex: 2147483646 }}\n />\n ) : null}\n <aside ref={panelRef} className={[styles.panel, isOpen ? styles.panelOpen : styles.panelClosed].filter(Boolean).join(\" \")} tabIndex={-1}>\n {isCelebrationActive && celebrationText ? (\n <div className={styles.celebrationOverlay} aria-hidden=\"true\">\n <div key={celebrationKey} ref={celebrationChipRef} className={styles.celebrationChip}>\n {celebrationText}\n </div>\n </div>\n ) : null}\n <header className={[styles.header, isSearchOpen ? styles.headerSearchOpen : null].filter(Boolean).join(\" \")}>\n <button\n type=\"button\"\n className={styles.searchIconButton}\n aria-label={isSearchOpen ? t(\"bundle.search.expanded\") : t(\"bundle.search\")}\n aria-expanded={isSearchOpen}\n onClick={() => {\n setIsSearchOpen(true);\n }}\n >\n <Search size={18} aria-hidden=\"true\" />\n </button>\n\n <div className={styles.headerCenter}>\n <div className={styles.headerTitleWrap} aria-hidden={isSearchOpen}>\n <h2 className={styles.title}>{title}</h2>\n </div>\n\n <div className={styles.headerSearchWrap} aria-hidden={!isSearchOpen}>\n <div className={styles.searchBar}>\n <input\n ref={searchInputRef}\n className={styles.searchInput}\n type=\"search\"\n value={searchQuery}\n placeholder={t(\"bundle.search.placeholder\")}\n onChange={(e) => setSearchQuery(e.target.value)}\n onBlur={() => {\n if (searchQuery.trim() === \"\") setIsSearchOpen(false);\n }}\n />\n {searchQuery.trim() ? (\n <button\n type=\"button\"\n className={styles.searchClearButton}\n onMouseDown={(e) => {\n // Prevent input blur so the bar stays open and focused.\n e.preventDefault();\n }}\n onClick={() => {\n setSearchQuery(\"\");\n searchInputRef.current?.focus();\n }}\n aria-label={t(\"bundle.search.clear\")}\n >\n {t(\"bundle.search.clear\")}\n </button>\n ) : null}\n </div>\n </div>\n </div>\n\n <button type=\"button\" onClick={close} disabled={submitting} className={styles.closeButton} aria-label={t(\"bundle.close\")}>\n ×\n </button>\n </header>\n\n <div className={styles.body} ref={bodyRef}>\n {loading ? <p className={styles.muted}>{t(\"bundle.loading\")}</p> : null}\n {error ? <p className={styles.error}>{error}</p> : null}\n\n <div className={styles.variants}>\n {!loading && !error && eligibleVariants.length === 0 ? (\n <p className={styles.emptyState}>{t(\"bundle.empty\")}</p>\n ) : (\n <ul className={styles.variantList}>\n {filteredVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const variantPrimaryName = getVariantPrimaryName(v);\n const variantOptionText = formatVariantOptions(v.selectedOptions);\n const variantA11y = getVariantA11yLabel(v);\n const variantSelectionLimit = getVariantMaxSelectableQuantity(v.id);\n const normalizedVariantSelectionLimit = variantSelectionLimit == null\n ? Number.POSITIVE_INFINITY\n : variantSelectionLimit;\n const isAtVariantStockLimit = qty >= normalizedVariantSelectionLimit;\n const canIncreaseQuantity = v.availableForSale !== false && !isAtMaxBundleSize && !isAtVariantStockLimit;\n const stockStatusLabel =\n v.availableForSale === false\n ? null\n : isAtVariantStockLimit\n ? t(\"bundle.stock.max_reached\")\n : null;\n\n // Show discounted variant price only when a rule is actually unlocked.\n const discountPercentToUse = appliedDiscountPercent;\n const originalPriceNumber = Number(v.price);\n const hasDiscount =\n discountPercentToUse != null &&\n Number.isFinite(discountPercentToUse) &&\n discountPercentToUse > 0 &&\n Number.isFinite(originalPriceNumber);\n const discountedPriceNumber = hasDiscount\n ? Math.round(originalPriceNumber * (1 - discountPercentToUse / 100) * 100) / 100\n : null;\n\n return (\n <li\n key={v.id}\n className={[styles.variantRow, v.availableForSale === false && styles.variantRowSoldOut]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={v.id}\n >\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {v.image?.url ? (\n <img\n className={styles.variantThumbImg}\n src={v.image.url}\n alt={v.image.altText ?? variantA11y}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantThumbFallback}>{v.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}</div>\n )}\n </div>\n\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{variantPrimaryName}</div>\n {variantOptionText ? <div className={styles.variantMeta}>{variantOptionText}</div> : null}\n <div className={styles.variantPriceRow}>\n {hasDiscount ? (\n <span className={styles.variantCompareAt}>\n {formatMoney(Number.isFinite(originalPriceNumber) ? originalPriceNumber.toFixed(2) : v.price)}\n </span>\n ) : null}\n <span className={styles.variantPrice}>\n {formatMoney(\n discountedPriceNumber != null\n ? discountedPriceNumber.toFixed(2)\n : Number.isFinite(originalPriceNumber)\n ? originalPriceNumber.toFixed(2)\n : v.price,\n )}\n </span>\n </div>\n </div>\n </div>\n {v.availableForSale === false ? (\n <div className={styles.soldOutContainer}>\n <span className={styles.soldOut} aria-label={t(\"bundle.a11y.sold_out\", { name: variantA11y })}>\n {t(\"bundle.stock.sold_out\")}\n </span>\n </div>\n ) : qty <= 0 && normalizedVariantSelectionLimit <= 0 ? (\n <div className={styles.stockLimitContainer}>\n <span className={styles.stockLimitNotice} aria-label={t(\"bundle.a11y.max_available_selected\", { name: variantA11y })}>\n {t(\"bundle.stock.max_added\")}\n </span>\n </div>\n ) : qty <= 0 ? (\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, 1)}\n disabled={submitting || !canIncreaseQuantity}\n className={styles.addToBundleButton}\n aria-label={stockStatusLabel ? `${variantA11y} ${stockStatusLabel.toLowerCase()}` : t(\"bundle.a11y.add_to_bundle\", { name: variantA11y })}\n >\n {t(\"bundle.cta.add_to_bundle\")}\n </button>\n ) : (\n <div className={styles.qtyControlsWrap}>\n <div className={styles.qtyControls}>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty - 1)}\n disabled={submitting || qty <= 0}\n className={styles.qtyButton}\n aria-label={t(\"bundle.a11y.decrease\", { name: variantA11y })}\n >\n −\n </button>\n <span className={styles.qtyValue} aria-label={t(\"bundle.a11y.quantity\", { name: variantA11y, qty })}>\n {qty}\n </span>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty + 1)}\n disabled={submitting || !canIncreaseQuantity}\n className={styles.qtyButton}\n aria-label={stockStatusLabel ? `${variantA11y} ${stockStatusLabel.toLowerCase()}` : t(\"bundle.a11y.increase\", { name: variantA11y })}\n >\n +\n </button>\n </div>\n {stockStatusLabel ? <div className={styles.stockLimitNotice}>{stockStatusLabel}</div> : null}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n\n <footer className={styles.footer} ref={footerRef}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n\n // Per your preference: show discount text only while it's still a placeholder (unlocked display comes later elsewhere).\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const discountText = threshold\n ? t(\"bundle.discount.off_label\", { discount: formatPercent0dp(threshold.discountPercent) })\n : null;\n\n const titleText = isFilled ? variant!.displayName : t(\"bundle.slot\", { slot: idx + 1 });\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && discountText ? `${titleText}. ${t(\"bundle.unlocks\", { discount: discountText })}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • ${t(\"bundle.unlocks\", { discount: discountText })}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && discountText ? (\n <div className={styles.boxItemDiscountText}>{discountText}</div>\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{threshold!.label}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n <div\n className={[styles.ctaTotalsWrap, hasUnlockedFirstDiscount ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={!hasUnlockedFirstDiscount}\n >\n <div className={styles.ctaTotals} aria-label={t(\"bundle.totals\")}>\n {appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>\n {t(\"bundle.discount.badge\", { discount: appliedDiscountPercent })}\n </span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n\n {(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n // Show single button with \"Add X more\" when items remaining\n // Show both buttons side-by-side when minimum is met\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })}\n </button>\n );\n }\n\n return (\n <div className={`${styles.ctaButtonGroup} ${isDualButtonAnimationLoaded ? styles.ctaButtonGroupAnimating : \"\"}`}>\n <button\n type=\"button\"\n onClick={submit}\n disabled={!canSubmit}\n className={`${styles.ctaDualLeft} ${isDualButtonAnimationLoaded ? styles.ctaDualLeftAnimating : \"\"}`}\n >\n <span>{submitting ? t(\"bundle.cta.adding\") : t(\"bundle.cta.add_to_basket\")}</span>\n </button>\n <button\n type=\"button\"\n onClick={submitAndCheckout}\n disabled={!canSubmit}\n className={`${styles.ctaDualRight} ${isDualButtonAnimationLoaded ? styles.ctaDualRightAnimating : \"\"}`}\n >\n <span>{submitting ? t(\"bundle.cta.processing\") : t(\"bundle.cta.checkout\")}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.processing\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.checkout\")}\n </button>\n );\n }\n\n // Default: add_to_cart\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.add_to_basket\")}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n {t(\"bundle.powered_by\")} <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\"> BestBundles</a>\n </div>\n </footer>\n </aside>\n </div>\n );\n}\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport { Plus, Trash2 } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport { formatBundleCurrency, getProductWord } from \"../i18n\";\nimport styles from \"./BundleBuilderPanel.module.css\";\n\nexport type BundleBuilderPanelProps = {\n className?: string;\n showRules?: boolean;\n showVariants?: boolean;\n};\n\nexport function BundleBuilderPanel(props: BundleBuilderPanelProps) {\n const {\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n } = useBundleBuilder();\n\n const {\n className,\n showRules = true,\n showVariants = true,\n } = props;\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" • \");\n };\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n return formatBundleCurrency(n, currencyCode, locale);\n };\n\n const sortedVariants = useMemo(() => {\n return [...eligibleVariants].sort((a, b) => a.displayName.localeCompare(b.displayName));\n }, [eligibleVariants]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const title = config?.title?.trim() || t(\"bundle.title.default\");\n\n const slotCount = useMemo(() => {\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n\n const variantsRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = variantsRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\\\"${variantId}\\\"]`);\n if (!row) return;\n row.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n };\n\n return (\n <section className={[styles.panel, className].filter(Boolean).join(\" \")} aria-busy={loading}>\n <header className={styles.header}>\n <h2 className={styles.title}>{title}</h2>\n </header>\n\n {loading ? <div className={styles.status}>{t(\"bundle.loading\")}</div> : null}\n {error ? <div className={styles.error}>{error}</div> : null}\n\n {showRules && rulesSorted.length ? (\n <div className={styles.section}>\n <div className={styles.rulesVisual}>\n <div className={styles.rulesLabelsRow}>\n {Array.from({ length: maxRuleSize }).map((_, idx) => {\n const lineIndex = idx + 1;\n const ruleForLine = rulesSorted.find((r) => r.minBundleSize === lineIndex);\n const discountLabel = ruleForLine\n ? t(\"bundle.discount.off_label\", { discount: formatPercent0dp(ruleForLine.discountPercent) })\n : null;\n\n return (\n <div key={lineIndex} className={styles.rulesLineLabelCell}>\n {discountLabel ? <span className={styles.rulesLineLabel}>{discountLabel}</span> : null}\n </div>\n );\n })}\n </div>\n <div className={styles.rulesLinesRow}>\n {Array.from({ length: maxRuleSize }).map((_, idx) => {\n const lineIndex = idx + 1;\n const isFilled = bundleSize >= lineIndex;\n\n return (\n <div\n key={lineIndex}\n className={[\n styles.rulesLine,\n isFilled ? styles.rulesLineFilled : styles.rulesLineEmpty,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n })}\n </div>\n </div>\n </div>\n ) : null}\n\n {showVariants ? (\n <div className={styles.section} ref={variantsRef}>\n <div className={styles.sectionTitle}>{t(\"bundle.select.items\")}</div>\n <div className={styles.variants}>\n {!loading && !error && sortedVariants.length === 0 ? (\n <div className={styles.emptyState}>{t(\"bundle.empty\")}</div>\n ) : (\n <ul className={styles.variantList}>\n {sortedVariants.map((variant) => {\n const qty = selections[variant.id] ?? 0;\n const options = formatVariantOptions(variant.selectedOptions);\n const isUnavailable = variant.availableForSale === false;\n const variantSelectionLimit = getVariantMaxSelectableQuantity(variant.id);\n const normalizedVariantSelectionLimit = variantSelectionLimit == null\n ? Number.POSITIVE_INFINITY\n : variantSelectionLimit;\n const isAtVariantStockLimit = qty >= normalizedVariantSelectionLimit;\n const canIncreaseQuantity = !isUnavailable && !isAtMaxBundleSize && !isAtVariantStockLimit;\n const isClickable = canIncreaseQuantity;\n const stockStatusLabel = !isUnavailable && isAtVariantStockLimit ? t(\"bundle.stock.max_reached\") : null;\n\n return (\n <li\n key={variant.id}\n className={[\n styles.variantRow,\n isClickable ? styles.variantRowInteractive : null,\n qty > 0 ? styles.variantRowSelected : null,\n isUnavailable ? styles.variantRowSoldOut : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={variant.id}\n role={isClickable ? \"button\" : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onClick={\n isClickable\n ? () => {\n setQuantity(variant.id, qty + 1);\n }\n : undefined\n }\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setQuantity(variant.id, qty + 1);\n scrollVariantRowIntoView(variant.id);\n }\n }\n : undefined\n }\n aria-label={\n isUnavailable\n ? t(\"bundle.a11y.sold_out\", { name: variant.displayName })\n : stockStatusLabel\n ? `${variant.displayName} ${stockStatusLabel.toLowerCase()}`\n : t(\"bundle.a11y.add_to_bundle\", { name: variant.displayName })\n }\n >\n <div className={styles.variantMedia}>\n {variant.image?.url ? (\n <img\n src={variant.image.url}\n alt={variant.image.altText ?? variant.displayName}\n width={variant.image.width ?? 64}\n height={variant.image.height ?? 64}\n className={styles.variantImage}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantImageFallback}>{t(\"bundle.item.generic\")}</div>\n )}\n </div>\n <div className={styles.variantContent}>\n <div className={styles.variantHeader}>\n <div className={styles.variantTitle}>{variant.displayName}</div>\n {options ? <div className={styles.variantMeta}>{options}</div> : null}\n </div>\n <div className={styles.variantFooterRow}>\n <div className={styles.variantPrice}>{formatMoney(variant.price)}</div>\n <div className={styles.variantActions}>\n {isUnavailable ? (\n <div className={styles.soldOut} aria-label={t(\"bundle.a11y.sold_out\", { name: variant.displayName })}>\n {t(\"bundle.stock.sold_out\")}\n </div>\n ) : qty <= 0 && normalizedVariantSelectionLimit <= 0 ? (\n <div className={styles.stockLimitNotice} aria-label={t(\"bundle.a11y.max_available_selected\", { name: variant.displayName })}>\n {t(\"bundle.stock.max_added\")}\n </div>\n ) : (\n <div className={styles.qtyActionsWrap}>\n <div className={styles.qtyActions}>\n {qty > 0 ? (\n <button\n type=\"button\"\n className={styles.qtyTrash}\n aria-label={t(\"bundle.a11y.remove_from_bundle\", { name: variant.displayName })}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, 0);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n >\n <Trash2 size={14} />\n </button>\n ) : null}\n <div\n className={[styles.qtyChip, canIncreaseQuantity ? styles.qtyChipInteractive : null].filter(Boolean).join(\" \")}\n aria-label={t(\"bundle.a11y.quantity\", { name: variant.displayName, qty })}\n onClick={canIncreaseQuantity\n ? (e) => {\n e.stopPropagation();\n setQuantity(variant.id, qty + 1);\n }\n : undefined}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n role={canIncreaseQuantity ? \"button\" : undefined}\n tabIndex={canIncreaseQuantity ? 0 : undefined}\n >\n {qty <= 0 ? (\n <span className={styles.qtyChipPlus} aria-hidden=\"true\">\n <Plus size={18} strokeWidth={1.8} />\n </span>\n ) : (\n <>\n <span className={styles.qtyChipValue}>{qty}</span>\n <button\n type=\"button\"\n className={styles.qtyChipClear}\n aria-label={t(\"bundle.a11y.increase\", { name: variant.displayName })}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, qty + 1);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n disabled={!canIncreaseQuantity}\n >\n <Plus size={12} strokeWidth={2} />\n </button>\n </>\n )}\n </div>\n </div>\n {stockStatusLabel ? <div className={styles.stockLimitNotice}>{stockStatusLabel}</div> : null}\n </div>\n )}\n </div>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n ) : null}\n\n <footer className={styles.footer}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const discountText = threshold\n ? t(\"bundle.discount.off_label\", { discount: formatPercent0dp(threshold.discountPercent) })\n : null;\n const titleText = isFilled ? variant!.displayName : t(\"bundle.slot\", { slot: idx + 1 });\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && discountText ? `${titleText}. ${t(\"bundle.unlocks\", { discount: discountText })}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • ${t(\"bundle.unlocks\", { discount: discountText })}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n width={1}\n height={1}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && discountText ? (\n <div className={styles.boxItemDiscountText}>{discountText}</div>\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{threshold!.label}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n\n <div className={[styles.totalsReveal, hasUnlockedFirstDiscount ? styles.totalsRevealOpen : null].filter(Boolean).join(\" \")}>\n <div\n className={[styles.ctaTotalsWrap, hasUnlockedFirstDiscount ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={!hasUnlockedFirstDiscount}\n >\n <div className={styles.ctaTotals} aria-label={t(\"bundle.totals\")}>\n {appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>{t(\"bundle.discount.badge\", { discount: appliedDiscountPercent })}</span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n </div>\n\n {(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })}\n </button>\n );\n }\n\n return (\n <div className={styles.ctaButtonGroup}>\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.ctaDualLeft}>\n <span>{submitting ? t(\"bundle.cta.adding\") : t(\"bundle.cta.add_to_basket\")}</span>\n </button>\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.ctaDualRight}>\n <span>{submitting ? t(\"bundle.cta.processing\") : t(\"bundle.cta.checkout\")}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.processing\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.checkout\")}\n </button>\n );\n }\n\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.add_to_basket\")}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n {t(\"bundle.powered_by\")}{\" \"}\n <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\">\n BestBundles\n </a>\n </div>\n </footer>\n </section>\n );\n}\n","import React, { useEffect, useMemo, useState } from \"react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport { formatBundleCurrency } from \"../i18n\";\nimport styles from \"./VolumeDiscountPanel.module.css\";\n\nfunction normalizeVariantId(raw: string | null | undefined) {\n const value = String(raw ?? \"\").trim();\n if (!value) return \"\";\n if (value.startsWith(\"gid://shopify/ProductVariant/\")) return value;\n const digits = value.replace(/\\D/g, \"\");\n return digits ? `gid://shopify/ProductVariant/${digits}` : \"\";\n}\n\nfunction getCurrentVariantId() {\n if (typeof window === \"undefined\") return \"\";\n const variantParam = new URLSearchParams(window.location.search).get(\"variant\");\n if (variantParam) return normalizeVariantId(variantParam);\n\n const productForm = document.querySelector('form[action*=\"/cart/add\"]');\n const input = productForm?.querySelector<HTMLInputElement | HTMLSelectElement>('input[name=\"id\"], select[name=\"id\"]');\n return normalizeVariantId(input?.value ?? \"\");\n}\n\nfunction getQuantityInput() {\n if (typeof document === \"undefined\") return null;\n const productForm = document.querySelector('form[action*=\"/cart/add\"]');\n return productForm?.querySelector<HTMLInputElement>('input[name=\"quantity\"]') ?? null;\n}\n\nfunction getCurrentQuantity() {\n const quantityInput = getQuantityInput();\n if (!quantityInput) return null;\n const quantity = Number(quantityInput.value ?? NaN);\n if (!Number.isFinite(quantity) || quantity <= 0) return null;\n return Math.floor(quantity);\n}\n\nfunction updateProductFormQuantity(nextQuantity: number) {\n const quantityInput = getQuantityInput();\n if (!quantityInput) return false;\n quantityInput.value = String(nextQuantity);\n quantityInput.dispatchEvent(new Event(\"input\", { bubbles: true }));\n quantityInput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return true;\n}\n\nexport type VolumeDiscountPanelProps = {\n className?: string;\n preferFirstEligibleVariant?: boolean;\n};\n\nexport function VolumeDiscountPanel({ className, preferFirstEligibleVariant = false }: VolumeDiscountPanelProps) {\n const { loading, error, config, eligibleVariants, currencyCode, locale } = useBundleBuilder();\n const [currentVariantId, setCurrentVariantId] = useState(\"\");\n const [currentQuantity, setCurrentQuantity] = useState<number | null>(null);\n const [selectedRuleHandle, setSelectedRuleHandle] = useState<string | null>(null);\n const shouldPreferFirstEligibleVariant =\n preferFirstEligibleVariant ||\n (typeof window !== \"undefined\" &&\n Boolean(\n (window as Window & { __BUNDLE_PREVIEW_CONFIG__?: unknown }).__BUNDLE_PREVIEW_CONFIG__,\n ));\n\n useEffect(() => {\n const syncVariantId = () => setCurrentVariantId(getCurrentVariantId());\n syncVariantId();\n document.addEventListener(\"variant:change\", syncVariantId);\n const timer = window.setInterval(syncVariantId, 500);\n return () => {\n document.removeEventListener(\"variant:change\", syncVariantId);\n window.clearInterval(timer);\n };\n }, []);\n\n useEffect(() => {\n const syncQuantity = () => setCurrentQuantity(getCurrentQuantity());\n const handleQuantityEvent = (event: Event) => {\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) return;\n if (target.name !== \"quantity\") return;\n syncQuantity();\n };\n\n syncQuantity();\n document.addEventListener(\"input\", handleQuantityEvent, true);\n document.addEventListener(\"change\", handleQuantityEvent, true);\n const timer = window.setInterval(syncQuantity, 500);\n\n return () => {\n document.removeEventListener(\"input\", handleQuantityEvent, true);\n document.removeEventListener(\"change\", handleQuantityEvent, true);\n window.clearInterval(timer);\n };\n }, []);\n\n const rules = useMemo(\n () => [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize),\n [config?.rules],\n );\n\n const activeVariantId = shouldPreferFirstEligibleVariant\n ? eligibleVariants[0]?.id || \"\"\n : currentVariantId || eligibleVariants[0]?.id || \"\";\n const activeVariant = eligibleVariants.find((variant) => variant.id === activeVariantId) ?? null;\n\n useEffect(() => {\n if (!rules.length) {\n setSelectedRuleHandle(null);\n return;\n }\n if (currentQuantity != null) {\n let matchedRuleHandle: string | null = null;\n for (const rule of rules) {\n if (rule.minBundleSize <= currentQuantity) {\n matchedRuleHandle = rule.handle;\n }\n }\n setSelectedRuleHandle(matchedRuleHandle ?? rules[0]?.handle ?? null);\n return;\n }\n setSelectedRuleHandle((current) => current ?? rules[0]?.handle ?? null);\n }, [currentQuantity, rules]);\n\n if (config?.bundleType !== \"volume_discount\") {\n return null;\n }\n\n return (\n <section className={[styles.panel, className].filter(Boolean).join(\" \")} aria-busy={loading}>\n <h2 className={styles.title}>{config?.title?.trim() || \"Volume discount\"}</h2>\n {loading ? <div className={styles.status}>Loading volume discounts…</div> : null}\n {error ? <div className={styles.error}>{error}</div> : null}\n {!loading && !error && !activeVariant ? (\n <div className={styles.status}>Select an eligible variant to view volume discounts.</div>\n ) : null}\n {!loading && !error && activeVariant ? (\n <>\n <div className={styles.rules}>\n {rules.map((rule) => {\n const percentValue = Number.parseFloat(rule.discountPercent);\n const subtitle = Number.isFinite(percentValue) && percentValue > 0\n ? `Save ${Math.round(percentValue)}%`\n : \"Standard\";\n const checked = selectedRuleHandle === rule.handle;\n\n return (\n <div\n key={rule.handle}\n className={[styles.rule, checked ? styles.ruleSelected : \"\"].filter(Boolean).join(\" \")}\n >\n <label className={styles.ruleLabel}>\n <div className={styles.ruleLabelContent}>\n <input\n className={styles.ruleInput}\n type=\"radio\"\n checked={checked}\n name=\"bb-volume-discount-rule\"\n onChange={() => {\n setSelectedRuleHandle(rule.handle);\n updateProductFormQuantity(rule.minBundleSize);\n }}\n />\n <span className={styles.ruleTitle}>{`Buy ${rule.minBundleSize}`}</span>\n <span className={styles.ruleSubtitle}>{subtitle}</span>\n </div>\n <div>\n {(() => {\n const unitPrice = Number(activeVariant.price ?? NaN);\n if (!Number.isFinite(unitPrice)) return null;\n const totalPrice = unitPrice * rule.minBundleSize;\n const hasDiscount = Number.isFinite(percentValue) && percentValue > 0;\n const discountedPrice = hasDiscount\n ? totalPrice * (1 - (percentValue / 100))\n : totalPrice;\n\n if (!hasDiscount) {\n return (\n <span className={styles.priceRow}>\n <span className={styles.newPrice}>\n {formatBundleCurrency(totalPrice, currencyCode, locale)}\n </span>\n </span>\n );\n }\n\n return (\n <span className={styles.priceRow}>\n <span className={styles.oldPrice}>\n {formatBundleCurrency(totalPrice, currencyCode, locale)}\n </span>\n <span className={styles.newPrice}>\n {formatBundleCurrency(discountedPrice, currencyCode, locale)}\n </span>\n </span>\n );\n })()}\n </div>\n </label>\n </div>\n );\n })}\n </div>\n </>\n ) : null}\n </section>\n );\n}\n","import type { BundleCartAdapter, BundleCartLineAttribute } from \"../types\";\n\nfunction toProperties(attributes?: BundleCartLineAttribute[]) {\n if (!attributes?.length) return undefined;\n return attributes.reduce<Record<string, string>>((acc, attr) => {\n if (attr?.key) acc[attr.key] = attr.value ?? \"\";\n return acc;\n }, {});\n}\n\nfunction normalizeVariantId(merchandiseId: string) {\n const match = /\\/(\\d+)$/.exec(merchandiseId);\n return match ? match[1] : merchandiseId;\n}\n\nfunction toVariantGid(variantId: string | number | null | undefined) {\n if (variantId == null) return null;\n const raw = String(variantId).trim();\n if (!raw) return null;\n if (raw.startsWith(\"gid://shopify/ProductVariant/\")) return raw;\n return `gid://shopify/ProductVariant/${raw}`;\n}\n\nfunction getShopifyTheme() {\n if (typeof window === \"undefined\") return null;\n return (window as Window & {\n Shopify?: { theme?: { schema_name?: string | null; name?: string | null } };\n }).Shopify?.theme ?? null;\n}\n\nfunction isSleekTheme() {\n const theme = getShopifyTheme();\n if (!theme) return false;\n\n if (theme.schema_name === \"Sleek\") return true;\n return /sleek/i.test(theme.name ?? \"\");\n}\n\nfunction hasSleekCartDrawer() {\n if (typeof document === \"undefined\") return false;\n return !!document.querySelector(\"cart-drawer\");\n}\n\nfunction tryOpenSleekCartDrawer() {\n if (!isSleekTheme() || !hasSleekCartDrawer()) return false;\n\n document.dispatchEvent(new CustomEvent(\"cart:refresh\", {\n bubbles: true,\n detail: { open: true },\n }));\n\n return true;\n}\n\n/**\n * Refreshes the page so the theme re-renders with the updated cart.\n * Liquid themes fetch cart state on load, so a full reload guarantees the cart UI\n * (drawer, icon bubble, etc.) shows the correct state after adding bundle items.\n */\nfunction reloadPageForCartUpdate() {\n window.location.reload();\n}\n\nasync function postCartJson(endpoint: string, payload: Record<string, unknown>) {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(text || `Cart request failed: ${res.status}`);\n }\n return res.json().catch(() => null);\n}\n\nasync function getCartJson() {\n const res = await fetch(\"/cart.js\", {\n method: \"GET\",\n cache: \"no-store\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n });\n if (!res.ok) {\n throw new Error(`Cart request failed: ${res.status}`);\n }\n return res.json() as Promise<{ items?: Array<{ id?: number | string | null; quantity?: number | null }> }>;\n}\n\nexport function createLiquidCartAdapter(): BundleCartAdapter {\n return {\n async linesAdd(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesAddForCheckout(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesUpdate(lines) {\n for (const line of lines) {\n await postCartJson(\"/cart/change.js\", {\n id: line.id,\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n });\n }\n },\n async linesRemove(lineIds) {\n for (const id of lineIds) {\n await postCartJson(\"/cart/change.js\", { id, quantity: 0 });\n }\n },\n async getLineQuantitiesByMerchandiseId() {\n const cart = await getCartJson();\n const quantities: Record<string, number> = {};\n for (const item of cart.items ?? []) {\n const merchandiseId = toVariantGid(item.id);\n if (!merchandiseId) continue;\n const quantity = Number(item.quantity ?? 0);\n if (!Number.isFinite(quantity) || quantity <= 0) continue;\n quantities[merchandiseId] = (quantities[merchandiseId] ?? 0) + Math.floor(quantity);\n }\n return quantities;\n },\n openCartUI() {\n if (tryOpenSleekCartDrawer()) return;\n\n // Reload the page so the theme fetches and displays the updated cart.\n window.setTimeout(() => reloadPageForCartUpdate(), 0);\n },\n navigateToCheckout() {\n // Navigate to Shopify checkout page\n window.location.href = \"/checkout\";\n },\n };\n}\n"],"names":["BundleLineAttributeKeys","fetchActiveBundleConfigs","params","url","json","fetchBundleConfig","fetchBundleConfigStatus","getVariantSelectionLimit","variant","quantity","ANONYMOUS_USER_ID_KEY","getOrCreateAnonymousUserId","existing","newId","cryptoAny","trackEvent","analyticsEndpoint","shop","event","response","error","EN","FR","DE","ES","DICTS","normalizeBundleLocale","raw","value","base","translateBundleUi","locale","key","vars","overrides","template","_a","text","name","formatBundleCurrency","amount","currencyCode","n","getProductWord","count","plural","BundleBuilderContext","createContext","BUNDLE_DRAWER_HASH","EMPTY_ELIGIBLE_VARIANTS","normalizeBundleHandle","getBundleHashHandle","hash","prefix","STYLE_SETTINGS_TO_CSS_VAR","GOOGLE_FONTS_LINK_ID","fontNameToParam","s","injectGoogleFontsLink","styles","body","title","families","href","link","injectStyleVariables","root","cssVar","getEffectiveStyleSettings","configSettings","preview","safeRandomUUID","clampQty","clampToVariantLimit","limit","normalized","shouldUseActiveConfigPreload","allowDrawerWhenInactive","initialData","BundleProvider","props","apiBaseUrl","cartAdapter","configHandle","configFetcher","activeConfigsFetcher","configStatusFetcher","providedAnalyticsEndpoint","inputLocale","messages","children","t","useCallback","normalizedInitialHandle","useActivePreload","isOpen","setIsOpen","useState","submitting","setSubmitting","setError","cartSyncing","setCartSyncing","cartQuantitiesByMerchandiseId","setCartQuantitiesByMerchandiseId","currentHandle","setCurrentHandleState","configCache","setConfigCache","bootstrapLoading","setBootstrapLoading","blockingHandleLoad","setBlockingHandleLoad","statusCheckPending","setStatusCheckPending","pendingOpenHandle","setPendingOpenHandle","selectionsState","setSelectionsState","preloadAbortRef","useRef","handleFetchAbortRef","statusAbortRef","cartSyncSeqRef","currentHandleRef","configCacheRef","bootstrapLoadingRef","openForHandleRef","fetcher","defaultFetchBundleConfig","activePreloadFetcher","statusFetcher","loadCartQuantities","quantities","acc","id","q","refreshCartQuantities","syncSeq","useEffect","setConfigHandle","handle","close","anonymousUserId","trackError","openDrawerOnly","current","applyLatestConfigResponse","prev","next","refreshHandleConfig","options","normalizedHandle","ac","fetchError","message","loadHandle","cachedEntry","openForHandle","source","_b","status","open","toggle","entry","openIfHash","handleInHash","currentEntry","config","eligibleVariants","loading","effective","handlePreviewStyles","win","applyPreviewConfig","previewConfig","previewVariants","previewVariantsLoading","maxBundleSize","useMemo","variantSelectionLimitById","baseLimit","inCart","eligibleVariantIdsSet","minRequired","rules","ruleMin","rule","normalizedRuleMin","configuredRaw","configuredMin","setQuantity","merchandiseId","variantLimit","prevQty","requestedDelta","currentBundleSize","sum","variantRemaining","delta","nextQty","nextSelections","rest","nextOrder","remainingToRemove","keptReversed","i","prevBundleSize","nextBundleSize","basePayload","nextSelectionsEntries","nextQuantity","remainingById","remaining","clearSelections","syncCartQuantities","getVariantMaxSelectableQuantity","selections","selectionOrder","bundleSize","canSubmit","performCartAddition","bundleId","bundleTitle","latestCartQuantities","effectiveLimitById","lines","line","byId","grossPrice","price","rulesSorted","a","b","appliedRule","appliedDiscountPercent","pct","discountedPrice","discountedAmount","productVariantIds","discountThresholdIdentifier","discountLabel","isCheckout","addError","rawMessage","isStockError","submit","submitAndCheckout","jsx","useBundleBuilder","ctx","useContext","useBundleBuilderDrawer","BundleButton","tweenFunctions","_c","d","c","p","v","tweenFunctions_1","degreesToRads","degrees","randomRange","min","max","randomInt","ParticleShape","RotationDirection","DEFAULT_FRAME_TIME","Particle","context","getOptions","x","y","colors","initialVelocityX","initialVelocityY","elapsed","gravity","wind","friction","opacity","drawShape","frameTimeMultiplier","rotateDelta","ParticleGenerator","canvas","newParticleX","newParticleY","particlesGenerated","lastNumberOfPieces","run","recycle","numberOfPieces","debug","tweenFunction","tweenDuration","nP","activeCount","tweenedVal","numToAdd","confettiDefaults","tweens.easeInOutQuad","Confetti","opts","computedConfettiDefaults","timestamp","onConfettiComplete","frameRate","lastRunState","lastRecycleState","ref","React","ReactConfettiInternal","extractCanvasProps","confettiOptions","passedProps","canvasStyles","refs","confettiOptionKeys","refProps","prop","val","ReactConfetti","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","iconNode","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","Plus","Search","Trash2","BundleBuilderDrawer","isSearchOpen","setIsSearchOpen","searchQuery","setSearchQuery","searchInputRef","footerRef","celebrationChipRef","windowSize","setWindowSize","confettiKey","setConfettiKey","confettiSource","setConfettiSource","isConfettiActive","setIsConfettiActive","confettiTimerRef","prevBundleSizeForConfettiRef","confettiSettleMs","celebrationKey","setCelebrationKey","celebrationText","setCelebrationText","isCelebrationActive","setIsCelebrationActive","celebrationTimerRef","celebrationDurationMs","DEFAULT_CONFETTI_COLORS","confettiColors","formatPercent0dp","formatVariantOptions","selectedOptions","o","getVariantPrimaryName","getVariantA11yLabel","isMounted","setIsMounted","closeTimerRef","formatMoney","isAtMaxBundleSize","sorted","filteredVariants","tokens","matches","parts","haystack","itemsRemaining","best","r","firstRule","hasUnlockedFirstDiscount","subtotal","total","variantId","qty","discountedTotal","maxRuleSize","filledVariants","thresholdByIndex","map","idx","slotCount","isDualButtonAnimationLoaded","setIsDualButtonAnimationLoaded","prevItemsRemainingRef","wasPositive","panelRef","bodyRef","boxSummaryWindowRef","prevBundleSizeRef","scrollVariantRowIntoView","container","row","padding","maxTop","rowCenterOffset","targetTop","nextTop","onKeyDown","e","onResize","raf","hitThreshold","nextThreshold","targetIdx","el","containerRect","deltaRight","maxLeft","nextLeft","hitRule","k","chipEl","rect","panelRect","originX","originY","jsxs","variantPrimaryName","variantOptionText","variantA11y","variantSelectionLimit","normalizedVariantSelectionLimit","isAtVariantStockLimit","canIncreaseQuantity","stockStatusLabel","discountPercentToUse","originalPriceNumber","hasDiscount","discountedPriceNumber","_d","_","threshold","isFilled","isThreshold","showThreshold","discountText","titleText","Fragment","buttonMode","BundleBuilderPanel","showRules","showVariants","sortedVariants","variantsRef","lineIndex","ruleForLine","isUnavailable","isClickable","normalizeVariantId","digits","getCurrentVariantId","variantParam","productForm","input","getQuantityInput","getCurrentQuantity","quantityInput","updateProductFormQuantity","VolumeDiscountPanel","preferFirstEligibleVariant","currentVariantId","setCurrentVariantId","currentQuantity","setCurrentQuantity","selectedRuleHandle","setSelectedRuleHandle","shouldPreferFirstEligibleVariant","syncVariantId","timer","syncQuantity","handleQuantityEvent","target","activeVariantId","activeVariant","matchedRuleHandle","percentValue","subtitle","checked","unitPrice","totalPrice","toProperties","attributes","attr","toVariantGid","getShopifyTheme","isSleekTheme","theme","hasSleekCartDrawer","tryOpenSleekCartDrawer","reloadPageForCartUpdate","postCartJson","endpoint","payload","res","getCartJson","createLiquidCartAdapter","items","lineIds","cart","item"],"mappings":"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","x_google_ignoreList":[11,12,13,14,15,16,17,18,19]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/constants.ts","../src/api/fetchActiveBundleConfigs.ts","../src/api/fetchBundleConfig.ts","../src/api/fetchBundleConfigStatus.ts","../src/utils/stock.ts","../src/utils/analytics.ts","../src/i18n.ts","../src/context/BundleProvider.tsx","../src/hooks/useBundleBuilder.ts","../src/hooks/useBundleBuilderDrawer.ts","../src/components/BundleButton.tsx","../../../node_modules/tween-functions/index.js","../../../node_modules/react-confetti/dist/react-confetti.mjs","../../../node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/lucide-react/dist/esm/icons/chevron-down.js","../../../node_modules/lucide-react/dist/esm/icons/plus.js","../../../node_modules/lucide-react/dist/esm/icons/search.js","../../../node_modules/lucide-react/dist/esm/icons/trash-2.js","../src/components/BundleBuilderDrawer.tsx","../src/components/BundleBuilderPanel.tsx","../src/components/VolumeDiscountPanel.tsx","../src/adapters/LiquidAdapter.ts"],"sourcesContent":["export const BundleLineAttributeKeys = {\n bundleId: \"_bundle_id\",\n bundleConfig: \"_bundle_config\",\n bundleSource: \"_bundle_source\",\n bundleTitle: \"_bundle_title\",\n} as const;\n\nexport const BundleSessionStorageKeys = {\n pendingActions: \"best_bundles_pending_actions\",\n redirectedBundleState: \"best_bundles_redirected_bundle_state\",\n} as const;\n","import type { PublicActiveBundleConfigsResponse } from \"../types\";\n\nexport async function fetchActiveBundleConfigs(params: {\n apiBaseUrl: string;\n shop: string;\n signal?: AbortSignal;\n}): Promise<PublicActiveBundleConfigsResponse> {\n const url = new URL(\"/api/public/bundle-configs-active\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicActiveBundleConfigsResponse;\n}\n","import type { PublicBundleConfigResponse } from \"../types\";\n\nexport async function fetchBundleConfig(params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n fresh?: boolean;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigResponse> {\n const url = new URL(\"/api/public/bundle-config\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n if (params.configHandle) {\n url.searchParams.set(\"handle\", params.configHandle);\n }\n if (params.fresh) {\n url.searchParams.set(\"fresh\", \"1\");\n }\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n // The endpoint uses 4xx/5xx for some errors; normalize to {ok:false}.\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigResponse;\n}\n","import type { PublicBundleConfigStatusResponse } from \"../types\";\n\nexport async function fetchBundleConfigStatus(params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigStatusResponse> {\n const url = new URL(\"/api/public/bundle-config-status\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n if (params.configHandle) {\n url.searchParams.set(\"handle\", params.configHandle);\n }\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigStatusResponse;\n}\n","import type { BundleEligibleVariant } from \"../types\";\n\nexport function getVariantSelectionLimit(variant: BundleEligibleVariant | null | undefined) {\n if (!variant || variant.availableForSale === false) return 0;\n if (variant.inventoryPolicy === \"CONTINUE\") return Number.POSITIVE_INFINITY;\n // Untracked inventory can surface as null/0 sellable quantity while still available for sale.\n if (variant.sellableOnlineQuantity == null) return Number.POSITIVE_INFINITY;\n\n const quantity = Number(variant.sellableOnlineQuantity);\n if (!Number.isFinite(quantity)) return Number.POSITIVE_INFINITY;\n if (quantity <= 0 && variant.availableForSale === true) return Number.POSITIVE_INFINITY;\n return Math.max(0, Math.floor(quantity));\n}\n\nexport function isVariantAtStockLimit(\n variant: BundleEligibleVariant | null | undefined,\n quantity: number,\n) {\n const limit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(limit)) return false;\n return Math.max(0, Math.floor(quantity || 0)) >= limit;\n}\n","const ANONYMOUS_USER_ID_KEY = \"bb_anonymous_user_id\";\n\n/**\n * Gets or creates an anonymous user ID stored in localStorage.\n * This ID persists across sessions to attribute events to the same user.\n */\nexport function getOrCreateAnonymousUserId(): string {\n if (typeof window === \"undefined\" || typeof localStorage === \"undefined\") {\n // Fallback for SSR or environments without localStorage\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n try {\n const existing = localStorage.getItem(ANONYMOUS_USER_ID_KEY);\n if (existing && typeof existing === \"string\" && existing.length > 0) {\n return existing;\n }\n\n // Generate new ID\n let newId: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) {\n newId = cryptoAny.randomUUID();\n } else {\n throw new Error(\"crypto.randomUUID not available\");\n }\n } catch {\n // Fallback UUID generation\n newId = `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n localStorage.setItem(ANONYMOUS_USER_ID_KEY, newId);\n return newId;\n } catch {\n // If localStorage fails, generate a temporary ID\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n\nexport type AnalyticsEventType =\n | \"DRAWER_OPENED\"\n | \"DRAWER_CLOSED\"\n | \"VARIANT_SELECTION_CHANGED\"\n | \"BUNDLE_ADDED_TO_BASKET\";\n\n/** Mixpanel event names used for the bundle funnel (backend maps these to Mixpanel). */\nexport type MixpanelBundleEventName =\n | \"bundle_opened\"\n | \"bundle_closed\"\n | \"bundle_started\"\n | \"bundle_completed\"\n | \"bundle_added_to_cart\"\n | \"checkout_started_with_bundle\";\n\nexport type DrawerOpenedEvent = {\n eventType: \"DRAWER_OPENED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_opened\";\n};\n\nexport type DrawerClosedEvent = {\n eventType: \"DRAWER_CLOSED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_closed\";\n};\n\nexport type VariantSelectionChangedEvent = {\n eventType: \"VARIANT_SELECTION_CHANGED\";\n shop: string;\n anonymousUserId: string;\n before: Record<string, number>; // variantId -> quantity\n after: Record<string, number>;\n timestamp: string;\n mixpanelEvent?: \"bundle_started\" | \"bundle_completed\";\n};\n\nexport type BundleAddedToBasketEvent = {\n eventType: \"BUNDLE_ADDED_TO_BASKET\";\n shop: string;\n anonymousUserId: string;\n bundleId: string;\n productVariantIds: string[];\n grossPrice: number;\n discountedPrice: number;\n currency?: string;\n discountThresholdIdentifier: string; // rule handle\n discountLabel: string;\n discountPercentage: number | null;\n discountedAmount: number;\n timestamp: string;\n checkout?: boolean;\n mixpanelEvent?: \"bundle_added_to_cart\" | \"checkout_started_with_bundle\";\n};\n\nexport type AnalyticsEvent =\n | DrawerOpenedEvent\n | DrawerClosedEvent\n | VariantSelectionChangedEvent\n | BundleAddedToBasketEvent;\n\n/**\n * Sends an analytics event to the backend API endpoint.\n * Failures are silently caught to prevent breaking bundle functionality.\n */\nexport async function trackEvent(\n analyticsEndpoint: string,\n shop: string,\n event: AnalyticsEvent,\n): Promise<void> {\n if (typeof window === \"undefined\") {\n return; // Skip in SSR\n }\n\n try {\n const url = new URL(analyticsEndpoint, window.location.origin);\n url.searchParams.set(\"shop\", shop);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(event),\n // Don't wait for response - fire and forget\n keepalive: true,\n });\n\n if (!response.ok) {\n console.warn(\n `[Bundle Analytics] Event tracking failed with status ${response.status}:`,\n await response.text().catch(() => \"Unable to read response\"),\n );\n }\n } catch (error) {\n // Log error for debugging but don't break bundle functionality\n console.warn(\"[Bundle Analytics] Failed to track event:\", error);\n }\n}\n","export type BundleUiLocale = \"en\" | \"fr\" | \"de\" | \"es\";\n\nexport type BundleUiMessageKey =\n | \"bundle.title.default\"\n | \"bundle.loading\"\n | \"bundle.empty\"\n | \"bundle.drawer.aria\"\n | \"bundle.search\"\n | \"bundle.search.expanded\"\n | \"bundle.search.placeholder\"\n | \"bundle.search.clear\"\n | \"bundle.close\"\n | \"bundle.section.discount_tiers\"\n | \"bundle.section.your_bundle\"\n | \"bundle.section.select_items\"\n | \"bundle.select.items\"\n | \"bundle.size.min\"\n | \"bundle.stock.max_reached\"\n | \"bundle.stock.max_added\"\n | \"bundle.stock.sold_out\"\n | \"bundle.item.generic\"\n | \"bundle.slot\"\n | \"bundle.unlocks\"\n | \"bundle.totals\"\n | \"bundle.discount.badge\"\n | \"bundle.discount.off_label\"\n | \"bundle.celebration.received_discount\"\n | \"bundle.cta.adding\"\n | \"bundle.cta.processing\"\n | \"bundle.cta.checkout\"\n | \"bundle.cta.add_to_bundle\"\n | \"bundle.cta.add_to_basket\"\n | \"bundle.cta.add_more\"\n | \"bundle.powered_by\"\n | \"bundle.button.default\"\n | \"bundle.provider.inactive_error\"\n | \"bundle.provider.load_error\"\n | \"bundle.provider.stock_error\"\n | \"bundle.provider.add_error\"\n | \"bundle.a11y.add_to_bundle\"\n | \"bundle.a11y.remove_from_bundle\"\n | \"bundle.a11y.quantity\"\n | \"bundle.a11y.sold_out\"\n | \"bundle.a11y.max_available_selected\"\n | \"bundle.a11y.increase\"\n | \"bundle.a11y.decrease\"\n | \"bundle.select.variant\"\n | \"bundle.stock.sold_out_suffix\";\n\nexport type BundleUiMessages = Partial<Record<BundleUiMessageKey, string>>;\n\ntype Dict = Record<BundleUiMessageKey, string>;\n\nconst EN: Dict = {\n \"bundle.title.default\": \"Build your bundle\",\n \"bundle.loading\": \"Loading...\",\n \"bundle.empty\": \"Your selected eligible products for bundling will show here\",\n \"bundle.drawer.aria\": \"Bundle builder\",\n \"bundle.search\": \"Search\",\n \"bundle.search.expanded\": \"Search (expanded)\",\n \"bundle.search.placeholder\": \"Search\",\n \"bundle.search.clear\": \"Clear search\",\n \"bundle.close\": \"Close\",\n \"bundle.section.discount_tiers\": \"Discount tiers\",\n \"bundle.section.your_bundle\": \"Your bundle\",\n \"bundle.section.select_items\": \"Choose items\",\n \"bundle.select.items\": \"Select items\",\n \"bundle.size.min\": \"(min {{min}})\",\n \"bundle.stock.max_reached\": \"Max Reached\",\n \"bundle.stock.max_added\": \"Max Added To Cart\",\n \"bundle.stock.sold_out\": \"Sold Out\",\n \"bundle.item.generic\": \"Item\",\n \"bundle.slot\": \"Slot {{slot}}\",\n \"bundle.unlocks\": \"Unlocks {{discount}}\",\n \"bundle.totals\": \"Totals\",\n \"bundle.discount.badge\": \"{{discount}}% Discount\",\n \"bundle.discount.off_label\": \"{{discount}}% off\",\n \"bundle.celebration.received_discount\": \"You received a {{discount}}% discount!\",\n \"bundle.cta.adding\": \"Adding...\",\n \"bundle.cta.processing\": \"Processing...\",\n \"bundle.cta.checkout\": \"Checkout\",\n \"bundle.cta.add_to_bundle\": \"Add\",\n \"bundle.cta.add_to_basket\": \"Add to Basket\",\n \"bundle.cta.add_more\": \"Add {{count}} more {{productWord}}\",\n \"bundle.powered_by\": \"powered by\",\n \"bundle.button.default\": \"Build a bundle\",\n \"bundle.provider.inactive_error\": \"Bundle is inactive.\",\n \"bundle.provider.load_error\": \"Failed to load bundle config.\",\n \"bundle.provider.stock_error\": \"Some bundle items are no longer available in the requested quantity. Please review your selection.\",\n \"bundle.provider.add_error\": \"We couldn't add this bundle right now. Please try again.\",\n \"bundle.a11y.add_to_bundle\": \"Add {{name}} to bundle\",\n \"bundle.a11y.remove_from_bundle\": \"Remove {{name}} from bundle\",\n \"bundle.a11y.quantity\": \"{{name}} quantity {{qty}}\",\n \"bundle.a11y.sold_out\": \"{{name}} is sold out\",\n \"bundle.a11y.max_available_selected\": \"{{name}} max available selected\",\n \"bundle.a11y.increase\": \"Increase {{name}}\",\n \"bundle.a11y.decrease\": \"Decrease {{name}}\",\n \"bundle.select.variant\": \"Select\",\n \"bundle.stock.sold_out_suffix\": \"— Sold Out\",\n};\n\nconst FR: Dict = {\n ...EN,\n \"bundle.title.default\": \"Creez votre bundle\",\n \"bundle.loading\": \"Chargement...\",\n \"bundle.empty\": \"Vos produits eligibles selectionnes pour le bundle apparaitront ici\",\n \"bundle.drawer.aria\": \"Constructeur de bundle\",\n \"bundle.search\": \"Rechercher\",\n \"bundle.search.expanded\": \"Rechercher (deplie)\",\n \"bundle.search.placeholder\": \"Rechercher\",\n \"bundle.search.clear\": \"Effacer la recherche\",\n \"bundle.close\": \"Fermer\",\n \"bundle.section.discount_tiers\": \"Paliers de remise\",\n \"bundle.section.your_bundle\": \"Votre bundle\",\n \"bundle.section.select_items\": \"Choisir des articles\",\n \"bundle.select.items\": \"Selectionner des articles\",\n \"bundle.stock.max_reached\": \"Maximum atteint\",\n \"bundle.stock.max_added\": \"Maximum deja dans le panier\",\n \"bundle.stock.sold_out\": \"Rupture de stock\",\n \"bundle.totals\": \"Totaux\",\n \"bundle.discount.badge\": \"{{discount}}% de réduction\",\n \"bundle.discount.off_label\": \"{{discount}}% de réduction\",\n \"bundle.celebration.received_discount\": \"Vous avez recu une reduction de {{discount}}% !\",\n \"bundle.cta.checkout\": \"Paiement\",\n \"bundle.cta.add_to_bundle\": \"Ajouter\",\n \"bundle.cta.add_to_basket\": \"Ajouter au panier\",\n \"bundle.cta.add_more\": \"Ajoutez encore {{count}} {{productWord}}\",\n \"bundle.powered_by\": \"propulse par\",\n \"bundle.button.default\": \"Creer un bundle\",\n \"bundle.a11y.add_to_bundle\": \"Ajouter {{name}} au bundle\",\n \"bundle.a11y.remove_from_bundle\": \"Retirer {{name}} du bundle\",\n \"bundle.a11y.quantity\": \"Quantite de {{name}} : {{qty}}\",\n \"bundle.a11y.sold_out\": \"{{name}} est en rupture de stock\",\n \"bundle.a11y.max_available_selected\": \"{{name}} quantite maximale deja selectionnee\",\n \"bundle.a11y.increase\": \"Augmenter {{name}}\",\n \"bundle.a11y.decrease\": \"Diminuer {{name}}\",\n \"bundle.select.variant\": \"Sélectionner\",\n \"bundle.stock.sold_out_suffix\": \"— Rupture de stock\",\n};\n\nconst DE: Dict = {\n ...EN,\n \"bundle.title.default\": \"Bundle erstellen\",\n \"bundle.loading\": \"Wird geladen...\",\n \"bundle.empty\": \"Ihre ausgewahlten bundelbaren Produkte werden hier angezeigt\",\n \"bundle.drawer.aria\": \"Bundle-Builder\",\n \"bundle.search\": \"Suchen\",\n \"bundle.search.expanded\": \"Suche (erweitert)\",\n \"bundle.search.placeholder\": \"Suchen\",\n \"bundle.search.clear\": \"Suche loschen\",\n \"bundle.close\": \"Schliessen\",\n \"bundle.section.discount_tiers\": \"Rabattstufen\",\n \"bundle.section.your_bundle\": \"Ihr Bundle\",\n \"bundle.section.select_items\": \"Artikel auswahlen\",\n \"bundle.select.items\": \"Artikel auswahlen\",\n \"bundle.stock.max_reached\": \"Maximum erreicht\",\n \"bundle.stock.max_added\": \"Maximum bereits im Warenkorb\",\n \"bundle.stock.sold_out\": \"Ausverkauft\",\n \"bundle.totals\": \"Summen\",\n \"bundle.discount.badge\": \"{{discount}}% Rabatt\",\n \"bundle.discount.off_label\": \"{{discount}}% Rabatt\",\n \"bundle.celebration.received_discount\": \"Sie haben {{discount}}% Rabatt erhalten!\",\n \"bundle.cta.checkout\": \"Zur Kasse\",\n \"bundle.cta.add_to_bundle\": \"Hinzufügen\",\n \"bundle.cta.add_to_basket\": \"In den Warenkorb\",\n \"bundle.cta.add_more\": \"Fuge noch {{count}} {{productWord}} hinzu\",\n \"bundle.powered_by\": \"powered by\",\n \"bundle.button.default\": \"Bundle erstellen\",\n \"bundle.a11y.add_to_bundle\": \"{{name}} zum Bundle hinzufügen\",\n \"bundle.a11y.remove_from_bundle\": \"{{name}} aus dem Bundle entfernen\",\n \"bundle.a11y.quantity\": \"{{name}} Menge {{qty}}\",\n \"bundle.a11y.sold_out\": \"{{name}} ist ausverkauft\",\n \"bundle.a11y.max_available_selected\": \"{{name}} maximale verfugbare Menge bereits ausgewahlt\",\n \"bundle.a11y.increase\": \"{{name}} erhöhen\",\n \"bundle.a11y.decrease\": \"{{name}} verringern\",\n \"bundle.select.variant\": \"Auswählen\",\n \"bundle.stock.sold_out_suffix\": \"— Ausverkauft\",\n};\n\nconst ES: Dict = {\n ...EN,\n \"bundle.title.default\": \"Crea tu bundle\",\n \"bundle.loading\": \"Cargando...\",\n \"bundle.empty\": \"Tus productos elegibles seleccionados para el bundle se mostraran aqui\",\n \"bundle.drawer.aria\": \"Constructor de bundles\",\n \"bundle.search\": \"Buscar\",\n \"bundle.search.expanded\": \"Buscar (expandido)\",\n \"bundle.search.placeholder\": \"Buscar\",\n \"bundle.search.clear\": \"Limpiar busqueda\",\n \"bundle.close\": \"Cerrar\",\n \"bundle.section.discount_tiers\": \"Niveles de descuento\",\n \"bundle.section.your_bundle\": \"Tu bundle\",\n \"bundle.section.select_items\": \"Elegir articulos\",\n \"bundle.select.items\": \"Seleccionar articulos\",\n \"bundle.stock.max_reached\": \"Maximo alcanzado\",\n \"bundle.stock.max_added\": \"Maximo agregado al carrito\",\n \"bundle.stock.sold_out\": \"Agotado\",\n \"bundle.totals\": \"Totales\",\n \"bundle.discount.badge\": \"{{discount}}% de descuento\",\n \"bundle.discount.off_label\": \"{{discount}}% de descuento\",\n \"bundle.celebration.received_discount\": \"Has recibido un {{discount}}% de descuento!\",\n \"bundle.cta.checkout\": \"Pagar\",\n \"bundle.cta.add_to_bundle\": \"Agregar\",\n \"bundle.cta.add_to_basket\": \"Agregar al carrito\",\n \"bundle.cta.add_more\": \"Agrega {{count}} {{productWord}} mas\",\n \"bundle.powered_by\": \"impulsado por\",\n \"bundle.button.default\": \"Crear bundle\",\n \"bundle.a11y.add_to_bundle\": \"Agregar {{name}} al bundle\",\n \"bundle.a11y.remove_from_bundle\": \"Quitar {{name}} del bundle\",\n \"bundle.a11y.quantity\": \"Cantidad de {{name}}: {{qty}}\",\n \"bundle.a11y.sold_out\": \"{{name}} esta agotado\",\n \"bundle.a11y.max_available_selected\": \"{{name}} cantidad maxima disponible ya seleccionada\",\n \"bundle.a11y.increase\": \"Aumentar {{name}}\",\n \"bundle.a11y.decrease\": \"Disminuir {{name}}\",\n \"bundle.select.variant\": \"Seleccionar\",\n \"bundle.stock.sold_out_suffix\": \"— Agotado\",\n};\n\nconst DICTS: Record<BundleUiLocale, Dict> = {\n en: EN,\n fr: FR,\n de: DE,\n es: ES,\n};\n\nexport function normalizeBundleLocale(raw: string | null | undefined): BundleUiLocale {\n const value = String(raw ?? \"\").trim().toLowerCase();\n if (!value) return \"en\";\n const base = value.split(\"-\")[0] ?? \"en\";\n if (base === \"fr\" || base === \"de\" || base === \"en\" || base === \"es\") return base;\n return \"en\";\n}\n\nexport function translateBundleUi(\n locale: BundleUiLocale,\n key: BundleUiMessageKey,\n vars?: Record<string, string | number>,\n overrides?: BundleUiMessages,\n): string {\n const template = overrides?.[key] ?? DICTS[locale]?.[key] ?? EN[key] ?? key;\n if (!vars) return template;\n return Object.entries(vars).reduce((text, [name, value]) => {\n return text.replaceAll(`{{${name}}}`, String(value));\n }, template);\n}\n\nexport function formatBundleCurrency(amount: string | number, currencyCode: string | null, locale: string) {\n const n = Number(amount);\n if (!Number.isFinite(n)) return String(amount);\n\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(locale || undefined, { style: \"currency\", currency: currencyCode }).format(n);\n } catch {\n // ignore and fall through\n }\n }\n\n return `$${n.toFixed(2)}`;\n}\n\nexport function getProductWord(locale: BundleUiLocale, count: number) {\n const plural = count === 1 ? \"one\" : \"many\";\n if (locale === \"fr\") return plural === \"one\" ? \"produit\" : \"produits\";\n if (locale === \"de\") return plural === \"one\" ? \"Produkt\" : \"Produkte\";\n if (locale === \"es\") return plural === \"one\" ? \"producto\" : \"productos\";\n return plural === \"one\" ? \"product\" : \"products\";\n}\n","import { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { fetchActiveBundleConfigs } from \"../api/fetchActiveBundleConfigs\";\nimport { fetchBundleConfig as defaultFetchBundleConfig } from \"../api/fetchBundleConfig\";\nimport { fetchBundleConfigStatus } from \"../api/fetchBundleConfigStatus\";\nimport { BundleLineAttributeKeys, BundleSessionStorageKeys } from \"../constants\";\nimport type {\n BundleCartAdapter,\n BundleConfig,\n BundleCartLineAttribute,\n BundleEligibleVariant,\n BundleSelectedLine,\n BundleSelectionSnapshot,\n PublicActiveBundleConfigsResponse,\n PublicBundleConfigResponse,\n PublicBundleConfigStatusResponse,\n StyleSettings,\n} from \"../types\";\nimport { getVariantSelectionLimit } from \"../utils/stock\";\nimport { getOrCreateAnonymousUserId, trackEvent } from \"../utils/analytics\";\nimport type { BundleUiLocale, BundleUiMessageKey, BundleUiMessages } from \"../i18n\";\nimport { normalizeBundleLocale, translateBundleUi } from \"../i18n\";\n\ntype BundleProviderData = {\n currencyCode: string | null;\n config: BundleConfig;\n eligibleVariants: BundleEligibleVariant[];\n};\n\ntype BundleProviderCacheEntry = BundleProviderData;\ntype BundleConfigCache = Record<string, BundleProviderCacheEntry>;\ntype BundleSelectionState = Record<string, number>;\ntype BundleSelectionOrder = string[];\ntype BundleSelectedLines = BundleSelectedLine[];\ntype OpenSource = \"api\" | \"hash\" | \"click\";\n\nexport type BundleProviderProps = {\n apiBaseUrl: string;\n shop: string;\n cartAdapter: BundleCartAdapter;\n configHandle?: string;\n initialData?: BundleProviderData;\n configFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n fresh?: boolean;\n signal?: AbortSignal;\n }) => Promise<PublicBundleConfigResponse>;\n activeConfigsFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n signal?: AbortSignal;\n }) => Promise<PublicActiveBundleConfigsResponse>;\n configStatusFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n }) => Promise<PublicBundleConfigStatusResponse>;\n analyticsEndpoint?: string;\n allowDrawerWhenInactive?: boolean;\n locale?: string;\n messages?: BundleUiMessages;\n children: React.ReactNode;\n};\n\nexport type BundleBuilderContextValue = {\n isOpen: boolean;\n open: () => void;\n openForHandle: (handle: string, source?: OpenSource) => void;\n close: () => void;\n toggle: () => void;\n syncCartQuantities: () => Promise<void>;\n currentHandle: string;\n setConfigHandle: (handle: string) => void;\n loadHandle: (handle: string) => void;\n\n loading: boolean;\n submitting: boolean;\n error: string | null;\n\n currencyCode: string | null;\n config: BundleConfig | null;\n eligibleVariants: BundleEligibleVariant[];\n\n selections: BundleSelectionState;\n selectionOrder: BundleSelectionOrder;\n selectedLines: BundleSelectedLines;\n getVariantMaxSelectableQuantity: (merchandiseId: string) => number | null;\n setQuantity: (merchandiseId: string, quantity: number) => void;\n addConfiguredVariant: (input: {\n merchandiseId: string;\n configHandle?: string;\n attributes?: BundleCartLineAttribute[];\n restoreSnapshot?: BundleSelectionSnapshot | null;\n }) => boolean;\n getSelectionSnapshot: () => BundleSelectionSnapshot;\n restoreSelectionSnapshot: (snapshot: BundleSelectionSnapshot | null | undefined) => void;\n redirectVariantToProductPage: (variant: BundleEligibleVariant) => void;\n clearSelections: () => void;\n\n bundleSize: number;\n minRequired: number;\n canSubmit: boolean;\n submit: () => Promise<void>;\n submitAndCheckout: () => Promise<void>;\n locale: BundleUiLocale;\n t: (key: BundleUiMessageKey, vars?: Record<string, string | number>) => string;\n};\n\nexport const BundleBuilderContext = createContext<BundleBuilderContextValue | null>(null);\n\nconst BUNDLE_DRAWER_HASH = \"#best-bundles\";\nconst EMPTY_ELIGIBLE_VARIANTS: BundleEligibleVariant[] = [];\n\nfunction normalizeBundleHandle(raw: string | null | undefined) {\n const value = String(raw ?? \"\").trim().toLowerCase();\n if (!value) return \"default\";\n const cleaned = value\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+/, \"\")\n .replace(/-+$/, \"\")\n .replace(/-{2,}/g, \"-\");\n return cleaned || \"default\";\n}\n\nfunction getBundleHashHandle(hash: string): string | null {\n const value = String(hash ?? \"\").trim().toLowerCase();\n if (!value.startsWith(BUNDLE_DRAWER_HASH)) return null;\n if (value === BUNDLE_DRAWER_HASH) return \"default\";\n const prefix = `${BUNDLE_DRAWER_HASH}:`;\n if (!value.startsWith(prefix)) return null;\n return normalizeBundleHandle(value.slice(prefix.length));\n}\n\ntype StyleSettingCssVarKey = Exclude<keyof StyleSettings, \"confettiColors\">;\nconst STYLE_SETTINGS_TO_CSS_VAR: Record<StyleSettingCssVarKey, string> = {\n primaryColor: \"--bb-cta-bg\",\n primaryHoverColor: \"--bb-cta-bg-hover\",\n primaryTextColor: \"--bb-cta-text\",\n backgroundColor: \"--bb-surface-bg\",\n backdropColor: \"--bb-backdrop-bg\",\n textColor: \"--bb-text-color\",\n titleColor: \"--bb-title-color\",\n mutedTextColor: \"--bb-muted-color\",\n borderRadius: \"--bb-panel-radius\",\n borderColor: \"--bb-border-color\",\n borderStrongColor: \"--bb-border-strong-color\",\n focusRingColor: \"--bb-focus-ring\",\n tierBorderColor: \"--bb-tier-border\",\n tierTextColor: \"--bb-tier-text\",\n tierBackgroundColor: \"--bb-tier-bg\",\n celebrationTextColor: \"--bb-celebration-text\",\n celebrationBgTop: \"--bb-celebration-bg-top\",\n celebrationBgBottom: \"--bb-celebration-bg-bottom\",\n celebrationBorderColor: \"--bb-celebration-border\",\n fontFamilyBody: \"--bb-font-family-body\",\n fontFamilyTitle: \"--bb-font-family-title\",\n};\n\nconst GOOGLE_FONTS_LINK_ID = \"bb-google-fonts\";\n\nfunction fontNameToParam(name: string): string {\n const s = (name ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n return s ? encodeURIComponent(s).replace(/%20/g, \"+\") : \"\";\n}\n\nfunction injectGoogleFontsLink(styles: StyleSettings | undefined) {\n if (typeof document === \"undefined\" || !document.head) return;\n if (!styles) {\n document.getElementById(GOOGLE_FONTS_LINK_ID)?.remove();\n return;\n }\n const body = (styles.fontFamilyBody ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const title = (styles.fontFamilyTitle ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const families: string[] = [];\n if (body) families.push(\"family=\" + fontNameToParam(body));\n if (title && title !== body) families.push(\"family=\" + fontNameToParam(title));\n const existing = document.getElementById(GOOGLE_FONTS_LINK_ID) as HTMLLinkElement | null;\n if (families.length === 0) {\n existing?.remove();\n return;\n }\n const href = `https://fonts.googleapis.com/css2?${families.join(\"&\")}&display=swap`;\n if (existing) {\n if (existing.getAttribute(\"href\") !== href) existing.setAttribute(\"href\", href);\n return;\n }\n const link = document.createElement(\"link\");\n link.id = GOOGLE_FONTS_LINK_ID;\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n}\n\nfunction injectStyleVariables(styles: StyleSettings | undefined) {\n if (!styles) return;\n injectGoogleFontsLink(styles);\n const root = document.documentElement;\n (Object.entries(STYLE_SETTINGS_TO_CSS_VAR) as Array<[StyleSettingCssVarKey, string]>).forEach(([key, cssVar]) => {\n let value = styles[key];\n if (value) {\n if ((key === \"fontFamilyBody\" || key === \"fontFamilyTitle\") && /^\\s*\\S+\\s+\\S/.test(value) && !/^[\"']/.test(value.trim())) {\n value = `\"${value.trim().replace(/^[\"']|[\"']$/g, \"\")}\"`;\n }\n root.style.setProperty(cssVar, value);\n }\n });\n}\n\nfunction getEffectiveStyleSettings(configSettings: StyleSettings | undefined): StyleSettings | undefined {\n if (typeof window === \"undefined\") return configSettings;\n const preview = (window as Window & { __BUNDLE_PREVIEW_STYLES__?: StyleSettings }).__BUNDLE_PREVIEW_STYLES__;\n if (preview && typeof preview === \"object\") return preview;\n return configSettings;\n}\n\nfunction safeRandomUUID() {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) return cryptoAny.randomUUID();\n } catch {\n // ignore\n }\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction clampQty(n: number) {\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.floor(n));\n}\n\nfunction clampToVariantLimit(quantity: number, limit: number) {\n const normalized = clampQty(quantity);\n if (!Number.isFinite(limit)) return normalized;\n return Math.min(normalized, Math.max(0, Math.floor(limit)));\n}\n\nfunction normalizeLineAttributes(attributes?: BundleCartLineAttribute[]) {\n if (!Array.isArray(attributes) || !attributes.length) return undefined;\n const normalized = attributes\n .map((attribute) => {\n const key = String(attribute?.key ?? \"\").trim();\n if (!key) return null;\n return {\n key,\n value: String(attribute?.value ?? \"\"),\n };\n })\n .filter(Boolean) as BundleCartLineAttribute[];\n return normalized.length ? normalized : undefined;\n}\n\nfunction attributesSignature(attributes?: BundleCartLineAttribute[]) {\n const normalized = normalizeLineAttributes(attributes);\n if (!normalized?.length) return \"\";\n return JSON.stringify(\n [...normalized]\n .sort((a, b) => a.key.localeCompare(b.key) || a.value.localeCompare(b.value)),\n );\n}\n\nfunction createSelectedLine(merchandiseId: string, attributes?: BundleCartLineAttribute[]): BundleSelectedLine {\n return {\n id: safeRandomUUID(),\n merchandiseId,\n quantity: 1,\n attributes: normalizeLineAttributes(attributes),\n };\n}\n\nfunction snapshotFromLines(lines: BundleSelectedLines): BundleSelectionSnapshot {\n return {\n lines: lines.map((line) => ({\n id: line.id,\n merchandiseId: line.merchandiseId,\n quantity: clampQty(line.quantity || 1) || 1,\n ...(line.attributes?.length ? { attributes: normalizeLineAttributes(line.attributes) } : {}),\n })),\n };\n}\n\nfunction restoreLinesFromSnapshot(snapshot: BundleSelectionSnapshot | null | undefined): BundleSelectedLines {\n if (!snapshot || !Array.isArray(snapshot.lines)) return [];\n return snapshot.lines\n .map((line) => {\n const merchandiseId = String(line?.merchandiseId ?? \"\").trim();\n if (!merchandiseId) return null;\n return {\n id: String(line?.id ?? \"\").trim() || safeRandomUUID(),\n merchandiseId,\n quantity: clampQty(line?.quantity || 1) || 1,\n attributes: normalizeLineAttributes(line?.attributes),\n } satisfies BundleSelectedLine;\n })\n .filter(Boolean) as BundleSelectedLines;\n}\n\nfunction shouldUseActiveConfigPreload(\n allowDrawerWhenInactive: boolean,\n initialData?: BundleProviderData,\n) {\n return !allowDrawerWhenInactive && !initialData;\n}\n\nexport function BundleProvider(props: BundleProviderProps) {\n const {\n apiBaseUrl,\n shop,\n cartAdapter,\n configHandle = \"default\",\n initialData,\n configFetcher,\n activeConfigsFetcher,\n configStatusFetcher,\n analyticsEndpoint: providedAnalyticsEndpoint,\n allowDrawerWhenInactive = false,\n locale: inputLocale,\n messages,\n children,\n } = props;\n\n const locale = normalizeBundleLocale(inputLocale);\n const t = useCallback((key: BundleUiMessageKey, vars?: Record<string, string | number>) => {\n return translateBundleUi(locale, key, vars, messages);\n }, [locale, messages]);\n\n const normalizedInitialHandle = normalizeBundleHandle(configHandle);\n const analyticsEndpoint = providedAnalyticsEndpoint ?? `${apiBaseUrl}/api/public/bundle-analytics`;\n const useActivePreload = shouldUseActiveConfigPreload(allowDrawerWhenInactive, initialData);\n\n const [isOpen, setIsOpen] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [cartSyncing, setCartSyncing] = useState(false);\n const [cartQuantitiesByMerchandiseId, setCartQuantitiesByMerchandiseId] = useState<Record<string, number>>({});\n const [currentHandle, setCurrentHandleState] = useState(normalizedInitialHandle);\n const [configCache, setConfigCache] = useState<BundleConfigCache>(() => (\n initialData ? { [normalizedInitialHandle]: initialData } : {}\n ));\n const [bootstrapLoading, setBootstrapLoading] = useState(useActivePreload);\n const [blockingHandleLoad, setBlockingHandleLoad] = useState<string | null>(\n !useActivePreload && !initialData ? normalizedInitialHandle : null,\n );\n const [statusCheckPending, setStatusCheckPending] = useState<string | null>(null);\n const [pendingOpenHandle, setPendingOpenHandle] = useState<{ handle: string; source: OpenSource } | null>(null);\n const [selectedLines, setSelectedLines] = useState<BundleSelectedLines>(() => []);\n\n const preloadAbortRef = useRef<AbortController | null>(null);\n const handleFetchAbortRef = useRef<AbortController | null>(null);\n const statusAbortRef = useRef<AbortController | null>(null);\n const cartSyncSeqRef = useRef(0);\n const currentHandleRef = useRef(currentHandle);\n const configCacheRef = useRef(configCache);\n const bootstrapLoadingRef = useRef(bootstrapLoading);\n const openForHandleRef = useRef<((handle: string, source?: OpenSource) => void) | null>(null);\n const skipSelectionResetOnHandleChangeRef = useRef(false);\n const preserveSelectionsUntilHandleLoadedRef = useRef<string | null>(null);\n const fetcher = configFetcher ?? defaultFetchBundleConfig;\n const activePreloadFetcher = activeConfigsFetcher ?? fetchActiveBundleConfigs;\n const statusFetcher = configStatusFetcher ?? fetchBundleConfigStatus;\n\n const loadCartQuantities = useCallback(async () => {\n if (typeof cartAdapter.getLineQuantitiesByMerchandiseId !== \"function\") return null;\n const quantities = await cartAdapter.getLineQuantitiesByMerchandiseId();\n return Object.entries(quantities ?? {}).reduce<Record<string, number>>((acc, [id, quantity]) => {\n const q = clampQty(quantity);\n if (q > 0) acc[id] = q;\n return acc;\n }, {});\n }, [cartAdapter]);\n\n const refreshCartQuantities = useCallback(async () => {\n const syncSeq = ++cartSyncSeqRef.current;\n setCartSyncing(true);\n try {\n const quantities = await loadCartQuantities();\n if (quantities && syncSeq === cartSyncSeqRef.current) {\n setCartQuantitiesByMerchandiseId(quantities);\n }\n return quantities;\n } catch {\n return null;\n } finally {\n if (syncSeq === cartSyncSeqRef.current) setCartSyncing(false);\n }\n }, [loadCartQuantities]);\n\n useEffect(() => {\n currentHandleRef.current = currentHandle;\n }, [currentHandle]);\n\n useEffect(() => {\n configCacheRef.current = configCache;\n }, [configCache]);\n\n useEffect(() => {\n bootstrapLoadingRef.current = bootstrapLoading;\n }, [bootstrapLoading]);\n\n useEffect(() => {\n void refreshCartQuantities();\n }, [refreshCartQuantities]);\n\n const setConfigHandle = useCallback((handle: string) => {\n setCurrentHandleState(normalizeBundleHandle(handle));\n }, []);\n\n const close = useCallback(() => {\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_CLOSED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_closed\",\n }).catch((trackError) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer closed:\", trackError);\n });\n } catch (trackError) {\n console.warn(\"[Bundle Analytics] Error in close() callback:\", trackError);\n }\n }\n setIsOpen(false);\n if (typeof window !== \"undefined\" && window.location.hash.toLowerCase().startsWith(BUNDLE_DRAWER_HASH)) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n }, [analyticsEndpoint, shop]);\n\n const openDrawerOnly = useCallback(() => {\n setIsOpen((current) => {\n if (current) return current;\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_OPENED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_opened\",\n }).catch((trackError) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer opened:\", trackError);\n });\n } catch (trackError) {\n console.warn(\"[Bundle Analytics] Error in open() callback:\", trackError);\n }\n }\n return true;\n });\n }, [analyticsEndpoint, shop]);\n\n const applyLatestConfigResponse = useCallback((handle: string, response: PublicBundleConfigResponse) => {\n if (!response.ok) {\n setConfigCache((prev) => {\n if (!prev[handle]) return prev;\n const next = { ...prev };\n delete next[handle];\n return next;\n });\n if (!allowDrawerWhenInactive && currentHandleRef.current === handle) {\n setError(response.ok ? t(\"bundle.provider.inactive_error\") : (response.error || t(\"bundle.provider.load_error\")));\n setIsOpen(false);\n if (typeof window !== \"undefined\" && window.location.hash.toLowerCase().startsWith(BUNDLE_DRAWER_HASH)) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n }\n return false;\n }\n\n if (response.config.isActive === false && !allowDrawerWhenInactive) {\n setConfigCache((prev) => {\n if (!prev[handle]) return prev;\n const next = { ...prev };\n delete next[handle];\n return next;\n });\n if (currentHandleRef.current === handle) {\n setError(t(\"bundle.provider.inactive_error\"));\n setIsOpen(false);\n if (typeof window !== \"undefined\" && window.location.hash.toLowerCase().startsWith(BUNDLE_DRAWER_HASH)) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n }\n return false;\n }\n\n setConfigCache((prev) => ({\n ...prev,\n [handle]: {\n currencyCode: response.currencyCode ?? null,\n config: response.config,\n eligibleVariants: response.eligibleVariants ?? [],\n },\n }));\n if (currentHandleRef.current === handle) {\n setError(null);\n }\n return true;\n }, [allowDrawerWhenInactive, t]);\n\n const refreshHandleConfig = useCallback((handle: string, options?: { blocking?: boolean }) => {\n const normalizedHandle = normalizeBundleHandle(handle);\n handleFetchAbortRef.current?.abort();\n const ac = new AbortController();\n handleFetchAbortRef.current = ac;\n\n if (options?.blocking) {\n setBlockingHandleLoad(normalizedHandle);\n }\n setError(null);\n\n fetcher({\n apiBaseUrl,\n shop,\n configHandle: normalizedHandle,\n fresh: options?.blocking === true && !configCacheRef.current[normalizedHandle],\n signal: ac.signal,\n })\n .then((response) => {\n if (ac.signal.aborted) return;\n applyLatestConfigResponse(normalizedHandle, response);\n })\n .catch((fetchError: unknown) => {\n if (ac.signal.aborted) return;\n const message = fetchError instanceof Error ? fetchError.message : t(\"bundle.provider.load_error\");\n if (currentHandleRef.current === normalizedHandle) setError(message);\n })\n .finally(() => {\n if (ac.signal.aborted) return;\n setBlockingHandleLoad((current) => current === normalizedHandle ? null : current);\n });\n }, [apiBaseUrl, applyLatestConfigResponse, fetcher, shop, t]);\n\n const loadHandle = useCallback((handle: string) => {\n const normalizedHandle = normalizeBundleHandle(handle);\n const cachedEntry = configCacheRef.current[normalizedHandle];\n setCurrentHandleState(normalizedHandle);\n setError(null);\n refreshHandleConfig(normalizedHandle, { blocking: !cachedEntry });\n }, [refreshHandleConfig]);\n\n const openForHandle = useCallback((handle: string, source: OpenSource = \"api\") => {\n const normalizedHandle = normalizeBundleHandle(handle);\n const cachedEntry = configCacheRef.current[normalizedHandle];\n\n if (useActivePreload && bootstrapLoadingRef.current && !cachedEntry) {\n setPendingOpenHandle({ handle: normalizedHandle, source });\n return;\n }\n\n setCurrentHandleState(normalizedHandle);\n\n if (allowDrawerWhenInactive) {\n openDrawerOnly();\n refreshHandleConfig(normalizedHandle, { blocking: !cachedEntry });\n return;\n }\n\n if (cachedEntry?.config?.isActive) {\n setError(null);\n openDrawerOnly();\n refreshHandleConfig(normalizedHandle, { blocking: false });\n return;\n }\n\n setStatusCheckPending(normalizedHandle);\n statusAbortRef.current?.abort();\n const ac = new AbortController();\n statusAbortRef.current = ac;\n\n statusFetcher({\n apiBaseUrl,\n shop,\n configHandle: normalizedHandle,\n signal: ac.signal,\n })\n .then((status) => {\n if (ac.signal.aborted) return;\n setStatusCheckPending((current) => current === normalizedHandle ? null : current);\n if (!status.ok || status.isActive !== true) {\n if (source === \"hash\" && typeof window !== \"undefined\" && getBundleHashHandle(window.location.hash) === normalizedHandle) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n return;\n }\n\n setError(null);\n setCurrentHandleState(normalizedHandle);\n openDrawerOnly();\n refreshHandleConfig(normalizedHandle, { blocking: true });\n })\n .catch(() => {\n if (ac.signal.aborted) return;\n setStatusCheckPending((current) => current === normalizedHandle ? null : current);\n });\n }, [\n allowDrawerWhenInactive,\n apiBaseUrl,\n openDrawerOnly,\n refreshHandleConfig,\n shop,\n statusFetcher,\n useActivePreload,\n ]);\n\n const open = useCallback(() => {\n void refreshCartQuantities();\n openForHandle(currentHandleRef.current, \"api\");\n }, [openForHandle, refreshCartQuantities]);\n\n useEffect(() => {\n openForHandleRef.current = openForHandle;\n }, [openForHandle]);\n\n const toggle = useCallback(() => {\n if (isOpen) {\n close();\n return;\n }\n void refreshCartQuantities();\n openForHandle(currentHandleRef.current, \"api\");\n }, [close, isOpen, openForHandle, refreshCartQuantities]);\n\n useEffect(() => {\n setCurrentHandleState(normalizeBundleHandle(configHandle));\n }, [configHandle]);\n\n useEffect(() => {\n if (!useActivePreload) {\n setBootstrapLoading(false);\n if (!initialData) {\n refreshHandleConfig(normalizedInitialHandle, { blocking: true });\n }\n return;\n }\n\n preloadAbortRef.current?.abort();\n const ac = new AbortController();\n preloadAbortRef.current = ac;\n setBootstrapLoading(true);\n\n activePreloadFetcher({ apiBaseUrl, shop, signal: ac.signal })\n .then((response: PublicActiveBundleConfigsResponse) => {\n if (ac.signal.aborted) return;\n if (!response.ok) return;\n setConfigCache((prev) => {\n const next: BundleConfigCache = { ...prev };\n for (const [handle, entry] of Object.entries(response.configs ?? {})) {\n next[normalizeBundleHandle(handle)] = {\n currencyCode: entry.currencyCode ?? null,\n config: entry.config,\n eligibleVariants: entry.eligibleVariants ?? [],\n };\n }\n return next;\n });\n })\n .catch(() => {\n // Ignore preload failures; open flow falls back to status + single fetch.\n })\n .finally(() => {\n if (ac.signal.aborted) return;\n setBootstrapLoading(false);\n });\n\n return () => ac.abort();\n }, [activePreloadFetcher, apiBaseUrl, initialData, normalizedInitialHandle, refreshHandleConfig, shop, useActivePreload]);\n\n useEffect(() => {\n if (bootstrapLoading || !pendingOpenHandle) return;\n openForHandle(pendingOpenHandle.handle, pendingOpenHandle.source);\n setPendingOpenHandle(null);\n }, [bootstrapLoading, openForHandle, pendingOpenHandle]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const openIfHash = () => {\n const handleInHash = getBundleHashHandle(window.location.hash);\n if (!handleInHash) return;\n openForHandleRef.current?.(handleInHash, \"hash\");\n };\n openIfHash();\n window.addEventListener(\"hashchange\", openIfHash);\n return () => window.removeEventListener(\"hashchange\", openIfHash);\n }, []);\n\n const currentEntry = configCache[currentHandle] ?? null;\n const config = currentEntry?.config ?? null;\n const eligibleVariants = currentEntry?.eligibleVariants ?? EMPTY_ELIGIBLE_VARIANTS;\n const currencyCode = currentEntry?.currencyCode ?? null;\n const loading = (!config && (blockingHandleLoad === currentHandle || statusCheckPending === currentHandle))\n || (allowDrawerWhenInactive && !config && blockingHandleLoad != null);\n\n useEffect(() => {\n const effective = getEffectiveStyleSettings(config?.styleSettings);\n if (effective) injectStyleVariables(effective);\n }, [config?.styleSettings]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handlePreviewStyles = () => {\n const effective = getEffectiveStyleSettings(undefined);\n if (effective) injectStyleVariables(effective);\n };\n window.addEventListener(\"bundle-preview-styles-updated\", handlePreviewStyles);\n return () => window.removeEventListener(\"bundle-preview-styles-updated\", handlePreviewStyles);\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const win = window as Window & {\n __BUNDLE_PREVIEW_CONFIG__?: BundleConfig;\n __BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__?: BundleEligibleVariant[];\n __BUNDLE_PREVIEW_VARIANTS_LOADING__?: boolean;\n };\n const applyPreviewConfig = () => {\n const previewConfig = win.__BUNDLE_PREVIEW_CONFIG__;\n if (!previewConfig) return;\n const previewVariants = Array.isArray(win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__)\n ? win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__\n : [];\n const previewVariantsLoading = win.__BUNDLE_PREVIEW_VARIANTS_LOADING__ === true;\n setConfigCache((prev) => ({\n ...prev,\n [currentHandleRef.current]: {\n currencyCode: currencyCode ?? null,\n config: previewConfig,\n eligibleVariants: previewVariantsLoading\n ? (prev[currentHandleRef.current]?.eligibleVariants ?? [])\n : previewVariants,\n },\n }));\n if (previewVariantsLoading) {\n setBlockingHandleLoad(currentHandleRef.current);\n } else {\n setBlockingHandleLoad((current) => current === currentHandleRef.current ? null : current);\n }\n };\n if (win.__BUNDLE_PREVIEW_CONFIG__) applyPreviewConfig();\n window.addEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n return () => window.removeEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n }, [currencyCode]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? Number.NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const variantSelectionLimitById = useMemo(() => {\n return new Map(\n eligibleVariants.map((variant) => {\n const baseLimit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(baseLimit)) return [variant.id, baseLimit] as const;\n const inCart = clampQty(cartQuantitiesByMerchandiseId[variant.id] ?? 0);\n return [variant.id, Math.max(0, Math.floor(baseLimit) - inCart)] as const;\n }),\n );\n }, [eligibleVariants, cartQuantitiesByMerchandiseId]);\n\n const eligibleVariantIdsSet = useMemo(() => {\n return new Set(\n eligibleVariants\n .filter((variant) => getVariantSelectionLimit(variant) > 0)\n .map((variant) => variant.id),\n );\n }, [eligibleVariants]);\n\n const minRequired = useMemo(() => {\n const rules = config?.rules ?? [];\n const ruleMin = rules.length ? Math.min(...rules.map((rule) => rule.minBundleSize)) : 2;\n const normalizedRuleMin = Number.isFinite(ruleMin) && ruleMin > 0 ? ruleMin : 2;\n const configuredRaw = Number(config?.minBundleSize ?? Number.NaN);\n const configuredMin =\n Number.isFinite(configuredRaw) && Number.isInteger(configuredRaw)\n ? Math.max(2, Math.min(100, configuredRaw))\n : null;\n return configuredMin == null\n ? normalizedRuleMin\n : Math.min(normalizedRuleMin, configuredMin);\n }, [config?.minBundleSize, config?.rules]);\n\n const getSelectionsFromLines = useCallback((lines: BundleSelectedLines) => {\n return lines.reduce<BundleSelectionState>((acc, line) => {\n const quantity = clampQty(line.quantity || 1) || 1;\n acc[line.merchandiseId] = (acc[line.merchandiseId] ?? 0) + quantity;\n return acc;\n }, {});\n }, []);\n\n const setQuantity = useCallback((merchandiseId: string, quantity: number) => {\n if (cartSyncing) return;\n if (!eligibleVariantIdsSet.has(merchandiseId)) {\n if (!loading) return;\n }\n\n const variantLimit = variantSelectionLimitById.get(merchandiseId) ?? (loading ? Number.POSITIVE_INFINITY : 0);\n const q = clampToVariantLimit(quantity, variantLimit);\n setSelectedLines((prev) => {\n const prevSelections = getSelectionsFromLines(prev);\n const prevQty = prevSelections[merchandiseId] ?? 0;\n const requestedDelta = q - prevQty;\n const currentBundleSize = prev.length;\n const variantRemaining =\n Number.isFinite(variantLimit)\n ? Math.max(0, Math.floor(variantLimit) - prevQty)\n : requestedDelta;\n const delta =\n requestedDelta > 0\n ? Math.min(\n requestedDelta,\n Math.max(0, maxBundleSize - currentBundleSize),\n variantRemaining,\n )\n : requestedDelta;\n\n if (delta === 0) return prev;\n\n let nextLines = prev;\n if (delta > 0) {\n nextLines = [...prev, ...Array.from({ length: delta }, () => createSelectedLine(merchandiseId))];\n } else {\n let remainingToRemove = -delta;\n const keptReversed: BundleSelectedLines = [];\n for (let i = prev.length - 1; i >= 0; i--) {\n const line = prev[i];\n if (line.merchandiseId === merchandiseId && remainingToRemove > 0) {\n remainingToRemove--;\n continue;\n }\n keptReversed.push(line);\n }\n keptReversed.reverse();\n nextLines = keptReversed;\n }\n\n const nextSelections = getSelectionsFromLines(nextLines);\n const prevBundleSize = currentBundleSize;\n const nextBundleSize = nextLines.length;\n\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const basePayload = {\n eventType: \"VARIANT_SELECTION_CHANGED\" as const,\n shop,\n anonymousUserId,\n before: { ...prevSelections },\n after: { ...nextSelections },\n timestamp: new Date().toISOString(),\n };\n trackEvent(analyticsEndpoint, shop, basePayload);\n\n if (prevBundleSize === 0 && nextBundleSize >= 1) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_started\",\n });\n }\n if (prevBundleSize < minRequired && nextBundleSize >= minRequired) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_completed\",\n });\n }\n } catch {\n // Analytics should not break functionality.\n }\n }\n\n return nextLines;\n });\n }, [analyticsEndpoint, cartSyncing, eligibleVariantIdsSet, getSelectionsFromLines, loading, maxBundleSize, minRequired, shop, variantSelectionLimitById]);\n\n const addConfiguredVariant = useCallback((input: {\n merchandiseId: string;\n configHandle?: string;\n attributes?: BundleCartLineAttribute[];\n restoreSnapshot?: BundleSelectionSnapshot | null;\n }) => {\n const merchandiseId = String(input.merchandiseId ?? \"\").trim();\n if (!merchandiseId) return false;\n const targetHandle = normalizeBundleHandle(input.configHandle ?? currentHandleRef.current);\n const isTargetingDifferentHandle = targetHandle !== currentHandleRef.current;\n const targetEntry = isTargetingDifferentHandle ? configCacheRef.current[targetHandle] : currentEntry;\n const targetEligibleVariantIdsSet = targetEntry\n ? new Set(\n targetEntry.eligibleVariants\n .filter((variant) => getVariantSelectionLimit(variant) > 0)\n .map((variant) => variant.id),\n )\n : null;\n if (\n (!isTargetingDifferentHandle || targetEligibleVariantIdsSet)\n && !(targetEligibleVariantIdsSet ?? eligibleVariantIdsSet).has(merchandiseId)\n && !loading\n ) {\n return false;\n }\n\n const baseLines = input.restoreSnapshot ? restoreLinesFromSnapshot(input.restoreSnapshot) : null;\n const currentSelections = getSelectionsFromLines(baseLines ?? selectedLines);\n const currentQty = currentSelections[merchandiseId] ?? 0;\n const targetMaxBundleSize = (() => {\n const raw = Number(targetEntry?.config?.maxBundleSize ?? maxBundleSize ?? Number.NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n })();\n const variantLimit = (() => {\n if (targetEntry) {\n const targetVariant = targetEntry.eligibleVariants.find((variant) => variant.id === merchandiseId);\n if (targetVariant) {\n const baseLimit = getVariantSelectionLimit(targetVariant);\n if (!Number.isFinite(baseLimit)) return Number.POSITIVE_INFINITY;\n const inCart = clampQty(cartQuantitiesByMerchandiseId[merchandiseId] ?? 0);\n return Math.max(0, Math.floor(baseLimit) - inCart);\n }\n }\n return isTargetingDifferentHandle || loading ? Number.POSITIVE_INFINITY : 0;\n })();\n const currentBundleSize = (baseLines ?? selectedLines).length;\n const canAddAnother =\n currentBundleSize < targetMaxBundleSize\n && (!Number.isFinite(variantLimit) || currentQty < Math.max(0, Math.floor(variantLimit)));\n\n if (!canAddAnother) return false;\n\n const nextLines = [...(baseLines ?? selectedLines), createSelectedLine(merchandiseId, input.attributes)];\n if (isTargetingDifferentHandle) {\n skipSelectionResetOnHandleChangeRef.current = true;\n preserveSelectionsUntilHandleLoadedRef.current = targetHandle;\n setCurrentHandleState(targetHandle);\n setError(null);\n refreshHandleConfig(targetHandle, { blocking: !configCacheRef.current[targetHandle] });\n }\n setSelectedLines(nextLines);\n setError(null);\n openDrawerOnly();\n return true;\n }, [cartQuantitiesByMerchandiseId, currentEntry, eligibleVariantIdsSet, getSelectionsFromLines, loading, maxBundleSize, openDrawerOnly, refreshHandleConfig, selectedLines]);\n\n useEffect(() => {\n const isWaitingForPreservedHandle =\n preserveSelectionsUntilHandleLoadedRef.current === currentHandle\n && (!currentEntry || blockingHandleLoad === currentHandle);\n if (loading || isWaitingForPreservedHandle) return;\n setSelectedLines((prev) => {\n const nextLines = prev.filter((line) => {\n if (!eligibleVariantIdsSet.has(line.merchandiseId)) return false;\n const limit = variantSelectionLimitById.get(line.merchandiseId) ?? 0;\n return !Number.isFinite(limit) || limit > 0;\n });\n\n if (nextLines.length <= maxBundleSize) {\n return nextLines.length === prev.length ? prev : nextLines;\n }\n return nextLines.slice(0, maxBundleSize);\n });\n }, [blockingHandleLoad, currentEntry, currentHandle, eligibleVariantIdsSet, loading, maxBundleSize, variantSelectionLimitById]);\n\n useEffect(() => {\n if (\n preserveSelectionsUntilHandleLoadedRef.current === currentHandle\n && currentEntry\n && blockingHandleLoad !== currentHandle\n ) {\n preserveSelectionsUntilHandleLoadedRef.current = null;\n }\n }, [blockingHandleLoad, currentEntry, currentHandle]);\n\n useEffect(() => {\n if (skipSelectionResetOnHandleChangeRef.current) {\n skipSelectionResetOnHandleChangeRef.current = false;\n return;\n }\n setSelectedLines([]);\n }, [currentHandle]);\n\n const clearSelections = useCallback(() => setSelectedLines([]), []);\n const syncCartQuantities = useCallback(async () => {\n await refreshCartQuantities();\n }, [refreshCartQuantities]);\n const getVariantMaxSelectableQuantity = useCallback((merchandiseId: string) => {\n const limit = variantSelectionLimitById.get(merchandiseId);\n if (limit == null || !Number.isFinite(limit)) return null;\n return Math.max(0, Math.floor(limit));\n }, [variantSelectionLimitById]);\n const selections = useMemo(() => getSelectionsFromLines(selectedLines), [getSelectionsFromLines, selectedLines]);\n const selectionOrder = useMemo(() => selectedLines.map((line) => line.merchandiseId), [selectedLines]);\n\n const bundleSize = selectedLines.length;\n\n const canSubmit = useMemo(() => {\n if (loading || cartSyncing || submitting) return false;\n if (error) return false;\n if (!config?.isActive) return false;\n if (bundleSize < minRequired) return false;\n return true;\n }, [bundleSize, cartSyncing, config?.isActive, error, loading, minRequired, submitting]);\n\n const getSelectionSnapshot = useCallback(() => snapshotFromLines(selectedLines), [selectedLines]);\n\n const restoreSelectionSnapshot = useCallback((snapshot: BundleSelectionSnapshot | null | undefined) => {\n setSelectedLines(restoreLinesFromSnapshot(snapshot));\n }, []);\n\n const redirectVariantToProductPage = useCallback((variant: BundleEligibleVariant) => {\n if (typeof window === \"undefined\") return;\n const productHandle = variant.product?.handle?.trim();\n if (!productHandle) return;\n const params = new URLSearchParams();\n const variantParam = variant.id.match(/\\/(\\d+)$/)?.[1];\n if (variantParam) params.set(\"variant\", variantParam);\n params.set(\"best_bundles_source\", \"bundle_builder\");\n params.set(\"best_bundles_handle\", currentHandle);\n try {\n window.sessionStorage.setItem(\n BundleSessionStorageKeys.redirectedBundleState,\n JSON.stringify({\n bundleHandle: currentHandle,\n returnUrl: window.location.href,\n snapshot: getSelectionSnapshot(),\n }),\n );\n } catch {\n // Ignore storage failures and still navigate.\n }\n const search = params.toString();\n window.location.href = `/products/${productHandle}${search ? `?${search}` : \"\"}`;\n }, [currentHandle, getSelectionSnapshot]);\n\n const performCartAddition = useCallback(async (options?: { onComplete?: () => void; checkout?: boolean }) => {\n if (!canSubmit || !config) return;\n\n const bundleId = safeRandomUUID();\n const bundleTitle = (config.title ?? \"\").trim().slice(0, 255);\n const latestCartQuantities = await refreshCartQuantities();\n const effectiveLimitById = new Map(\n eligibleVariants.map((variant) => {\n const baseLimit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(baseLimit)) return [variant.id, baseLimit] as const;\n const inCart = clampQty((latestCartQuantities ?? cartQuantitiesByMerchandiseId)[variant.id] ?? 0);\n return [variant.id, Math.max(0, Math.floor(baseLimit) - inCart)] as const;\n }),\n );\n const linesBySignature = new Map<string, {\n merchandiseId: string;\n quantity: number;\n attributes: BundleCartLineAttribute[];\n }>();\n\n for (const selectedLine of selectedLines) {\n if (!eligibleVariantIdsSet.has(selectedLine.merchandiseId)) continue;\n const remaining = effectiveLimitById.get(selectedLine.merchandiseId) ?? 0;\n const existingQtyForVariant = Array.from(linesBySignature.values())\n .filter((line) => line.merchandiseId === selectedLine.merchandiseId)\n .reduce((sum, line) => sum + line.quantity, 0);\n if (Number.isFinite(remaining) && existingQtyForVariant >= remaining) continue;\n const attributes = [\n { key: BundleLineAttributeKeys.bundleId, value: bundleId },\n { key: BundleLineAttributeKeys.bundleConfig, value: currentHandle },\n { key: BundleLineAttributeKeys.bundleSource, value: \"bundle_builder\" },\n ...(bundleTitle ? [{ key: BundleLineAttributeKeys.bundleTitle, value: bundleTitle }] : []),\n ...(normalizeLineAttributes(selectedLine.attributes) ?? []),\n ];\n const signature = `${selectedLine.merchandiseId}:${attributesSignature(selectedLine.attributes)}`;\n const existing = linesBySignature.get(signature);\n if (existing) {\n existing.quantity += 1;\n } else {\n linesBySignature.set(signature, {\n merchandiseId: selectedLine.merchandiseId,\n quantity: 1,\n attributes,\n });\n }\n }\n\n const lines = Array.from(linesBySignature.values());\n\n if (!lines.length) return;\n\n const byId = new Map(eligibleVariants.map((variant) => [variant.id, variant] as const));\n let grossPrice = 0;\n for (const line of lines) {\n const q = line.quantity ?? 0;\n if (q <= 0) continue;\n const variant = byId.get(line.merchandiseId);\n const price = Number(variant?.price);\n if (!Number.isFinite(price)) continue;\n grossPrice += price * q;\n }\n grossPrice = Math.round(grossPrice * 100) / 100;\n\n const rulesSorted = [...(config.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n let appliedRule: (typeof rulesSorted)[number] | null = null;\n for (const rule of rulesSorted) {\n if (bundleSize >= rule.minBundleSize) appliedRule = rule;\n }\n\n const appliedDiscountPercent = appliedRule\n ? (() => {\n const pct = Number.parseFloat(appliedRule!.discountPercent);\n return Number.isFinite(pct) && pct > 0 ? pct : null;\n })()\n : null;\n\n const discountedPrice = appliedDiscountPercent\n ? Math.round(grossPrice * (1 - appliedDiscountPercent / 100) * 100) / 100\n : grossPrice;\n const discountedAmount = grossPrice - discountedPrice;\n const productVariantIds = lines.map((line) => line.merchandiseId);\n const discountThresholdIdentifier = appliedRule?.handle ?? \"\";\n const discountLabel = appliedRule?.label?.trim() || \"\";\n\n setSubmitting(true);\n try {\n if (options?.checkout) {\n await cartAdapter.linesAddForCheckout(lines);\n } else {\n await cartAdapter.linesAdd(lines);\n }\n\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const isCheckout = !!options?.checkout;\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"BUNDLE_ADDED_TO_BASKET\",\n shop,\n anonymousUserId,\n bundleId,\n productVariantIds,\n grossPrice,\n discountedPrice,\n currency: currencyCode ?? undefined,\n discountThresholdIdentifier,\n discountLabel,\n discountPercentage: appliedDiscountPercent,\n discountedAmount,\n timestamp: new Date().toISOString(),\n checkout: isCheckout,\n mixpanelEvent: isCheckout ? \"checkout_started_with_bundle\" : \"bundle_added_to_cart\",\n });\n } catch {\n // Analytics should not break functionality.\n }\n }\n\n clearSelections();\n close();\n void refreshCartQuantities();\n options?.onComplete?.();\n setError(null);\n } catch (addError) {\n const rawMessage = addError instanceof Error ? addError.message : \"\";\n const isStockError = /stock|sold out|inventory|insufficient|available|422/i.test(rawMessage);\n setError(\n isStockError\n ? t(\"bundle.provider.stock_error\")\n : t(\"bundle.provider.add_error\"),\n );\n void refreshCartQuantities();\n } finally {\n setSubmitting(false);\n }\n }, [\n analyticsEndpoint,\n bundleSize,\n canSubmit,\n cartAdapter,\n clearSelections,\n close,\n config,\n currencyCode,\n cartQuantitiesByMerchandiseId,\n currentHandle,\n eligibleVariantIdsSet,\n eligibleVariants,\n refreshCartQuantities,\n selectedLines,\n shop,\n t,\n ]);\n\n const submit = useCallback(async () => {\n await performCartAddition({\n onComplete: () => {\n cartAdapter.openCartUI?.();\n },\n });\n }, [cartAdapter, performCartAddition]);\n\n const submitAndCheckout = useCallback(async () => {\n await performCartAddition({\n checkout: true,\n onComplete: () => {\n cartAdapter.navigateToCheckout?.();\n },\n });\n }, [cartAdapter, performCartAddition]);\n\n const value: BundleBuilderContextValue = useMemo(() => ({\n isOpen,\n open,\n openForHandle,\n close,\n toggle,\n currentHandle,\n setConfigHandle,\n loadHandle,\n syncCartQuantities,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n selectedLines,\n getVariantMaxSelectableQuantity,\n setQuantity,\n addConfiguredVariant,\n getSelectionSnapshot,\n restoreSelectionSnapshot,\n redirectVariantToProductPage,\n clearSelections,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n }), [\n bundleSize,\n canSubmit,\n clearSelections,\n close,\n config,\n currencyCode,\n currentHandle,\n eligibleVariants,\n error,\n isOpen,\n loading,\n minRequired,\n open,\n openForHandle,\n selectedLines,\n selectionOrder,\n selections,\n setConfigHandle,\n loadHandle,\n syncCartQuantities,\n getVariantMaxSelectableQuantity,\n setQuantity,\n addConfiguredVariant,\n getSelectionSnapshot,\n restoreSelectionSnapshot,\n redirectVariantToProductPage,\n submit,\n submitAndCheckout,\n submitting,\n toggle,\n locale,\n t,\n ]);\n\n return <BundleBuilderContext.Provider value={value}>{children}</BundleBuilderContext.Provider>;\n}\n","import { useContext } from \"react\";\nimport { BundleBuilderContext } from \"../context/BundleProvider\";\n\nexport function useBundleBuilder() {\n const ctx = useContext(BundleBuilderContext);\n if (!ctx) {\n throw new Error(\"useBundleBuilder must be used within <BundleProvider />\");\n }\n return ctx;\n}\n\n","import { useBundleBuilder } from \"./useBundleBuilder\";\n\nexport type BundleBuilderDrawerControls = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n};\n\n/**\n * Convenience hook for controlling the drawer (alternative to using <BundleButton />).\n * Must be used within <BundleProvider />.\n */\nexport function useBundleBuilderDrawer(): BundleBuilderDrawerControls {\n const { isOpen, open, close, toggle } = useBundleBuilder();\n return { isOpen, open, close, toggle };\n}\n\n","import React from \"react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleButton.module.css\";\n\nexport type BundleButtonProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function BundleButton(props: BundleButtonProps) {\n const { toggle, t } = useBundleBuilder();\n return (\n <button\n type=\"button\"\n onClick={toggle}\n className={[styles.button, props.className].filter(Boolean).join(\" \")}\n >\n {props.children ?? t(\"bundle.button.default\")}\n </button>\n );\n}\n","'use strict';\n\n// t: current time, b: beginning value, _c: final value, d: total duration\nvar tweenFunctions = {\n linear: function(t, b, _c, d) {\n var c = _c - b;\n return c * t / d + b;\n },\n easeInQuad: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t + b;\n },\n easeOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (t /= d) * (t - 2) + b;\n },\n easeInOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t + b;\n } else {\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n }\n },\n easeInCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t + b;\n },\n easeOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t + 1) + b;\n },\n easeInOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n },\n easeInQuart: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t + b;\n },\n easeOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n },\n easeInOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t + b;\n } else {\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n },\n easeInQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t * t + b;\n },\n easeOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n },\n easeInOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n },\n easeInSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n },\n easeOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n },\n easeInOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n },\n easeInExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n },\n easeOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n },\n easeInOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n } else {\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n },\n easeInCirc: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n },\n easeOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n },\n easeInOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n } else {\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n },\n easeInElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n },\n easeOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n },\n easeInOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d / 2) === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n } else {\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b;\n }\n },\n easeInBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n },\n easeOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n },\n easeInOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n } else {\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }\n },\n easeInBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n v = tweenFunctions.easeOutBounce(d - t, 0, c, d);\n return c - v + b;\n },\n easeOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n },\n easeInOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n if (t < d / 2) {\n v = tweenFunctions.easeInBounce(t * 2, 0, c, d);\n return v * 0.5 + b;\n } else {\n v = tweenFunctions.easeOutBounce(t * 2 - d, 0, c, d);\n return v * 0.5 + c * 0.5 + b;\n }\n }\n};\n\nmodule.exports = tweenFunctions;\n","import { jsx } from 'react/jsx-runtime';\nimport React from 'react';\nimport * as tweens from 'tween-functions';\n\nfunction degreesToRads(degrees) {\n return (degrees * Math.PI) / 180;\n}\nfunction randomRange(min, max) {\n return min + Math.random() * (max - min);\n}\nfunction randomInt(min, max) {\n return Math.floor(min + Math.random() * (max - min + 1));\n}\n\nvar ParticleShape;\n(function (ParticleShape) {\n ParticleShape[ParticleShape[\"Circle\"] = 0] = \"Circle\";\n ParticleShape[ParticleShape[\"Square\"] = 1] = \"Square\";\n ParticleShape[ParticleShape[\"Strip\"] = 2] = \"Strip\";\n})(ParticleShape || (ParticleShape = {}));\nvar RotationDirection;\n(function (RotationDirection) {\n RotationDirection[RotationDirection[\"Positive\"] = 1] = \"Positive\";\n RotationDirection[RotationDirection[\"Negative\"] = -1] = \"Negative\";\n})(RotationDirection || (RotationDirection = {}));\nconst DEFAULT_FRAME_TIME = 1000 / 60;\nclass Particle {\n constructor(context, getOptions, x, y) {\n this.getOptions = getOptions;\n const { colors, initialVelocityX, initialVelocityY } = this.getOptions();\n this.context = context;\n this.x = x;\n this.y = y;\n this.w = randomRange(5, 20);\n this.h = randomRange(5, 20);\n this.radius = randomRange(5, 10);\n this.vx =\n typeof initialVelocityX === 'number'\n ? randomRange(-initialVelocityX, initialVelocityX)\n : randomRange(initialVelocityX.min, initialVelocityX.max);\n this.vy =\n typeof initialVelocityY === 'number'\n ? randomRange(-initialVelocityY, 0)\n : randomRange(initialVelocityY.min, initialVelocityY.max);\n this.shape = randomInt(0, 2);\n this.angle = degreesToRads(randomRange(0, 360));\n this.angularSpin = randomRange(-0.2, 0.2);\n this.color = colors[Math.floor(Math.random() * colors.length)];\n this.rotateY = randomRange(0, 1);\n this.rotationDirection = randomRange(0, 1)\n ? RotationDirection.Positive\n : RotationDirection.Negative;\n }\n update(elapsed) {\n const { gravity, wind, friction, opacity, drawShape } = this.getOptions();\n const frameTimeMultiplier = elapsed / DEFAULT_FRAME_TIME;\n this.x += this.vx * frameTimeMultiplier;\n this.y += this.vy * frameTimeMultiplier;\n this.vy += gravity * frameTimeMultiplier;\n this.vx += wind * frameTimeMultiplier;\n this.vx *= friction ** frameTimeMultiplier;\n this.vy *= friction ** frameTimeMultiplier;\n if (this.rotateY >= 1 &&\n this.rotationDirection === RotationDirection.Positive) {\n this.rotationDirection = RotationDirection.Negative;\n }\n else if (this.rotateY <= -1 &&\n this.rotationDirection === RotationDirection.Negative) {\n this.rotationDirection = RotationDirection.Positive;\n }\n const rotateDelta = 0.1 * this.rotationDirection * frameTimeMultiplier;\n this.rotateY += rotateDelta;\n this.angle += this.angularSpin;\n this.context.save();\n this.context.translate(this.x, this.y);\n this.context.rotate(this.angle);\n this.context.scale(1, this.rotateY);\n this.context.rotate(this.angle);\n this.context.beginPath();\n this.context.fillStyle = this.color;\n this.context.strokeStyle = this.color;\n this.context.globalAlpha = opacity;\n this.context.lineCap = 'round';\n this.context.lineWidth = 2;\n if (drawShape && typeof drawShape === 'function') {\n drawShape.call(this, this.context);\n }\n else {\n switch (this.shape) {\n case ParticleShape.Circle: {\n this.context.beginPath();\n this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);\n this.context.fill();\n break;\n }\n case ParticleShape.Square: {\n this.context.fillRect(-this.w / 2, -this.h / 2, this.w, this.h);\n break;\n }\n case ParticleShape.Strip: {\n this.context.fillRect(-this.w / 6, -this.h / 2, this.w / 3, this.h);\n break;\n }\n }\n }\n this.context.closePath();\n this.context.restore();\n }\n}\n\nclass ParticleGenerator {\n constructor(canvas, getOptions) {\n this.x = 0;\n this.y = 0;\n this.w = 0;\n this.h = 0;\n this.lastNumberOfPieces = 0;\n this.tweenProgress = 0;\n this.tweenFrom = 0;\n this.particles = [];\n this.particlesGenerated = 0;\n this.removeParticleAt = (i) => {\n this.particles.splice(i, 1);\n };\n this.getParticle = () => {\n const newParticleX = randomRange(this.x, this.w + this.x);\n const newParticleY = randomRange(this.y, this.h + this.y);\n return new Particle(this.context, this.getOptions, newParticleX, newParticleY);\n };\n this.animate = (elapsed) => {\n const { canvas, context, particlesGenerated, lastNumberOfPieces } = this;\n const { run, recycle, numberOfPieces, debug, tweenFunction, tweenDuration, } = this.getOptions();\n if (!run) {\n return false;\n }\n const nP = this.particles.length;\n const activeCount = recycle ? nP : particlesGenerated;\n // Initial population\n if (activeCount < numberOfPieces) {\n // Use the numberOfPieces prop as a key to reset the easing timing\n if (lastNumberOfPieces !== numberOfPieces) {\n this.tweenProgress = 0;\n this.tweenFrom = activeCount;\n this.lastNumberOfPieces = numberOfPieces;\n }\n // Clamp tweenProgress between 0 and tweenDuration\n this.tweenProgress = Math.min(tweenDuration, Math.max(0, this.tweenProgress + elapsed));\n const tweenedVal = tweenFunction(this.tweenProgress, this.tweenFrom, numberOfPieces, tweenDuration);\n const numToAdd = Math.round(tweenedVal - activeCount);\n for (let i = 0; i < numToAdd; i++) {\n this.particles.push(this.getParticle());\n }\n this.particlesGenerated += numToAdd;\n }\n if (debug) {\n // Draw debug text\n context.font = '12px sans-serif';\n context.fillStyle = '#333';\n context.textAlign = 'right';\n context.fillText(`Particles: ${nP}`, canvas.width - 10, canvas.height - 20);\n }\n // Maintain the population, iterating backwards to prevent issues when removing particles\n for (let i = this.particles.length - 1; i >= 0; i--) {\n const p = this.particles[i];\n // Update each particle's position\n p.update(elapsed);\n // Prune the off-canvas particles\n if (p.y > canvas.height ||\n p.y < -100 ||\n p.x > canvas.width + 100 ||\n p.x < -100) {\n if (recycle && activeCount <= numberOfPieces) {\n // Replace the particle with a brand new one\n this.particles[i] = this.getParticle();\n }\n else {\n this.removeParticleAt(i);\n }\n }\n }\n return nP > 0 || activeCount < numberOfPieces;\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.getOptions = getOptions;\n }\n}\n\nconst confettiDefaults = {\n width: typeof window !== 'undefined' ? window.innerWidth : 300,\n height: typeof window !== 'undefined' ? window.innerHeight : 200,\n numberOfPieces: 200,\n friction: 0.99,\n wind: 0,\n gravity: 0.1,\n initialVelocityX: 4,\n initialVelocityY: 10,\n colors: [\n '#f44336',\n '#e91e63',\n '#9c27b0',\n '#673ab7',\n '#3f51b5',\n '#2196f3',\n '#03a9f4',\n '#00bcd4',\n '#009688',\n '#4CAF50',\n '#8BC34A',\n '#CDDC39',\n '#FFEB3B',\n '#FFC107',\n '#FF9800',\n '#FF5722',\n '#795548',\n ],\n opacity: 1.0,\n debug: false,\n tweenFunction: tweens.easeInOutQuad,\n tweenDuration: 5000,\n recycle: true,\n run: true,\n};\nclass Confetti {\n constructor(canvas, opts) {\n this.lastFrameTime = 0;\n this.setOptionsWithDefaults = (opts) => {\n const computedConfettiDefaults = {\n confettiSource: {\n x: 0,\n y: 0,\n w: this.canvas.width,\n h: 0,\n },\n };\n this._options = {\n ...computedConfettiDefaults,\n ...confettiDefaults,\n ...opts,\n };\n Object.assign(this, opts.confettiSource);\n };\n this.update = (timestamp = 0) => {\n const { options: { run, onConfettiComplete, frameRate }, canvas, context, } = this;\n // Cap elapsed time to 50ms to prevent large time steps\n const elapsed = Math.min(timestamp - this.lastFrameTime, 50);\n // Throttle the frame rate if set\n if (frameRate && elapsed < 1000 / frameRate) {\n this.rafId = requestAnimationFrame(this.update);\n return;\n }\n this.lastFrameTime = timestamp - (frameRate ? elapsed % frameRate : 0);\n if (run) {\n context.fillStyle = 'white';\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n if (this.generator.animate(elapsed)) {\n this.rafId = requestAnimationFrame(this.update);\n }\n else {\n if (onConfettiComplete &&\n typeof onConfettiComplete === 'function' &&\n this.generator.particlesGenerated > 0) {\n onConfettiComplete.call(this, this);\n }\n this._options.run = false;\n }\n };\n this.reset = () => {\n if (this.generator && this.generator.particlesGenerated > 0) {\n this.generator.particlesGenerated = 0;\n this.generator.particles = [];\n this.generator.lastNumberOfPieces = 0;\n }\n };\n this.stop = () => {\n this.options = { run: false };\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = undefined;\n }\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.generator = new ParticleGenerator(this.canvas, () => this.options);\n this.options = opts;\n this.update();\n }\n get options() {\n return this._options;\n }\n set options(opts) {\n const lastRunState = this._options?.run;\n const lastRecycleState = this._options?.recycle;\n this.setOptionsWithDefaults(opts);\n if (this.generator) {\n Object.assign(this.generator, this.options.confettiSource);\n if (typeof opts.recycle === 'boolean' &&\n opts.recycle &&\n lastRecycleState === false) {\n this.generator.lastNumberOfPieces = this.generator.particles.length;\n }\n }\n if (typeof opts.run === 'boolean' && opts.run && lastRunState === false) {\n this.update();\n }\n }\n}\n\nconst ref = React.createRef();\nclass ReactConfettiInternal extends React.Component {\n constructor(props) {\n super(props);\n this.canvas = React.createRef();\n this.canvas = props.canvasRef || ref;\n }\n componentDidMount() {\n if (this.canvas.current) {\n const opts = extractCanvasProps(this.props)[0];\n this.confetti = new Confetti(this.canvas.current, opts);\n }\n }\n componentDidUpdate() {\n const confettiOptions = extractCanvasProps(this.props)[0];\n if (this.confetti) {\n this.confetti.options = confettiOptions;\n }\n }\n componentWillUnmount() {\n if (this.confetti) {\n this.confetti.stop();\n }\n this.confetti = undefined;\n }\n render() {\n const [confettiOptions, passedProps] = extractCanvasProps(this.props);\n const canvasStyles = {\n zIndex: 2,\n position: 'absolute',\n pointerEvents: 'none',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n ...passedProps.style,\n };\n return (jsx(\"canvas\", { width: confettiOptions.width, height: confettiOptions.height, ref: this.canvas, ...passedProps, style: canvasStyles }));\n }\n}\nReactConfettiInternal.defaultProps = {\n ...confettiDefaults,\n};\nReactConfettiInternal.displayName = 'ReactConfetti';\nfunction extractCanvasProps(props) {\n const confettiOptions = {};\n const refs = {};\n const rest = {};\n const confettiOptionKeys = [\n ...Object.keys(confettiDefaults),\n 'confettiSource',\n 'drawShape',\n 'onConfettiComplete',\n 'frameRate',\n ];\n const refProps = ['canvasRef'];\n for (const prop in props) {\n const val = props[prop];\n if (confettiOptionKeys.includes(prop)) {\n confettiOptions[prop] = val;\n }\n else if (refProps.includes(prop)) {\n refProps[prop] = val;\n }\n else {\n rest[prop] = val;\n }\n }\n return [confettiOptions, rest, refs];\n}\nconst ReactConfetti = React.forwardRef((props, ref) => jsx(ReactConfettiInternal, { canvasRef: ref, ...props }));\n\nexport { ReactConfetti as default };\n//# sourceMappingURL=react-confetti.mjs.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport Confetti from \"react-confetti\";\nimport { Link, Search, ChevronDown } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport { formatBundleCurrency, getProductWord } from \"../i18n\";\nimport styles from \"./BundleBuilderDrawer.module.css\";\n\nexport type BundleBuilderDrawerProps = {\n className?: string;\n};\n\nexport function BundleBuilderDrawer(props: BundleBuilderDrawerProps) {\n const {\n isOpen,\n close,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n redirectVariantToProductPage,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n } = useBundleBuilder();\n\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const footerRef = useRef<HTMLElement | null>(null);\n const celebrationChipRef = useRef<HTMLDivElement | null>(null);\n\n const [windowSize, setWindowSize] = useState<{ width: number; height: number }>(() => {\n if (typeof window === \"undefined\") return { width: 0, height: 0 };\n return { width: window.innerWidth, height: window.innerHeight };\n });\n\n const [confettiKey, setConfettiKey] = useState(0);\n const [confettiSource, setConfettiSource] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n const [isConfettiActive, setIsConfettiActive] = useState(false);\n const confettiTimerRef = useRef<number | null>(null);\n const prevBundleSizeForConfettiRef = useRef<number>(bundleSize);\n const confettiSettleMs = 7000;\n\n const [celebrationKey, setCelebrationKey] = useState(0);\n const [celebrationText, setCelebrationText] = useState<string | null>(null);\n const [isCelebrationActive, setIsCelebrationActive] = useState(false);\n const celebrationTimerRef = useRef<number | null>(null);\n const celebrationDurationMs = 2800;\n\n const DEFAULT_CONFETTI_COLORS = [\n \"#2563eb\",\n \"#3b82f6\",\n \"#60a5fa\",\n \"#93c5fd\",\n \"#bae6fd\",\n \"#e0f2fe\",\n ] as const;\n\n const confettiColors = useMemo(() => {\n const c = config?.styleSettings?.confettiColors;\n if (Array.isArray(c) && c.length >= 6) {\n return c.slice(0, 6).map((s, i) =>\n typeof s === \"string\" && s.trim() ? s : DEFAULT_CONFETTI_COLORS[i],\n );\n }\n return [...DEFAULT_CONFETTI_COLORS];\n }, [config?.styleSettings?.confettiColors]);\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n if (value.toLowerCase() === \"default title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" · \");\n };\n\n const isDefaultTitle = (value: string | null | undefined) => {\n return value?.trim().toLowerCase() === \"default title\";\n };\n\n const getVariantPrimaryName = (v: (typeof eligibleVariants)[number]) => {\n const displayName = v.displayName?.trim();\n if (displayName && !isDefaultTitle(displayName)) return displayName;\n\n const productTitle = v.product?.title?.trim();\n if (productTitle) return productTitle;\n\n const variantTitle = v.title?.trim();\n if (variantTitle && !isDefaultTitle(variantTitle)) return variantTitle;\n\n return displayName || variantTitle || productTitle || \"\";\n };\n\n const getVariantA11yLabel = (v: (typeof eligibleVariants)[number]) => {\n const name = getVariantPrimaryName(v);\n const opts = formatVariantOptions(v.selectedOptions);\n return [name, opts].filter(Boolean).join(\" — \");\n };\n\n const getVariantOptionLabel = (v: (typeof eligibleVariants)[number]) => {\n const options = formatVariantOptions(v.selectedOptions);\n if (options) return options;\n\n const variantTitle = v.title?.trim();\n if (variantTitle && !isDefaultTitle(variantTitle)) return variantTitle;\n\n return getVariantPrimaryName(v);\n };\n\n const [isMounted, setIsMounted] = useState(isOpen);\n const closeTimerRef = useRef<number | null>(null);\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n\n return formatBundleCurrency(n, currencyCode, locale);\n };\n\n const title = config?.title?.trim() || t(\"bundle.title.default\");\n const redirectToProductPage = Boolean(config?.redirectEligibleProductsToProductPage);\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n const handleVariantAdd = (variant: (typeof eligibleVariants)[number], nextQuantity: number) => {\n const currentQty = selections[variant.id] ?? 0;\n if (redirectToProductPage && nextQuantity > currentQty) {\n redirectVariantToProductPage(variant);\n return;\n }\n setQuantity(variant.id, nextQuantity);\n };\n\n const sorted = useMemo(() => {\n return [...eligibleVariants];\n }, [eligibleVariants]);\n\n const filteredVariants = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n if (!q) return sorted;\n\n const tokens = q.split(/\\s+/).filter(Boolean);\n const matches = (v: (typeof sorted)[number]) => {\n const parts: string[] = [];\n parts.push(v.displayName);\n if (v.product?.title) parts.push(v.product.title);\n for (const o of v.selectedOptions ?? []) {\n parts.push(o.name);\n parts.push(o.value);\n }\n const haystack = parts.join(\" \").toLowerCase();\n return tokens.every((t) => haystack.includes(t));\n };\n\n return sorted.filter(matches);\n }, [searchQuery, sorted]);\n\n const groupedProducts = useMemo(() => {\n if (!config?.groupVariantsByProduct) return null;\n const q = searchQuery.trim().toLowerCase();\n const tokens = q ? q.split(/\\s+/).filter(Boolean) : [];\n\n const matchesSearch = (v: (typeof sorted)[number]) => {\n if (!tokens.length) return true;\n const parts: string[] = [v.displayName];\n if (v.product?.title) parts.push(v.product.title);\n for (const o of v.selectedOptions ?? []) { parts.push(o.name); parts.push(o.value); }\n const haystack = parts.join(\" \").toLowerCase();\n return tokens.every((tok) => haystack.includes(tok));\n };\n\n const map = new Map<string, { productId: string; productTitle: string; variants: typeof sorted; filteredVariants: typeof sorted }>();\n for (const v of sorted) {\n const productId = v.product?.id ?? \"unknown\";\n if (!map.has(productId)) {\n map.set(productId, { productId, productTitle: v.product?.title ?? \"\", variants: [], filteredVariants: [] });\n }\n const group = map.get(productId)!;\n group.variants.push(v);\n if (matchesSearch(v)) group.filteredVariants.push(v);\n }\n\n return Array.from(map.values()).filter((g) => g.filteredVariants.length > 0);\n }, [config?.groupVariantsByProduct, sorted, searchQuery]);\n\n const [openProductPicker, setOpenProductPicker] = useState<string | null>(null);\n const pickerRef = useRef<HTMLLIElement | null>(null);\n\n useEffect(() => {\n if (!openProductPicker) return;\n const handleClick = (e: MouseEvent) => {\n if (pickerRef.current && !pickerRef.current.contains(e.target as Node)) {\n setOpenProductPicker(null);\n }\n };\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [openProductPicker]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n // Keep cents stable for display.\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n // Slot index (0-based) => rule that becomes active at that slot.\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const slotCount = useMemo(() => {\n // Placeholders show until highest tier; if user adds more, extend (scroll).\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n // Track animation state for dual button split animation\n const [isDualButtonAnimationLoaded, setIsDualButtonAnimationLoaded] = useState(true);\n const prevItemsRemainingRef = useRef(itemsRemaining);\n\n // Trigger animation when itemsRemaining changes from > 0 to 0 in add_to_cart_checkout mode\n useEffect(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n const wasPositive = prevItemsRemainingRef.current > 0;\n const isNowZero = itemsRemaining === 0;\n\n if (wasPositive && isNowZero) {\n // Trigger animation\n setIsDualButtonAnimationLoaded(false);\n } else {\n // Reset animation\n setIsDualButtonAnimationLoaded(true);\n }\n }\n prevItemsRemainingRef.current = itemsRemaining;\n }, [itemsRemaining, config?.ctaButtonMode]);\n\n const panelRef = useRef<HTMLDivElement | null>(null);\n const bodyRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = bodyRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\"${variantId}\"]`);\n if (!row) return;\n\n const c = container.getBoundingClientRect();\n const r = row.getBoundingClientRect();\n const padding = 8;\n const isFullyVisible = r.top >= c.top + padding && r.bottom <= c.bottom - padding;\n if (isFullyVisible) return;\n\n const maxTop = Math.max(0, container.scrollHeight - container.clientHeight);\n const rowCenterOffset = (r.top - c.top) + r.height / 2;\n const targetTop = container.scrollTop + rowCenterOffset - container.clientHeight / 2;\n const nextTop = Math.min(maxTop, Math.max(0, targetTop));\n container.scrollTo({ top: nextTop, behavior: \"smooth\" });\n };\n\n useEffect(() => {\n if (!isOpen) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") close();\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [close, isOpen]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setWindowSize({ width: window.innerWidth, height: window.innerHeight });\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n useEffect(() => {\n if (closeTimerRef.current != null) {\n window.clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n if (isOpen) {\n setIsMounted(true);\n return;\n }\n\n // Keep mounted long enough to play exit animation.\n closeTimerRef.current = window.setTimeout(() => {\n setIsMounted(false);\n closeTimerRef.current = null;\n }, 220);\n }, [isOpen]);\n\n useEffect(() => {\n return () => {\n if (closeTimerRef.current != null) window.clearTimeout(closeTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isSearchOpen) return;\n const raf = requestAnimationFrame(() => searchInputRef.current?.focus());\n return () => cancelAnimationFrame(raf);\n }, [isOpen, isSearchOpen]);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n\n // When hitting a threshold, try to reveal the NEXT threshold (aligned right) if it's off-screen to the right.\n // If no remaining thresholds, scroll the newest added item into view.\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n // Only scroll rightward when the target is off-screen to the right.\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const prev = prevBundleSizeForConfettiRef.current;\n prevBundleSizeForConfettiRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n // Trigger when crossing an exact configured threshold (e.g. 2 items, 3 items, etc.).\n const hitRule = rulesSorted.find((r) => r.minBundleSize === bundleSize);\n if (!hitRule) return;\n\n // Celebration chip (centered)\n setCelebrationText(\n t(\"bundle.celebration.received_discount\", {\n discount: formatPercent0dp(hitRule.discountPercent),\n }),\n );\n setCelebrationKey((k) => k + 1);\n setIsCelebrationActive(true);\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n celebrationTimerRef.current = window.setTimeout(() => {\n setIsCelebrationActive(false);\n celebrationTimerRef.current = null;\n }, celebrationDurationMs);\n }, [bundleSize, isOpen, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isCelebrationActive) return;\n if (!celebrationText) return;\n\n // After the chip renders, measure its rect and shoot confetti from it.\n const raf = requestAnimationFrame(() => {\n const chipEl = celebrationChipRef.current;\n const rect = chipEl?.getBoundingClientRect();\n\n // Fallback: use the drawer panel center if chip rect isn't available yet.\n const panelRect = panelRef.current?.getBoundingClientRect();\n const originX = rect ? rect.left + rect.width / 2 : panelRect ? panelRect.left + panelRect.width / 2 : window.innerWidth / 2;\n const originY = rect ? rect.top + rect.height / 2 : panelRect ? panelRect.top + panelRect.height / 2 : window.innerHeight / 2;\n\n const source = {\n x: originX - 2,\n y: originY - 2,\n w: 4,\n h: 4,\n };\n\n setConfettiSource(source);\n setConfettiKey((k) => k + 1);\n setIsConfettiActive(true);\n\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n confettiTimerRef.current = window.setTimeout(() => {\n setIsConfettiActive(false);\n confettiTimerRef.current = null;\n }, confettiSettleMs);\n });\n\n return () => cancelAnimationFrame(raf);\n }, [celebrationKey, celebrationText, confettiSettleMs, isCelebrationActive, isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n panelRef.current?.focus();\n }, [isOpen]);\n\n if (!isMounted) return null;\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t(\"bundle.drawer.aria\")}\n className={[styles.backdrop, isOpen ? styles.backdropOpen : styles.backdropClosed, props.className].filter(Boolean).join(\" \")}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) close();\n }}\n >\n {isConfettiActive && confettiSource && windowSize.width > 0 && windowSize.height > 0 ? (\n <Confetti\n key={confettiKey}\n width={windowSize.width}\n height={windowSize.height}\n confettiSource={confettiSource}\n colors={confettiColors}\n recycle={false}\n numberOfPieces={70}\n tweenDuration={100}\n gravity={0.45}\n initialVelocityY={{ min: -10, max: -30 }}\n initialVelocityX={{ min: -6, max: 6 }}\n style={{ position: \"fixed\", inset: 0, pointerEvents: \"none\", zIndex: 2147483646 }}\n />\n ) : null}\n <aside ref={panelRef} className={[styles.panel, isOpen ? styles.panelOpen : styles.panelClosed].filter(Boolean).join(\" \")} tabIndex={-1}>\n {isCelebrationActive && celebrationText ? (\n <div className={styles.celebrationOverlay} aria-hidden=\"true\">\n <div key={celebrationKey} ref={celebrationChipRef} className={styles.celebrationChip}>\n {celebrationText}\n </div>\n </div>\n ) : null}\n <header className={[styles.header, isSearchOpen ? styles.headerSearchOpen : null].filter(Boolean).join(\" \")}>\n <button\n type=\"button\"\n className={styles.searchIconButton}\n aria-label={isSearchOpen ? t(\"bundle.search.expanded\") : t(\"bundle.search\")}\n aria-expanded={isSearchOpen}\n onClick={() => {\n setIsSearchOpen(true);\n }}\n >\n <Search size={18} aria-hidden=\"true\" />\n </button>\n\n <div className={styles.headerCenter}>\n <div className={styles.headerTitleWrap} aria-hidden={isSearchOpen}>\n <h2 className={styles.title}>{title}</h2>\n </div>\n\n <div className={styles.headerSearchWrap} aria-hidden={!isSearchOpen}>\n <div className={styles.searchBar}>\n <input\n ref={searchInputRef}\n className={styles.searchInput}\n type=\"search\"\n value={searchQuery}\n placeholder={t(\"bundle.search.placeholder\")}\n onChange={(e) => setSearchQuery(e.target.value)}\n onBlur={() => {\n if (searchQuery.trim() === \"\") setIsSearchOpen(false);\n }}\n />\n {searchQuery.trim() ? (\n <button\n type=\"button\"\n className={styles.searchClearButton}\n onMouseDown={(e) => {\n // Prevent input blur so the bar stays open and focused.\n e.preventDefault();\n }}\n onClick={() => {\n setSearchQuery(\"\");\n searchInputRef.current?.focus();\n }}\n aria-label={t(\"bundle.search.clear\")}\n >\n {t(\"bundle.search.clear\")}\n </button>\n ) : null}\n </div>\n </div>\n </div>\n\n <button type=\"button\" onClick={close} disabled={submitting} className={styles.closeButton} aria-label={t(\"bundle.close\")}>\n ×\n </button>\n </header>\n\n <div className={styles.body} ref={bodyRef}>\n {loading ? <p className={styles.muted}>{t(\"bundle.loading\")}</p> : null}\n {error ? <p className={styles.error}>{error}</p> : null}\n\n <div className={styles.variants}>\n {!loading && !error && eligibleVariants.length === 0 ? (\n <p className={styles.emptyState}>{t(\"bundle.empty\")}</p>\n ) : groupedProducts ? (\n <ul className={styles.variantList}>\n {groupedProducts.map((group) => {\n const productImage = group.variants.find((v) => v.image?.url)?.image ?? null;\n const hasMultipleVariants = group.variants.length > 1;\n const isPickerOpen = openProductPicker === group.productId;\n const selectedVariants = group.variants.filter((v) => (selections[v.id] ?? 0) > 0);\n\n // Single-variant: render identically to flat rows\n if (!hasMultipleVariants) {\n const v = group.variants[0];\n if (!v) return null;\n const qty = selections[v.id] ?? 0;\n const variantA11y = getVariantA11yLabel(v);\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const normalizedLimit = vLimit == null ? Number.POSITIVE_INFINITY : vLimit;\n const isAtLimit = qty >= normalizedLimit;\n const isUnavailable = v.availableForSale === false;\n const canIncrease = !isUnavailable && !isAtMaxBundleSize && !isAtLimit;\n const stockLabel = !isUnavailable && isAtLimit ? t(\"bundle.stock.max_reached\") : null;\n const origPrice = Number(v.price);\n const hasDiscount = appliedDiscountPercent != null && Number.isFinite(appliedDiscountPercent) && appliedDiscountPercent > 0 && Number.isFinite(origPrice);\n const discountedPrice = hasDiscount ? Math.round(origPrice * (1 - appliedDiscountPercent! / 100) * 100) / 100 : null;\n const fallbackVariantTitle = v.title?.trim();\n const optionText = formatVariantOptions(v.selectedOptions)\n ?? (fallbackVariantTitle && fallbackVariantTitle.toLowerCase() !== \"default title\" ? fallbackVariantTitle : null);\n return (\n <li key={group.productId} className={[styles.variantRow, isUnavailable ? styles.variantRowSoldOut : null].filter(Boolean).join(\" \")} data-variant-row={v.id}>\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {productImage?.url ? <img className={styles.variantThumbImg} src={productImage.url} alt={productImage.altText ?? group.productTitle} loading=\"lazy\" /> : <div className={styles.variantThumbFallback}>{group.productTitle.slice(0, 1).toUpperCase() || \"•\"}</div>}\n </div>\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{group.productTitle}</div>\n {optionText ? <div className={styles.variantMeta}>{optionText}</div> : null}\n <div className={styles.variantPriceRow}>\n {hasDiscount ? <span className={styles.variantCompareAt}>{formatMoney(origPrice.toFixed(2))}</span> : null}\n <span className={styles.variantPrice}>{formatMoney(discountedPrice != null ? discountedPrice.toFixed(2) : origPrice.toFixed(2))}</span>\n </div>\n </div>\n </div>\n {isUnavailable ? (\n <div className={styles.soldOutContainer}><span className={styles.soldOut} aria-label={t(\"bundle.a11y.sold_out\", { name: variantA11y })}>{t(\"bundle.stock.sold_out\")}</span></div>\n ) : qty <= 0 && normalizedLimit <= 0 ? (\n <div className={styles.stockLimitContainer}><span className={styles.stockLimitNotice}>{t(\"bundle.stock.max_added\")}</span></div>\n ) : qty <= 0 ? (\n <button type=\"button\" onClick={() => handleVariantAdd(v, 1)} disabled={submitting || !canIncrease} className={styles.addToBundleButton} aria-label={t(\"bundle.a11y.add_to_bundle\", { name: variantA11y })}>\n {t(\"bundle.cta.add_to_bundle\")}\n </button>\n ) : (\n <div className={styles.qtyControlsWrap}>\n <div className={styles.qtyControls}>\n <button type=\"button\" onClick={() => setQuantity(v.id, qty - 1)} disabled={submitting || qty <= 0} className={styles.qtyButton} aria-label={t(\"bundle.a11y.decrease\", { name: variantA11y })}>−</button>\n <span className={styles.qtyValue} aria-label={t(\"bundle.a11y.quantity\", { name: variantA11y, qty })}>{qty}</span>\n <button type=\"button\" onClick={() => handleVariantAdd(v, qty + 1)} disabled={submitting || !canIncrease} className={styles.qtyButton} aria-label={stockLabel ? `${variantA11y} ${stockLabel.toLowerCase()}` : t(\"bundle.a11y.increase\", { name: variantA11y })}>+</button>\n </div>\n {stockLabel ? <div className={styles.stockLimitNotice}>{stockLabel}</div> : null}\n </div>\n )}\n </li>\n );\n }\n\n // Multi-variant: header + inline picker + selected sub-rows\n return (\n <li key={group.productId} ref={isPickerOpen ? pickerRef : null} className={styles.drawerProductGroup}>\n {/* Product header row */}\n <div className={styles.variantRow} data-variant-row={group.productId}>\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {productImage?.url ? <img className={styles.variantThumbImg} src={productImage.url} alt={productImage.altText ?? group.productTitle} loading=\"lazy\" /> : <div className={styles.variantThumbFallback}>{group.productTitle.slice(0, 1).toUpperCase() || \"•\"}</div>}\n </div>\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{group.productTitle}</div>\n </div>\n </div>\n <button\n type=\"button\"\n className={[styles.addToBundleButton, styles.selectButton].filter(Boolean).join(\" \")}\n aria-expanded={isPickerOpen}\n disabled={submitting}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={() => setOpenProductPicker((prev) => prev === group.productId ? null : group.productId)}\n >\n {t(\"bundle.select.variant\")}\n <ChevronDown size={13} strokeWidth={2.5} className={[styles.selectButtonChevron, isPickerOpen ? styles.selectButtonChevronOpen : null].filter(Boolean).join(\" \")} />\n </button>\n </div>\n\n {/* Inline variant picker */}\n {isPickerOpen && (\n <div className={styles.variantPicker}>\n {group.filteredVariants.map((v) => {\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const isAlreadySelected = (selections[v.id] ?? 0) > 0;\n const isSoldOut = v.availableForSale === false;\n const isMaxAdded = vLimit != null && vLimit <= 0;\n const isBundleFull = !isAlreadySelected && isAtMaxBundleSize;\n const isDisabled = (\n submitting\n || isSoldOut\n || isMaxAdded\n || isBundleFull\n );\n const statusLabel = isSoldOut\n ? t(\"bundle.stock.sold_out\")\n : isMaxAdded\n ? t(\"bundle.stock.max_added\")\n : isBundleFull\n ? t(\"bundle.stock.max_reached\")\n : null;\n const optionLabel = getVariantOptionLabel(v);\n const origPrice = Number(v.price);\n const hasDiscount = appliedDiscountPercent != null && Number.isFinite(appliedDiscountPercent) && appliedDiscountPercent > 0 && Number.isFinite(origPrice);\n const discountedPrice = hasDiscount ? Math.round(origPrice * (1 - appliedDiscountPercent! / 100) * 100) / 100 : null;\n return (\n <button\n key={v.id}\n type=\"button\"\n disabled={isDisabled}\n className={[styles.variantPickerRow, isAlreadySelected ? styles.variantPickerRowSelected : null].filter(Boolean).join(\" \")}\n onClick={() => {\n if (!isAlreadySelected) {\n if (redirectToProductPage) {\n handleVariantAdd(v, 1);\n setOpenProductPicker(null);\n return;\n }\n handleVariantAdd(v, 1);\n }\n setOpenProductPicker(null);\n }}\n >\n <span className={styles.variantPickerLabel}>{optionLabel}</span>\n <span className={styles.variantPickerPriceGroup}>\n {statusLabel ? (\n <span className={styles.variantPickerSoldOut}>{statusLabel}</span>\n ) : (\n <>\n {hasDiscount ? <span className={styles.variantPickerCompareAt}>{formatMoney(origPrice.toFixed(2))}</span> : null}\n <span className={styles.variantPickerPrice}>{formatMoney(discountedPrice != null ? discountedPrice.toFixed(2) : origPrice.toFixed(2))}</span>\n </>\n )}\n </span>\n {isAlreadySelected ? <span className={styles.variantPickerCheck} aria-hidden=\"true\">✓</span> : null}\n </button>\n );\n })}\n </div>\n )}\n\n {/* Selected variant sub-rows */}\n {selectedVariants.length > 0 && (\n <div className={styles.drawerSelectedList}>\n {selectedVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const variantA11y = getVariantA11yLabel(v);\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const normalizedLimit = vLimit == null ? Number.POSITIVE_INFINITY : vLimit;\n const isAtLimit = qty >= normalizedLimit;\n const canIncrease = v.availableForSale !== false && !isAtMaxBundleSize && !isAtLimit;\n const stockLabel = v.availableForSale !== false && isAtLimit ? t(\"bundle.stock.max_reached\") : null;\n const origPrice = Number(v.price);\n const hasDiscount = appliedDiscountPercent != null && Number.isFinite(appliedDiscountPercent) && appliedDiscountPercent > 0 && Number.isFinite(origPrice);\n const discountedPrice = hasDiscount ? Math.round(origPrice * (1 - appliedDiscountPercent! / 100) * 100) / 100 : null;\n const optionLabel = getVariantOptionLabel(v);\n return (\n <div key={v.id} className={styles.drawerSubRow} data-variant-row={v.id}>\n <div className={styles.drawerSubRowInfo}>\n <span className={styles.drawerSubRowName}>{optionLabel}</span>\n <div className={styles.variantPriceRow}>\n {hasDiscount ? <span className={styles.variantCompareAt}>{formatMoney(origPrice.toFixed(2))}</span> : null}\n <span className={styles.variantPrice}>{formatMoney(discountedPrice != null ? discountedPrice.toFixed(2) : origPrice.toFixed(2))}</span>\n </div>\n </div>\n <div className={styles.qtyControlsWrap}>\n <div className={styles.qtyControls}>\n <button type=\"button\" onClick={() => setQuantity(v.id, qty - 1)} disabled={submitting || qty <= 0} className={styles.qtyButton} aria-label={t(\"bundle.a11y.decrease\", { name: variantA11y })}>−</button>\n <span className={styles.qtyValue} aria-label={t(\"bundle.a11y.quantity\", { name: variantA11y, qty })}>{qty}</span>\n <button type=\"button\" onClick={() => handleVariantAdd(v, qty + 1)} disabled={submitting || !canIncrease} className={styles.qtyButton} aria-label={stockLabel ? `${variantA11y} ${stockLabel.toLowerCase()}` : t(\"bundle.a11y.increase\", { name: variantA11y })}>+</button>\n </div>\n {stockLabel ? <div className={styles.stockLimitNotice}>{stockLabel}</div> : null}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n ) : (\n <ul className={styles.variantList}>\n {filteredVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const variantPrimaryName = getVariantPrimaryName(v);\n const variantOptionText = formatVariantOptions(v.selectedOptions);\n const variantA11y = getVariantA11yLabel(v);\n const variantSelectionLimit = getVariantMaxSelectableQuantity(v.id);\n const normalizedVariantSelectionLimit = variantSelectionLimit == null\n ? Number.POSITIVE_INFINITY\n : variantSelectionLimit;\n const isAtVariantStockLimit = qty >= normalizedVariantSelectionLimit;\n const canIncreaseQuantity = v.availableForSale !== false && !isAtMaxBundleSize && !isAtVariantStockLimit;\n const stockStatusLabel =\n v.availableForSale === false\n ? null\n : isAtVariantStockLimit\n ? t(\"bundle.stock.max_reached\")\n : null;\n\n // Show discounted variant price only when a rule is actually unlocked.\n const discountPercentToUse = appliedDiscountPercent;\n const originalPriceNumber = Number(v.price);\n const hasDiscount =\n discountPercentToUse != null &&\n Number.isFinite(discountPercentToUse) &&\n discountPercentToUse > 0 &&\n Number.isFinite(originalPriceNumber);\n const discountedPriceNumber = hasDiscount\n ? Math.round(originalPriceNumber * (1 - discountPercentToUse / 100) * 100) / 100\n : null;\n\n return (\n <li\n key={v.id}\n className={[styles.variantRow, v.availableForSale === false && styles.variantRowSoldOut]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={v.id}\n >\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {v.image?.url ? (\n <img\n className={styles.variantThumbImg}\n src={v.image.url}\n alt={v.image.altText ?? variantA11y}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantThumbFallback}>{v.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}</div>\n )}\n </div>\n\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{variantPrimaryName}</div>\n {variantOptionText ? <div className={styles.variantMeta}>{variantOptionText}</div> : null}\n <div className={styles.variantPriceRow}>\n {hasDiscount ? (\n <span className={styles.variantCompareAt}>\n {formatMoney(Number.isFinite(originalPriceNumber) ? originalPriceNumber.toFixed(2) : v.price)}\n </span>\n ) : null}\n <span className={styles.variantPrice}>\n {formatMoney(\n discountedPriceNumber != null\n ? discountedPriceNumber.toFixed(2)\n : Number.isFinite(originalPriceNumber)\n ? originalPriceNumber.toFixed(2)\n : v.price,\n )}\n </span>\n </div>\n </div>\n </div>\n {v.availableForSale === false ? (\n <div className={styles.soldOutContainer}>\n <span className={styles.soldOut} aria-label={t(\"bundle.a11y.sold_out\", { name: variantA11y })}>\n {t(\"bundle.stock.sold_out\")}\n </span>\n </div>\n ) : qty <= 0 && normalizedVariantSelectionLimit <= 0 ? (\n <div className={styles.stockLimitContainer}>\n <span className={styles.stockLimitNotice} aria-label={t(\"bundle.a11y.max_available_selected\", { name: variantA11y })}>\n {t(\"bundle.stock.max_added\")}\n </span>\n </div>\n ) : qty <= 0 ? (\n <button\n type=\"button\"\n onClick={() => handleVariantAdd(v, 1)}\n disabled={submitting || !canIncreaseQuantity}\n className={styles.addToBundleButton}\n aria-label={stockStatusLabel ? `${variantA11y} ${stockStatusLabel.toLowerCase()}` : t(\"bundle.a11y.add_to_bundle\", { name: variantA11y })}\n >\n {t(\"bundle.cta.add_to_bundle\")}\n </button>\n ) : (\n <div className={styles.qtyControlsWrap}>\n <div className={styles.qtyControls}>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty - 1)}\n disabled={submitting || qty <= 0}\n className={styles.qtyButton}\n aria-label={t(\"bundle.a11y.decrease\", { name: variantA11y })}\n >\n −\n </button>\n <span className={styles.qtyValue} aria-label={t(\"bundle.a11y.quantity\", { name: variantA11y, qty })}>\n {qty}\n </span>\n <button\n type=\"button\"\n onClick={() => handleVariantAdd(v, qty + 1)}\n disabled={submitting || !canIncreaseQuantity}\n className={styles.qtyButton}\n aria-label={stockStatusLabel ? `${variantA11y} ${stockStatusLabel.toLowerCase()}` : t(\"bundle.a11y.increase\", { name: variantA11y })}\n >\n +\n </button>\n </div>\n {stockStatusLabel ? <div className={styles.stockLimitNotice}>{stockStatusLabel}</div> : null}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n\n <footer className={styles.footer} ref={footerRef}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n\n // Per your preference: show discount text only while it's still a placeholder (unlocked display comes later elsewhere).\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const discountText = threshold\n ? t(\"bundle.discount.off_label\", { discount: formatPercent0dp(threshold.discountPercent) })\n : null;\n\n const titleText = isFilled ? variant!.displayName : t(\"bundle.slot\", { slot: idx + 1 });\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && discountText ? `${titleText}. ${t(\"bundle.unlocks\", { discount: discountText })}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • ${t(\"bundle.unlocks\", { discount: discountText })}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && discountText ? (\n <div className={styles.boxItemDiscountText}>{discountText}</div>\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{threshold!.label}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n <div\n className={[styles.ctaTotalsWrap, hasUnlockedFirstDiscount ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={!hasUnlockedFirstDiscount}\n >\n <div className={styles.ctaTotals} aria-label={t(\"bundle.totals\")}>\n {appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>\n {t(\"bundle.discount.badge\", { discount: appliedDiscountPercent })}\n </span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n\n {(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n // Show single button with \"Add X more\" when items remaining\n // Show both buttons side-by-side when minimum is met\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })}\n </button>\n );\n }\n\n return (\n <div className={`${styles.ctaButtonGroup} ${isDualButtonAnimationLoaded ? styles.ctaButtonGroupAnimating : \"\"}`}>\n <button\n type=\"button\"\n onClick={submit}\n disabled={!canSubmit}\n className={`${styles.ctaDualLeft} ${isDualButtonAnimationLoaded ? styles.ctaDualLeftAnimating : \"\"}`}\n >\n <span>{submitting ? t(\"bundle.cta.adding\") : t(\"bundle.cta.add_to_basket\")}</span>\n </button>\n <button\n type=\"button\"\n onClick={submitAndCheckout}\n disabled={!canSubmit}\n className={`${styles.ctaDualRight} ${isDualButtonAnimationLoaded ? styles.ctaDualRightAnimating : \"\"}`}\n >\n <span>{submitting ? t(\"bundle.cta.processing\") : t(\"bundle.cta.checkout\")}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.processing\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.checkout\")}\n </button>\n );\n }\n\n // Default: add_to_cart\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.add_to_basket\")}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n {t(\"bundle.powered_by\")} <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\"> BestBundles</a>\n </div>\n </footer>\n </aside>\n </div>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Plus, Trash2, ChevronDown } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport { formatBundleCurrency, getProductWord } from \"../i18n\";\nimport styles from \"./BundleBuilderPanel.module.css\";\n\nexport type BundleBuilderPanelProps = {\n className?: string;\n showRules?: boolean;\n showVariants?: boolean;\n};\n\nexport function BundleBuilderPanel(props: BundleBuilderPanelProps) {\n const {\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n redirectVariantToProductPage,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n } = useBundleBuilder();\n\n const {\n className,\n showRules = true,\n showVariants = true,\n } = props;\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n if (value.toLowerCase() === \"default title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" • \");\n };\n\n const isDefaultTitle = (value: string | null | undefined) => {\n return value?.trim().toLowerCase() === \"default title\";\n };\n\n const getVariantPrimaryName = (v: (typeof eligibleVariants)[number]) => {\n const displayName = v.displayName?.trim();\n if (displayName && !isDefaultTitle(displayName)) return displayName;\n\n const productTitle = v.product?.title?.trim();\n if (productTitle) return productTitle;\n\n const variantTitle = v.title?.trim();\n if (variantTitle && !isDefaultTitle(variantTitle)) return variantTitle;\n\n return displayName || variantTitle || productTitle || \"\";\n };\n\n const getVariantA11yLabel = (v: (typeof eligibleVariants)[number]) => {\n const primaryName = getVariantPrimaryName(v);\n const options = formatVariantOptions(v.selectedOptions);\n return [primaryName, options].filter(Boolean).join(\" — \");\n };\n\n const getVariantOptionLabel = (v: (typeof eligibleVariants)[number]) => {\n const options = formatVariantOptions(v.selectedOptions);\n if (options) return options;\n\n const variantTitle = v.title?.trim();\n if (variantTitle && !isDefaultTitle(variantTitle)) return variantTitle;\n\n return getVariantPrimaryName(v);\n };\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n return formatBundleCurrency(n, currencyCode, locale);\n };\n\n const displayVariants = useMemo(() => {\n return [...eligibleVariants];\n }, [eligibleVariants]);\n\n const groupedProducts = useMemo(() => {\n if (!config?.groupVariantsByProduct) return null;\n const map = new Map<string, { productId: string; productTitle: string; variants: typeof eligibleVariants }>();\n for (const v of displayVariants) {\n const productId = v.product?.id ?? \"unknown\";\n if (!map.has(productId)) {\n map.set(productId, { productId, productTitle: v.product?.title ?? \"\", variants: [] });\n }\n map.get(productId)!.variants.push(v);\n }\n return Array.from(map.values());\n }, [config?.groupVariantsByProduct, displayVariants]);\n\n const [openProductPicker, setOpenProductPicker] = useState<string | null>(null);\n const pickerRef = useRef<HTMLLIElement | null>(null);\n\n useEffect(() => {\n if (!openProductPicker) return;\n const handleClick = (e: MouseEvent) => {\n if (pickerRef.current && !pickerRef.current.contains(e.target as Node)) {\n setOpenProductPicker(null);\n }\n };\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [openProductPicker]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const title = config?.title?.trim() || t(\"bundle.title.default\");\n const redirectToProductPage = Boolean(config?.redirectEligibleProductsToProductPage);\n const handleVariantAdd = (variant: (typeof eligibleVariants)[number], nextQuantity: number) => {\n const currentQty = selections[variant.id] ?? 0;\n if (redirectToProductPage && nextQuantity > currentQty) {\n redirectVariantToProductPage(variant);\n return;\n }\n setQuantity(variant.id, nextQuantity);\n };\n\n const slotCount = useMemo(() => {\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n\n const variantsRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = variantsRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\\\"${variantId}\\\"]`);\n if (!row) return;\n row.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n };\n\n return (\n <section className={[styles.panel, className].filter(Boolean).join(\" \")} aria-busy={loading}>\n <header className={styles.header}>\n <h2 className={styles.title}>{title}</h2>\n </header>\n\n {loading ? <div className={styles.status}>{t(\"bundle.loading\")}</div> : null}\n {error ? <div className={styles.error}>{error}</div> : null}\n\n {showRules && rulesSorted.length ? (\n <div className={styles.section}>\n <div className={styles.rulesVisual}>\n <div className={styles.rulesLabelsRow}>\n {Array.from({ length: maxRuleSize }).map((_, idx) => {\n const lineIndex = idx + 1;\n const ruleForLine = rulesSorted.find((r) => r.minBundleSize === lineIndex);\n const discountLabel = ruleForLine\n ? t(\"bundle.discount.off_label\", { discount: formatPercent0dp(ruleForLine.discountPercent) })\n : null;\n\n return (\n <div key={lineIndex} className={styles.rulesLineLabelCell}>\n {discountLabel ? <span className={styles.rulesLineLabel}>{discountLabel}</span> : null}\n </div>\n );\n })}\n </div>\n <div className={styles.rulesLinesRow}>\n {Array.from({ length: maxRuleSize }).map((_, idx) => {\n const lineIndex = idx + 1;\n const isFilled = bundleSize >= lineIndex;\n\n return (\n <div\n key={lineIndex}\n className={[\n styles.rulesLine,\n isFilled ? styles.rulesLineFilled : styles.rulesLineEmpty,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n })}\n </div>\n </div>\n </div>\n ) : null}\n\n {showVariants ? (\n <div className={styles.section} ref={variantsRef}>\n <div className={styles.sectionTitle}>{t(\"bundle.select.items\")}</div>\n <div className={styles.variants}>\n {!loading && !error && displayVariants.length === 0 ? (\n <div className={styles.emptyState}>{t(\"bundle.empty\")}</div>\n ) : groupedProducts ? (\n <ul className={styles.variantList}>\n {groupedProducts.map((group) => {\n const productImage = group.variants.find((v) => v.image?.url)?.image ?? null;\n const hasMultipleVariants = group.variants.length > 1;\n const isPickerOpen = openProductPicker === group.productId;\n const selectedVariants = group.variants.filter((v) => (selections[v.id] ?? 0) > 0);\n\n // Single-variant: show qty controls directly in the header\n if (!hasMultipleVariants) {\n const variant = group.variants[0];\n if (!variant) return null;\n const qty = selections[variant.id] ?? 0;\n const fallbackVariantTitle = variant.title?.trim();\n const optionText = formatVariantOptions(variant.selectedOptions)\n ?? (fallbackVariantTitle && fallbackVariantTitle.toLowerCase() !== \"default title\" ? fallbackVariantTitle : null);\n const isUnavailable = variant.availableForSale === false;\n const vLimit = getVariantMaxSelectableQuantity(variant.id);\n const normalizedLimit = vLimit == null ? Number.POSITIVE_INFINITY : vLimit;\n const isAtLimit = qty >= normalizedLimit;\n const canIncrease = !submitting && !isUnavailable && !isAtMaxBundleSize && !isAtLimit;\n const stockLabel = !isUnavailable && isAtLimit ? t(\"bundle.stock.max_reached\") : null;\n\n return (\n <li key={group.productId} className={styles.productGroup}>\n <div className={styles.productGroupHeader}>\n <div className={styles.productGroupThumbWrap}>\n {productImage?.url ? (\n <img src={productImage.url} alt={productImage.altText ?? group.productTitle} width={productImage.width ?? 56} height={productImage.height ?? 56} className={styles.productGroupThumb} loading=\"lazy\" />\n ) : (\n <div className={styles.productGroupThumbFallback}>{group.productTitle.slice(0, 1).toUpperCase() || \"•\"}</div>\n )}\n </div>\n <div className={styles.productGroupInfo}>\n <div className={styles.productGroupTitle}>{group.productTitle}</div>\n {optionText ? <div className={styles.variantMeta}>{optionText}</div> : null}\n <div className={styles.variantPrice}>{formatMoney(variant.price)}</div>\n </div>\n <div className={styles.productGroupActions}>\n {isUnavailable ? (\n <div className={styles.soldOut}>{t(\"bundle.stock.sold_out\")}</div>\n ) : qty <= 0 && normalizedLimit <= 0 ? (\n <div className={styles.stockLimitNotice}>{t(\"bundle.stock.max_added\")}</div>\n ) : (\n <div className={styles.qtyActionsWrap}>\n {stockLabel ? <div className={styles.stockLimitNotice}>{stockLabel}</div> : null}\n <div className={styles.qtyActions}>\n {qty > 0 ? (\n <button type=\"button\" className={styles.qtyTrash} aria-label={t(\"bundle.a11y.remove_from_bundle\", { name: variant.displayName })} disabled={submitting} onClick={() => setQuantity(variant.id, 0)}>\n <Trash2 size={14} />\n </button>\n ) : null}\n <div\n className={[styles.qtyChip, canIncrease ? styles.qtyChipInteractive : null].filter(Boolean).join(\" \")}\n role={canIncrease ? \"button\" : undefined}\n tabIndex={canIncrease ? 0 : undefined}\n aria-label={t(\"bundle.a11y.quantity\", { name: variant.displayName, qty })}\n onClick={canIncrease ? () => handleVariantAdd(variant, qty + 1) : undefined}\n onKeyDown={canIncrease ? (e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); handleVariantAdd(variant, qty + 1); } } : undefined}\n >\n {qty <= 0 ? (\n <span className={styles.qtyChipPlus} aria-hidden=\"true\"><Plus size={18} strokeWidth={1.8} /></span>\n ) : (\n <>\n <span className={styles.qtyChipValue}>{qty}</span>\n <button type=\"button\" className={styles.qtyChipClear} aria-label={t(\"bundle.a11y.increase\", { name: variant.displayName })} disabled={!canIncrease} onClick={(e) => { e.stopPropagation(); handleVariantAdd(variant, qty + 1); }} onKeyDown={(e) => e.stopPropagation()}>\n <Plus size={12} strokeWidth={2} />\n </button>\n </>\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </li>\n );\n }\n\n // Multi-variant: \"Select\" button opens an inline picker; selected variants appear as sub-rows\n return (\n <li key={group.productId} ref={isPickerOpen ? pickerRef : null} className={[styles.productGroup, isPickerOpen ? styles.productGroupPickerOpen : null].filter(Boolean).join(\" \")}>\n <div className={styles.productGroupHeader}>\n <div className={styles.productGroupThumbWrap}>\n {productImage?.url ? (\n <img src={productImage.url} alt={productImage.altText ?? group.productTitle} width={productImage.width ?? 56} height={productImage.height ?? 56} className={styles.productGroupThumb} loading=\"lazy\" />\n ) : (\n <div className={styles.productGroupThumbFallback}>{group.productTitle.slice(0, 1).toUpperCase() || \"•\"}</div>\n )}\n </div>\n <div className={styles.productGroupInfo}>\n <div className={styles.productGroupTitle}>{group.productTitle}</div>\n </div>\n <div className={styles.productGroupActions}>\n <button\n type=\"button\"\n className={[styles.selectButton, isPickerOpen ? styles.selectButtonOpen : null].filter(Boolean).join(\" \")}\n aria-expanded={isPickerOpen}\n disabled={submitting}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={() => setOpenProductPicker((prev) => prev === group.productId ? null : group.productId)}\n >\n {t(\"bundle.select.variant\")}\n <ChevronDown size={13} strokeWidth={2.5} className={styles.selectButtonChevron} />\n </button>\n </div>\n </div>\n\n {/* Inline variant picker */}\n {isPickerOpen && (\n <div className={styles.variantPicker}>\n {group.variants.map((v) => {\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const isAlreadySelected = (selections[v.id] ?? 0) > 0;\n const isSoldOut = v.availableForSale === false;\n const isMaxAdded = vLimit != null && vLimit <= 0;\n const isBundleFull = !isAlreadySelected && isAtMaxBundleSize;\n const isDisabled = (\n submitting\n || isSoldOut\n || isMaxAdded\n || isBundleFull\n );\n const statusLabel = isSoldOut\n ? t(\"bundle.stock.sold_out\")\n : isMaxAdded\n ? t(\"bundle.stock.max_added\")\n : isBundleFull\n ? t(\"bundle.stock.max_reached\")\n : null;\n const optionLabel = getVariantOptionLabel(v);\n return (\n <button\n key={v.id}\n type=\"button\"\n disabled={isDisabled}\n className={[styles.variantPickerRow, isAlreadySelected ? styles.variantPickerRowSelected : null].filter(Boolean).join(\" \")}\n onClick={() => {\n if (!isAlreadySelected) {\n if (redirectToProductPage) {\n handleVariantAdd(v, 1);\n setOpenProductPicker(null);\n return;\n }\n handleVariantAdd(v, 1);\n }\n setOpenProductPicker(null);\n }}\n >\n <span className={styles.variantPickerLabel}>{optionLabel}</span>\n <span className={styles.variantPickerPrice}>\n {statusLabel ?? formatMoney(v.price)}\n </span>\n {isAlreadySelected ? <span className={styles.variantPickerCheck} aria-hidden=\"true\">✓</span> : null}\n </button>\n );\n })}\n </div>\n )}\n\n {/* Selected variants sub-rows */}\n {selectedVariants.length > 0 && (\n <ul className={styles.selectedVariantsList}>\n {selectedVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const vLimit = getVariantMaxSelectableQuantity(v.id);\n const normalizedLimit = vLimit == null ? Number.POSITIVE_INFINITY : vLimit;\n const isAtLimit = qty >= normalizedLimit;\n const canIncrease = !submitting && v.availableForSale !== false && !isAtMaxBundleSize && !isAtLimit;\n const optionLabel = getVariantOptionLabel(v);\n return (\n <li key={v.id} className={styles.selectedVariantRow} data-variant-row={v.id}>\n <div className={styles.selectedVariantInfo}>\n <span className={styles.selectedVariantName}>{optionLabel}</span>\n <span className={styles.selectedVariantPrice}>{formatMoney(v.price)}</span>\n </div>\n <div className={styles.qtyActions}>\n <button type=\"button\" className={styles.qtyTrash} aria-label={t(\"bundle.a11y.remove_from_bundle\", { name: v.displayName })} disabled={submitting} onClick={() => setQuantity(v.id, 0)}>\n <Trash2 size={14} />\n </button>\n <div\n className={[styles.qtyChip, canIncrease ? styles.qtyChipInteractive : null].filter(Boolean).join(\" \")}\n role={canIncrease ? \"button\" : undefined}\n tabIndex={canIncrease ? 0 : undefined}\n aria-label={t(\"bundle.a11y.quantity\", { name: v.displayName, qty })}\n onClick={canIncrease ? () => handleVariantAdd(v, qty + 1) : undefined}\n onKeyDown={canIncrease ? (e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); handleVariantAdd(v, qty + 1); } } : undefined}\n >\n <span className={styles.qtyChipValue}>{qty}</span>\n <button type=\"button\" className={styles.qtyChipClear} aria-label={t(\"bundle.a11y.increase\", { name: v.displayName })} disabled={!canIncrease} onClick={(e) => { e.stopPropagation(); handleVariantAdd(v, qty + 1); }} onKeyDown={(e) => e.stopPropagation()}>\n <Plus size={12} strokeWidth={2} />\n </button>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </li>\n );\n })}\n </ul>\n ) : (\n <ul className={styles.variantList}>\n {displayVariants.map((variant) => {\n const qty = selections[variant.id] ?? 0;\n const variantPrimaryName = getVariantPrimaryName(variant);\n const variantA11y = getVariantA11yLabel(variant);\n const options = formatVariantOptions(variant.selectedOptions);\n const isUnavailable = variant.availableForSale === false;\n const variantSelectionLimit = getVariantMaxSelectableQuantity(variant.id);\n const normalizedVariantSelectionLimit = variantSelectionLimit == null\n ? Number.POSITIVE_INFINITY\n : variantSelectionLimit;\n const isAtVariantStockLimit = qty >= normalizedVariantSelectionLimit;\n const canIncreaseQuantity = !isUnavailable && !isAtMaxBundleSize && !isAtVariantStockLimit;\n const isClickable = !redirectToProductPage && canIncreaseQuantity;\n const stockStatusLabel = !isUnavailable && isAtVariantStockLimit ? t(\"bundle.stock.max_reached\") : null;\n\n return (\n <li\n key={variant.id}\n className={[\n styles.variantRow,\n isClickable ? styles.variantRowInteractive : null,\n qty > 0 ? styles.variantRowSelected : null,\n isUnavailable ? styles.variantRowSoldOut : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={variant.id}\n role={isClickable ? \"button\" : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onClick={\n isClickable\n ? () => {\n handleVariantAdd(variant, qty + 1);\n }\n : undefined\n }\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleVariantAdd(variant, qty + 1);\n scrollVariantRowIntoView(variant.id);\n }\n }\n : undefined\n }\n aria-label={\n isUnavailable\n ? t(\"bundle.a11y.sold_out\", { name: variantA11y })\n : stockStatusLabel\n ? `${variantA11y} ${stockStatusLabel.toLowerCase()}`\n : t(\"bundle.a11y.add_to_bundle\", { name: variantA11y })\n }\n >\n <div className={styles.variantMedia}>\n {variant.image?.url ? (\n <img\n src={variant.image.url}\n alt={variant.image.altText ?? variantA11y}\n width={variant.image.width ?? 64}\n height={variant.image.height ?? 64}\n className={styles.variantImage}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantImageFallback}>{t(\"bundle.item.generic\")}</div>\n )}\n </div>\n <div className={styles.variantContent}>\n <div className={styles.variantHeader}>\n <div className={styles.variantTitle}>{variantPrimaryName}</div>\n {options ? <div className={styles.variantMeta}>{options}</div> : null}\n </div>\n <div className={styles.variantFooterRow}>\n <div className={styles.variantPrice}>{formatMoney(variant.price)}</div>\n <div className={styles.variantActions}>\n {isUnavailable ? (\n <div className={styles.soldOut} aria-label={t(\"bundle.a11y.sold_out\", { name: variantA11y })}>\n {t(\"bundle.stock.sold_out\")}\n </div>\n ) : qty <= 0 && normalizedVariantSelectionLimit <= 0 ? (\n <div className={styles.stockLimitNotice} aria-label={t(\"bundle.a11y.max_available_selected\", { name: variantA11y })}>\n {t(\"bundle.stock.max_added\")}\n </div>\n ) : (\n <div className={styles.qtyActionsWrap}>\n <div className={styles.qtyActions}>\n {qty > 0 ? (\n <button\n type=\"button\"\n className={styles.qtyTrash}\n aria-label={t(\"bundle.a11y.remove_from_bundle\", { name: variantA11y })}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, 0);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n >\n <Trash2 size={14} />\n </button>\n ) : null}\n <div\n className={[styles.qtyChip, canIncreaseQuantity ? styles.qtyChipInteractive : null].filter(Boolean).join(\" \")}\n aria-label={t(\"bundle.a11y.quantity\", { name: variantA11y, qty })}\n onClick={canIncreaseQuantity\n ? (e) => {\n e.stopPropagation();\n handleVariantAdd(variant, qty + 1);\n }\n : undefined}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n role={canIncreaseQuantity ? \"button\" : undefined}\n tabIndex={canIncreaseQuantity ? 0 : undefined}\n >\n {qty <= 0 ? (\n <span className={styles.qtyChipPlus} aria-hidden=\"true\">\n <Plus size={18} strokeWidth={1.8} />\n </span>\n ) : (\n <>\n <span className={styles.qtyChipValue}>{qty}</span>\n <button\n type=\"button\"\n className={styles.qtyChipClear}\n aria-label={t(\"bundle.a11y.increase\", { name: variantA11y })}\n onClick={(e) => {\n e.stopPropagation();\n handleVariantAdd(variant, qty + 1);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n disabled={!canIncreaseQuantity}\n >\n <Plus size={12} strokeWidth={2} />\n </button>\n </>\n )}\n </div>\n </div>\n {stockStatusLabel ? <div className={styles.stockLimitNotice}>{stockStatusLabel}</div> : null}\n </div>\n )}\n </div>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n ) : null}\n\n <footer className={styles.footer}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const discountText = threshold\n ? t(\"bundle.discount.off_label\", { discount: formatPercent0dp(threshold.discountPercent) })\n : null;\n const titleText = isFilled ? variant!.displayName : t(\"bundle.slot\", { slot: idx + 1 });\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && discountText ? `${titleText}. ${t(\"bundle.unlocks\", { discount: discountText })}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • ${t(\"bundle.unlocks\", { discount: discountText })}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n width={1}\n height={1}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && discountText ? (\n <div className={styles.boxItemDiscountText}>{discountText}</div>\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{threshold!.label}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n\n <div className={[styles.totalsReveal, hasUnlockedFirstDiscount ? styles.totalsRevealOpen : null].filter(Boolean).join(\" \")}>\n <div\n className={[styles.ctaTotalsWrap, hasUnlockedFirstDiscount ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={!hasUnlockedFirstDiscount}\n >\n <div className={styles.ctaTotals} aria-label={t(\"bundle.totals\")}>\n {appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>{t(\"bundle.discount.badge\", { discount: appliedDiscountPercent })}</span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n </div>\n\n {(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })}\n </button>\n );\n }\n\n return (\n <div className={styles.ctaButtonGroup}>\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.ctaDualLeft}>\n <span>{submitting ? t(\"bundle.cta.adding\") : t(\"bundle.cta.add_to_basket\")}</span>\n </button>\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.ctaDualRight}>\n <span>{submitting ? t(\"bundle.cta.processing\") : t(\"bundle.cta.checkout\")}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.processing\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.checkout\")}\n </button>\n );\n }\n\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.add_to_basket\")}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n {t(\"bundle.powered_by\")}{\" \"}\n <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\">\n BestBundles\n </a>\n </div>\n </footer>\n </section>\n );\n}\n","import React, { useEffect, useMemo, useState } from \"react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport { formatBundleCurrency } from \"../i18n\";\nimport styles from \"./VolumeDiscountPanel.module.css\";\n\nfunction normalizeVariantId(raw: string | null | undefined) {\n const value = String(raw ?? \"\").trim();\n if (!value) return \"\";\n if (value.startsWith(\"gid://shopify/ProductVariant/\")) return value;\n const digits = value.replace(/\\D/g, \"\");\n return digits ? `gid://shopify/ProductVariant/${digits}` : \"\";\n}\n\nfunction getCurrentVariantId() {\n if (typeof window === \"undefined\") return \"\";\n const variantParam = new URLSearchParams(window.location.search).get(\"variant\");\n if (variantParam) return normalizeVariantId(variantParam);\n\n const productForm = document.querySelector('form[action*=\"/cart/add\"]');\n const input = productForm?.querySelector<HTMLInputElement | HTMLSelectElement>('input[name=\"id\"], select[name=\"id\"]');\n return normalizeVariantId(input?.value ?? \"\");\n}\n\nfunction getQuantityInput() {\n if (typeof document === \"undefined\") return null;\n const productForm = document.querySelector('form[action*=\"/cart/add\"]');\n return productForm?.querySelector<HTMLInputElement>('input[name=\"quantity\"]') ?? null;\n}\n\nfunction getCurrentQuantity() {\n const quantityInput = getQuantityInput();\n if (!quantityInput) return null;\n const quantity = Number(quantityInput.value ?? NaN);\n if (!Number.isFinite(quantity) || quantity <= 0) return null;\n return Math.floor(quantity);\n}\n\nfunction updateProductFormQuantity(nextQuantity: number) {\n const quantityInput = getQuantityInput();\n if (!quantityInput) return false;\n quantityInput.value = String(nextQuantity);\n quantityInput.dispatchEvent(new Event(\"input\", { bubbles: true }));\n quantityInput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return true;\n}\n\nexport type VolumeDiscountPanelProps = {\n className?: string;\n preferFirstEligibleVariant?: boolean;\n};\n\nexport function VolumeDiscountPanel({ className, preferFirstEligibleVariant = false }: VolumeDiscountPanelProps) {\n const { loading, error, config, eligibleVariants, currencyCode, locale } = useBundleBuilder();\n const [currentVariantId, setCurrentVariantId] = useState(\"\");\n const [currentQuantity, setCurrentQuantity] = useState<number | null>(null);\n const [selectedRuleHandle, setSelectedRuleHandle] = useState<string | null>(null);\n const shouldPreferFirstEligibleVariant =\n preferFirstEligibleVariant ||\n (typeof window !== \"undefined\" &&\n Boolean(\n (window as Window & { __BUNDLE_PREVIEW_CONFIG__?: unknown }).__BUNDLE_PREVIEW_CONFIG__,\n ));\n\n useEffect(() => {\n const syncVariantId = () => setCurrentVariantId(getCurrentVariantId());\n syncVariantId();\n document.addEventListener(\"variant:change\", syncVariantId);\n const timer = window.setInterval(syncVariantId, 500);\n return () => {\n document.removeEventListener(\"variant:change\", syncVariantId);\n window.clearInterval(timer);\n };\n }, []);\n\n useEffect(() => {\n const syncQuantity = () => setCurrentQuantity(getCurrentQuantity());\n const handleQuantityEvent = (event: Event) => {\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) return;\n if (target.name !== \"quantity\") return;\n syncQuantity();\n };\n\n syncQuantity();\n document.addEventListener(\"input\", handleQuantityEvent, true);\n document.addEventListener(\"change\", handleQuantityEvent, true);\n const timer = window.setInterval(syncQuantity, 500);\n\n return () => {\n document.removeEventListener(\"input\", handleQuantityEvent, true);\n document.removeEventListener(\"change\", handleQuantityEvent, true);\n window.clearInterval(timer);\n };\n }, []);\n\n const rules = useMemo(\n () => [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize),\n [config?.rules],\n );\n\n const activeVariantId = shouldPreferFirstEligibleVariant\n ? eligibleVariants[0]?.id || \"\"\n : currentVariantId || eligibleVariants[0]?.id || \"\";\n const activeVariant = eligibleVariants.find((variant) => variant.id === activeVariantId) ?? null;\n\n useEffect(() => {\n if (!rules.length) {\n setSelectedRuleHandle(null);\n return;\n }\n if (currentQuantity != null) {\n let matchedRuleHandle: string | null = null;\n for (const rule of rules) {\n if (rule.minBundleSize <= currentQuantity) {\n matchedRuleHandle = rule.handle;\n }\n }\n setSelectedRuleHandle(matchedRuleHandle ?? rules[0]?.handle ?? null);\n return;\n }\n setSelectedRuleHandle((current) => current ?? rules[0]?.handle ?? null);\n }, [currentQuantity, rules]);\n\n if (config?.bundleType !== \"volume_discount\") {\n return null;\n }\n\n return (\n <section className={[styles.panel, className].filter(Boolean).join(\" \")} aria-busy={loading}>\n <h2 className={styles.title}>{config?.title?.trim() || \"Volume discount\"}</h2>\n {loading ? <div className={styles.status}>Loading volume discounts…</div> : null}\n {error ? <div className={styles.error}>{error}</div> : null}\n {!loading && !error && !activeVariant ? (\n <div className={styles.status}>Select an eligible variant to view volume discounts.</div>\n ) : null}\n {!loading && !error && activeVariant ? (\n <>\n <div className={styles.rules}>\n {rules.map((rule) => {\n const percentValue = Number.parseFloat(rule.discountPercent);\n const subtitle = Number.isFinite(percentValue) && percentValue > 0\n ? `Save ${Math.round(percentValue)}%`\n : \"Standard\";\n const checked = selectedRuleHandle === rule.handle;\n\n return (\n <div\n key={rule.handle}\n className={[styles.rule, checked ? styles.ruleSelected : \"\"].filter(Boolean).join(\" \")}\n >\n <label className={styles.ruleLabel}>\n <div className={styles.ruleLabelContent}>\n <input\n className={styles.ruleInput}\n type=\"radio\"\n checked={checked}\n name=\"bb-volume-discount-rule\"\n onChange={() => {\n setSelectedRuleHandle(rule.handle);\n updateProductFormQuantity(rule.minBundleSize);\n }}\n />\n <span className={styles.ruleTitle}>{`Buy ${rule.minBundleSize}`}</span>\n <span className={styles.ruleSubtitle}>{subtitle}</span>\n </div>\n <div>\n {(() => {\n const unitPrice = Number(activeVariant.price ?? NaN);\n if (!Number.isFinite(unitPrice)) return null;\n const totalPrice = unitPrice * rule.minBundleSize;\n const hasDiscount = Number.isFinite(percentValue) && percentValue > 0;\n const discountedPrice = hasDiscount\n ? totalPrice * (1 - (percentValue / 100))\n : totalPrice;\n\n if (!hasDiscount) {\n return (\n <span className={styles.priceRow}>\n <span className={styles.newPrice}>\n {formatBundleCurrency(totalPrice, currencyCode, locale)}\n </span>\n </span>\n );\n }\n\n return (\n <span className={styles.priceRow}>\n <span className={styles.oldPrice}>\n {formatBundleCurrency(totalPrice, currencyCode, locale)}\n </span>\n <span className={styles.newPrice}>\n {formatBundleCurrency(discountedPrice, currencyCode, locale)}\n </span>\n </span>\n );\n })()}\n </div>\n </label>\n </div>\n );\n })}\n </div>\n </>\n ) : null}\n </section>\n );\n}\n","import type { BundleCartAdapter, BundleCartLineAttribute } from \"../types\";\n\nfunction toProperties(attributes?: BundleCartLineAttribute[]) {\n if (!attributes?.length) return undefined;\n return attributes.reduce<Record<string, string>>((acc, attr) => {\n if (attr?.key) acc[attr.key] = attr.value ?? \"\";\n return acc;\n }, {});\n}\n\nfunction normalizeVariantId(merchandiseId: string) {\n const match = /\\/(\\d+)$/.exec(merchandiseId);\n return match ? match[1] : merchandiseId;\n}\n\nfunction toVariantGid(variantId: string | number | null | undefined) {\n if (variantId == null) return null;\n const raw = String(variantId).trim();\n if (!raw) return null;\n if (raw.startsWith(\"gid://shopify/ProductVariant/\")) return raw;\n return `gid://shopify/ProductVariant/${raw}`;\n}\n\nfunction getShopifyTheme() {\n if (typeof window === \"undefined\") return null;\n return (window as Window & {\n Shopify?: { theme?: { schema_name?: string | null; name?: string | null } };\n }).Shopify?.theme ?? null;\n}\n\nfunction isSleekTheme() {\n const theme = getShopifyTheme();\n if (!theme) return false;\n\n if (theme.schema_name === \"Sleek\") return true;\n return /sleek/i.test(theme.name ?? \"\");\n}\n\nfunction hasSleekCartDrawer() {\n if (typeof document === \"undefined\") return false;\n return !!document.querySelector(\"cart-drawer\");\n}\n\nfunction tryOpenSleekCartDrawer() {\n if (!isSleekTheme() || !hasSleekCartDrawer()) return false;\n\n document.dispatchEvent(new CustomEvent(\"cart:refresh\", {\n bubbles: true,\n detail: { open: true },\n }));\n\n return true;\n}\n\n/**\n * Refreshes the page so the theme re-renders with the updated cart.\n * Liquid themes fetch cart state on load, so a full reload guarantees the cart UI\n * (drawer, icon bubble, etc.) shows the correct state after adding bundle items.\n */\nfunction reloadPageForCartUpdate() {\n window.location.reload();\n}\n\nasync function postCartJson(endpoint: string, payload: Record<string, unknown>) {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(text || `Cart request failed: ${res.status}`);\n }\n return res.json().catch(() => null);\n}\n\nasync function getCartJson() {\n const res = await fetch(\"/cart.js\", {\n method: \"GET\",\n cache: \"no-store\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n });\n if (!res.ok) {\n throw new Error(`Cart request failed: ${res.status}`);\n }\n return res.json() as Promise<{ items?: Array<{ id?: number | string | null; quantity?: number | null }> }>;\n}\n\nexport function createLiquidCartAdapter(): BundleCartAdapter {\n return {\n async linesAdd(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesAddForCheckout(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesUpdate(lines) {\n for (const line of lines) {\n await postCartJson(\"/cart/change.js\", {\n id: line.id,\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n });\n }\n },\n async linesRemove(lineIds) {\n for (const id of lineIds) {\n await postCartJson(\"/cart/change.js\", { id, quantity: 0 });\n }\n },\n async getLineQuantitiesByMerchandiseId() {\n const cart = await getCartJson();\n const quantities: Record<string, number> = {};\n for (const item of cart.items ?? []) {\n const merchandiseId = toVariantGid(item.id);\n if (!merchandiseId) continue;\n const quantity = Number(item.quantity ?? 0);\n if (!Number.isFinite(quantity) || quantity <= 0) continue;\n quantities[merchandiseId] = (quantities[merchandiseId] ?? 0) + Math.floor(quantity);\n }\n return quantities;\n },\n openCartUI() {\n if (tryOpenSleekCartDrawer()) return;\n\n // Reload the page so the theme fetches and displays the updated cart.\n window.setTimeout(() => reloadPageForCartUpdate(), 0);\n },\n navigateToCheckout() {\n // Navigate to Shopify checkout page\n window.location.href = \"/checkout\";\n },\n };\n}\n"],"names":["BundleLineAttributeKeys","BundleSessionStorageKeys","fetchActiveBundleConfigs","params","url","json","fetchBundleConfig","fetchBundleConfigStatus","getVariantSelectionLimit","variant","quantity","ANONYMOUS_USER_ID_KEY","getOrCreateAnonymousUserId","existing","newId","cryptoAny","trackEvent","analyticsEndpoint","shop","event","response","error","EN","FR","DE","ES","DICTS","normalizeBundleLocale","raw","value","base","translateBundleUi","locale","key","vars","overrides","template","_a","text","name","formatBundleCurrency","amount","currencyCode","n","getProductWord","count","plural","BundleBuilderContext","createContext","BUNDLE_DRAWER_HASH","EMPTY_ELIGIBLE_VARIANTS","normalizeBundleHandle","getBundleHashHandle","hash","prefix","STYLE_SETTINGS_TO_CSS_VAR","GOOGLE_FONTS_LINK_ID","fontNameToParam","s","injectGoogleFontsLink","styles","body","title","families","href","link","injectStyleVariables","root","cssVar","getEffectiveStyleSettings","configSettings","preview","safeRandomUUID","clampQty","clampToVariantLimit","limit","normalized","normalizeLineAttributes","attributes","attribute","attributesSignature","a","b","createSelectedLine","merchandiseId","snapshotFromLines","lines","line","restoreLinesFromSnapshot","snapshot","shouldUseActiveConfigPreload","allowDrawerWhenInactive","initialData","BundleProvider","props","apiBaseUrl","cartAdapter","configHandle","configFetcher","activeConfigsFetcher","configStatusFetcher","providedAnalyticsEndpoint","inputLocale","messages","children","t","useCallback","normalizedInitialHandle","useActivePreload","isOpen","setIsOpen","useState","submitting","setSubmitting","setError","cartSyncing","setCartSyncing","cartQuantitiesByMerchandiseId","setCartQuantitiesByMerchandiseId","currentHandle","setCurrentHandleState","configCache","setConfigCache","bootstrapLoading","setBootstrapLoading","blockingHandleLoad","setBlockingHandleLoad","statusCheckPending","setStatusCheckPending","pendingOpenHandle","setPendingOpenHandle","selectedLines","setSelectedLines","preloadAbortRef","useRef","handleFetchAbortRef","statusAbortRef","cartSyncSeqRef","currentHandleRef","configCacheRef","bootstrapLoadingRef","openForHandleRef","skipSelectionResetOnHandleChangeRef","preserveSelectionsUntilHandleLoadedRef","fetcher","defaultFetchBundleConfig","activePreloadFetcher","statusFetcher","loadCartQuantities","quantities","acc","id","q","refreshCartQuantities","syncSeq","useEffect","setConfigHandle","handle","close","anonymousUserId","trackError","openDrawerOnly","current","applyLatestConfigResponse","prev","next","refreshHandleConfig","options","normalizedHandle","ac","fetchError","message","loadHandle","cachedEntry","openForHandle","source","_b","status","open","toggle","entry","openIfHash","handleInHash","currentEntry","config","eligibleVariants","loading","effective","handlePreviewStyles","win","applyPreviewConfig","previewConfig","previewVariants","previewVariantsLoading","maxBundleSize","useMemo","variantSelectionLimitById","baseLimit","inCart","eligibleVariantIdsSet","minRequired","rules","ruleMin","rule","normalizedRuleMin","configuredRaw","configuredMin","getSelectionsFromLines","setQuantity","variantLimit","prevSelections","prevQty","requestedDelta","currentBundleSize","variantRemaining","delta","nextLines","remainingToRemove","keptReversed","i","nextSelections","prevBundleSize","nextBundleSize","basePayload","addConfiguredVariant","input","targetHandle","isTargetingDifferentHandle","targetEntry","targetEligibleVariantIdsSet","baseLines","currentQty","targetMaxBundleSize","targetVariant","isWaitingForPreservedHandle","clearSelections","syncCartQuantities","getVariantMaxSelectableQuantity","selections","selectionOrder","bundleSize","canSubmit","getSelectionSnapshot","restoreSelectionSnapshot","redirectVariantToProductPage","productHandle","variantParam","_c","search","performCartAddition","bundleId","bundleTitle","latestCartQuantities","effectiveLimitById","linesBySignature","selectedLine","remaining","existingQtyForVariant","sum","signature","byId","grossPrice","price","rulesSorted","appliedRule","appliedDiscountPercent","pct","discountedPrice","discountedAmount","productVariantIds","discountThresholdIdentifier","discountLabel","isCheckout","addError","rawMessage","isStockError","submit","submitAndCheckout","jsx","useBundleBuilder","ctx","useContext","useBundleBuilderDrawer","BundleButton","tweenFunctions","d","c","p","v","tweenFunctions_1","degreesToRads","degrees","randomRange","min","max","randomInt","ParticleShape","RotationDirection","DEFAULT_FRAME_TIME","Particle","context","getOptions","x","y","colors","initialVelocityX","initialVelocityY","elapsed","gravity","wind","friction","opacity","drawShape","frameTimeMultiplier","rotateDelta","ParticleGenerator","canvas","newParticleX","newParticleY","particlesGenerated","lastNumberOfPieces","run","recycle","numberOfPieces","debug","tweenFunction","tweenDuration","nP","activeCount","tweenedVal","numToAdd","confettiDefaults","tweens.easeInOutQuad","Confetti","opts","computedConfettiDefaults","timestamp","onConfettiComplete","frameRate","lastRunState","lastRecycleState","ref","React","ReactConfettiInternal","extractCanvasProps","confettiOptions","passedProps","canvasStyles","refs","rest","confettiOptionKeys","refProps","prop","val","ReactConfetti","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","iconNode","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","ChevronDown","Plus","Search","Trash2","BundleBuilderDrawer","isSearchOpen","setIsSearchOpen","searchQuery","setSearchQuery","searchInputRef","footerRef","celebrationChipRef","windowSize","setWindowSize","confettiKey","setConfettiKey","confettiSource","setConfettiSource","isConfettiActive","setIsConfettiActive","confettiTimerRef","prevBundleSizeForConfettiRef","confettiSettleMs","celebrationKey","setCelebrationKey","celebrationText","setCelebrationText","isCelebrationActive","setIsCelebrationActive","celebrationTimerRef","celebrationDurationMs","DEFAULT_CONFETTI_COLORS","confettiColors","formatPercent0dp","formatVariantOptions","selectedOptions","o","isDefaultTitle","getVariantPrimaryName","displayName","productTitle","variantTitle","_d","getVariantA11yLabel","getVariantOptionLabel","isMounted","setIsMounted","closeTimerRef","formatMoney","redirectToProductPage","isAtMaxBundleSize","handleVariantAdd","nextQuantity","sorted","filteredVariants","tokens","matches","parts","haystack","groupedProducts","matchesSearch","tok","map","productId","group","g","openProductPicker","setOpenProductPicker","pickerRef","handleClick","e","itemsRemaining","best","r","firstRule","hasUnlockedFirstDiscount","subtotal","total","variantId","qty","discountedTotal","maxRuleSize","filledVariants","thresholdByIndex","idx","slotCount","isDualButtonAnimationLoaded","setIsDualButtonAnimationLoaded","prevItemsRemainingRef","wasPositive","panelRef","bodyRef","boxSummaryWindowRef","prevBundleSizeRef","scrollVariantRowIntoView","container","row","padding","maxTop","rowCenterOffset","targetTop","nextTop","onKeyDown","onResize","raf","hitThreshold","nextThreshold","targetIdx","el","containerRect","deltaRight","maxLeft","nextLeft","hitRule","k","chipEl","rect","panelRect","originX","originY","jsxs","productImage","hasMultipleVariants","isPickerOpen","selectedVariants","variantA11y","vLimit","normalizedLimit","isAtLimit","isUnavailable","canIncrease","stockLabel","origPrice","hasDiscount","fallbackVariantTitle","optionText","isAlreadySelected","isSoldOut","isMaxAdded","isBundleFull","isDisabled","statusLabel","optionLabel","Fragment","variantPrimaryName","variantOptionText","variantSelectionLimit","normalizedVariantSelectionLimit","isAtVariantStockLimit","canIncreaseQuantity","stockStatusLabel","discountPercentToUse","originalPriceNumber","discountedPriceNumber","_","threshold","isFilled","isThreshold","showThreshold","discountText","titleText","buttonMode","BundleBuilderPanel","showRules","showVariants","primaryName","displayVariants","variantsRef","lineIndex","ruleForLine","isClickable","normalizeVariantId","digits","getCurrentVariantId","productForm","getQuantityInput","getCurrentQuantity","quantityInput","updateProductFormQuantity","VolumeDiscountPanel","preferFirstEligibleVariant","currentVariantId","setCurrentVariantId","currentQuantity","setCurrentQuantity","selectedRuleHandle","setSelectedRuleHandle","shouldPreferFirstEligibleVariant","syncVariantId","timer","syncQuantity","handleQuantityEvent","target","activeVariantId","activeVariant","matchedRuleHandle","percentValue","subtitle","checked","unitPrice","totalPrice","toProperties","attr","toVariantGid","getShopifyTheme","isSleekTheme","theme","hasSleekCartDrawer","tryOpenSleekCartDrawer","reloadPageForCartUpdate","postCartJson","endpoint","payload","res","getCartJson","createLiquidCartAdapter","items","lineIds","cart","item"],"mappings":"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","x_google_ignoreList":[11,12,13,14,15,16,17,18,19,20]}
|