@best-bundles/bundle-ui 0.0.47 → 0.0.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.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/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]}
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.error || t(\"bundle.provider.load_error\"));\n setIsOpen(false);\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 if (!status.ok) {\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 title = config?.title?.trim() || t(\"bundle.title.default\");\n const redirectToProductPage = Boolean(config?.redirectEligibleProductsToProductPage);\n const isReadyToRender = Boolean(config);\n const visualOpen = isOpen && isReadyToRender;\n const [isMounted, setIsMounted] = useState(visualOpen);\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 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 (!visualOpen) 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, visualOpen]);\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 (visualOpen) {\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 }, [visualOpen]);\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 (!visualOpen) return;\n if (!isSearchOpen) return;\n const raf = requestAnimationFrame(() => searchInputRef.current?.focus());\n return () => cancelAnimationFrame(raf);\n }, [visualOpen, 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 (!visualOpen) 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, visualOpen, rulesSorted]);\n\n useEffect(() => {\n if (!visualOpen) 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, visualOpen]);\n\n useEffect(() => {\n if (!visualOpen) return;\n panelRef.current?.focus();\n }, [visualOpen]);\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, visualOpen ? 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, visualOpen ? 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","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","v","displayName","productTitle","variantTitle","_d","getVariantA11yLabel","getVariantOptionLabel","redirectToProductPage","visualOpen","isMounted","setIsMounted","closeTimerRef","formatMoney","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]}