@best-bundles/bundle-ui 0.0.41 → 0.0.42

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/context/BundleProvider.tsx","../src/hooks/useBundleBuilder.ts","../src/hooks/useBundleBuilderDrawer.ts","../src/components/BundleButton.tsx","../../../node_modules/tween-functions/index.js","../../../node_modules/react-confetti/dist/react-confetti.mjs","../../../node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/lucide-react/dist/esm/icons/plus.js","../../../node_modules/lucide-react/dist/esm/icons/search.js","../../../node_modules/lucide-react/dist/esm/icons/trash-2.js","../src/components/BundleBuilderDrawer.tsx","../src/components/BundleBuilderPanel.tsx","../src/adapters/LiquidAdapter.ts"],"sourcesContent":["export const BundleLineAttributeKeys = {\n bundleId: \"_bundle_id\",\n bundleConfig: \"_bundle_config\",\n bundleSource: \"_bundle_source\",\n bundleTitle: \"_bundle_title\",\n} as const;\n\n","import type { PublicActiveBundleConfigsResponse } from \"../types\";\n\nexport async function fetchActiveBundleConfigs(params: {\n apiBaseUrl: string;\n shop: string;\n signal?: AbortSignal;\n}): Promise<PublicActiveBundleConfigsResponse> {\n const url = new URL(\"/api/public/bundle-configs-active\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicActiveBundleConfigsResponse;\n}\n","import type { PublicBundleConfigResponse } from \"../types\";\n\nexport async function fetchBundleConfig(params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n fresh?: boolean;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigResponse> {\n const url = new URL(\"/api/public/bundle-config\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n if (params.configHandle) {\n url.searchParams.set(\"handle\", params.configHandle);\n }\n if (params.fresh) {\n url.searchParams.set(\"fresh\", \"1\");\n }\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n // The endpoint uses 4xx/5xx for some errors; normalize to {ok:false}.\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigResponse;\n}\n","import type { PublicBundleConfigStatusResponse } from \"../types\";\n\nexport async function fetchBundleConfigStatus(params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigStatusResponse> {\n const url = new URL(\"/api/public/bundle-config-status\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n if (params.configHandle) {\n url.searchParams.set(\"handle\", params.configHandle);\n }\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigStatusResponse;\n}\n","import type { BundleEligibleVariant } from \"../types\";\n\nexport function getVariantSelectionLimit(variant: BundleEligibleVariant | null | undefined) {\n if (!variant || variant.availableForSale === false) return 0;\n if (variant.inventoryPolicy === \"CONTINUE\") return Number.POSITIVE_INFINITY;\n // Untracked inventory can surface as null/0 sellable quantity while still available for sale.\n if (variant.sellableOnlineQuantity == null) return Number.POSITIVE_INFINITY;\n\n const quantity = Number(variant.sellableOnlineQuantity);\n if (!Number.isFinite(quantity)) return Number.POSITIVE_INFINITY;\n if (quantity <= 0 && variant.availableForSale === true) return Number.POSITIVE_INFINITY;\n return Math.max(0, Math.floor(quantity));\n}\n\nexport function isVariantAtStockLimit(\n variant: BundleEligibleVariant | null | undefined,\n quantity: number,\n) {\n const limit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(limit)) return false;\n return Math.max(0, Math.floor(quantity || 0)) >= limit;\n}\n","const ANONYMOUS_USER_ID_KEY = \"bb_anonymous_user_id\";\n\n/**\n * Gets or creates an anonymous user ID stored in localStorage.\n * This ID persists across sessions to attribute events to the same user.\n */\nexport function getOrCreateAnonymousUserId(): string {\n if (typeof window === \"undefined\" || typeof localStorage === \"undefined\") {\n // Fallback for SSR or environments without localStorage\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n try {\n const existing = localStorage.getItem(ANONYMOUS_USER_ID_KEY);\n if (existing && typeof existing === \"string\" && existing.length > 0) {\n return existing;\n }\n\n // Generate new ID\n let newId: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) {\n newId = cryptoAny.randomUUID();\n } else {\n throw new Error(\"crypto.randomUUID not available\");\n }\n } catch {\n // Fallback UUID generation\n newId = `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n localStorage.setItem(ANONYMOUS_USER_ID_KEY, newId);\n return newId;\n } catch {\n // If localStorage fails, generate a temporary ID\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n\nexport type AnalyticsEventType =\n | \"DRAWER_OPENED\"\n | \"DRAWER_CLOSED\"\n | \"VARIANT_SELECTION_CHANGED\"\n | \"BUNDLE_ADDED_TO_BASKET\";\n\n/** Mixpanel event names used for the bundle funnel (backend maps these to Mixpanel). */\nexport type MixpanelBundleEventName =\n | \"bundle_opened\"\n | \"bundle_closed\"\n | \"bundle_started\"\n | \"bundle_completed\"\n | \"bundle_added_to_cart\"\n | \"checkout_started_with_bundle\";\n\nexport type DrawerOpenedEvent = {\n eventType: \"DRAWER_OPENED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_opened\";\n};\n\nexport type DrawerClosedEvent = {\n eventType: \"DRAWER_CLOSED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_closed\";\n};\n\nexport type VariantSelectionChangedEvent = {\n eventType: \"VARIANT_SELECTION_CHANGED\";\n shop: string;\n anonymousUserId: string;\n before: Record<string, number>; // variantId -> quantity\n after: Record<string, number>;\n timestamp: string;\n mixpanelEvent?: \"bundle_started\" | \"bundle_completed\";\n};\n\nexport type BundleAddedToBasketEvent = {\n eventType: \"BUNDLE_ADDED_TO_BASKET\";\n shop: string;\n anonymousUserId: string;\n bundleId: string;\n productVariantIds: string[];\n grossPrice: number;\n discountedPrice: number;\n currency?: string;\n discountThresholdIdentifier: string; // rule handle\n discountLabel: string;\n discountPercentage: number | null;\n discountedAmount: number;\n timestamp: string;\n checkout?: boolean;\n mixpanelEvent?: \"bundle_added_to_cart\" | \"checkout_started_with_bundle\";\n};\n\nexport type AnalyticsEvent =\n | DrawerOpenedEvent\n | DrawerClosedEvent\n | VariantSelectionChangedEvent\n | BundleAddedToBasketEvent;\n\n/**\n * Sends an analytics event to the backend API endpoint.\n * Failures are silently caught to prevent breaking bundle functionality.\n */\nexport async function trackEvent(\n analyticsEndpoint: string,\n shop: string,\n event: AnalyticsEvent,\n): Promise<void> {\n if (typeof window === \"undefined\") {\n return; // Skip in SSR\n }\n\n try {\n const url = new URL(analyticsEndpoint, window.location.origin);\n url.searchParams.set(\"shop\", shop);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(event),\n // Don't wait for response - fire and forget\n keepalive: true,\n });\n\n if (!response.ok) {\n console.warn(\n `[Bundle Analytics] Event tracking failed with status ${response.status}:`,\n await response.text().catch(() => \"Unable to read response\"),\n );\n }\n } catch (error) {\n // Log error for debugging but don't break bundle functionality\n console.warn(\"[Bundle Analytics] Failed to track event:\", error);\n }\n}\n","import { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { fetchActiveBundleConfigs } from \"../api/fetchActiveBundleConfigs\";\nimport { fetchBundleConfig as defaultFetchBundleConfig } from \"../api/fetchBundleConfig\";\nimport { fetchBundleConfigStatus } from \"../api/fetchBundleConfigStatus\";\nimport { BundleLineAttributeKeys } from \"../constants\";\nimport type {\n BundleCartAdapter,\n BundleConfig,\n BundleEligibleVariant,\n PublicActiveBundleConfigsResponse,\n PublicBundleConfigResponse,\n PublicBundleConfigStatusResponse,\n StyleSettings,\n} from \"../types\";\nimport { getVariantSelectionLimit } from \"../utils/stock\";\nimport { getOrCreateAnonymousUserId, trackEvent } from \"../utils/analytics\";\n\ntype BundleProviderData = {\n currencyCode: string | null;\n config: BundleConfig;\n eligibleVariants: BundleEligibleVariant[];\n};\n\ntype BundleProviderCacheEntry = BundleProviderData;\ntype BundleConfigCache = Record<string, BundleProviderCacheEntry>;\ntype BundleSelectionState = Record<string, number>;\ntype BundleSelectionOrder = string[];\ntype OpenSource = \"api\" | \"hash\" | \"click\";\n\nexport type BundleProviderProps = {\n apiBaseUrl: string;\n shop: string;\n cartAdapter: BundleCartAdapter;\n configHandle?: string;\n initialData?: BundleProviderData;\n configFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n fresh?: boolean;\n signal?: AbortSignal;\n }) => Promise<PublicBundleConfigResponse>;\n activeConfigsFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n signal?: AbortSignal;\n }) => Promise<PublicActiveBundleConfigsResponse>;\n configStatusFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n }) => Promise<PublicBundleConfigStatusResponse>;\n analyticsEndpoint?: string;\n allowDrawerWhenInactive?: boolean;\n children: React.ReactNode;\n};\n\nexport type BundleBuilderContextValue = {\n isOpen: boolean;\n open: () => void;\n openForHandle: (handle: string, source?: OpenSource) => void;\n close: () => void;\n toggle: () => void;\n syncCartQuantities: () => Promise<void>;\n currentHandle: string;\n setConfigHandle: (handle: string) => void;\n loadHandle: (handle: string) => void;\n\n loading: boolean;\n submitting: boolean;\n error: string | null;\n\n currencyCode: string | null;\n config: BundleConfig | null;\n eligibleVariants: BundleEligibleVariant[];\n\n selections: BundleSelectionState;\n selectionOrder: BundleSelectionOrder;\n getVariantMaxSelectableQuantity: (merchandiseId: string) => number | null;\n setQuantity: (merchandiseId: string, quantity: number) => void;\n clearSelections: () => void;\n\n bundleSize: number;\n minRequired: number;\n canSubmit: boolean;\n submit: () => Promise<void>;\n submitAndCheckout: () => Promise<void>;\n};\n\nexport const BundleBuilderContext = createContext<BundleBuilderContextValue | null>(null);\n\nconst BUNDLE_DRAWER_HASH = \"#best-bundles\";\nconst EMPTY_ELIGIBLE_VARIANTS: BundleEligibleVariant[] = [];\n\nfunction normalizeBundleHandle(raw: string | null | undefined) {\n const value = String(raw ?? \"\").trim().toLowerCase();\n if (!value) return \"default\";\n const cleaned = value\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+/, \"\")\n .replace(/-+$/, \"\")\n .replace(/-{2,}/g, \"-\");\n return cleaned || \"default\";\n}\n\nfunction getBundleHashHandle(hash: string): string | null {\n const value = String(hash ?? \"\").trim().toLowerCase();\n if (!value.startsWith(BUNDLE_DRAWER_HASH)) return null;\n if (value === BUNDLE_DRAWER_HASH) return \"default\";\n const prefix = `${BUNDLE_DRAWER_HASH}:`;\n if (!value.startsWith(prefix)) return null;\n return normalizeBundleHandle(value.slice(prefix.length));\n}\n\ntype StyleSettingCssVarKey = Exclude<keyof StyleSettings, \"confettiColors\">;\nconst STYLE_SETTINGS_TO_CSS_VAR: Record<StyleSettingCssVarKey, string> = {\n primaryColor: \"--bb-cta-bg\",\n primaryHoverColor: \"--bb-cta-bg-hover\",\n primaryTextColor: \"--bb-cta-text\",\n backgroundColor: \"--bb-surface-bg\",\n backdropColor: \"--bb-backdrop-bg\",\n textColor: \"--bb-text-color\",\n titleColor: \"--bb-title-color\",\n mutedTextColor: \"--bb-muted-color\",\n borderRadius: \"--bb-panel-radius\",\n borderColor: \"--bb-border-color\",\n borderStrongColor: \"--bb-border-strong-color\",\n focusRingColor: \"--bb-focus-ring\",\n tierBorderColor: \"--bb-tier-border\",\n tierTextColor: \"--bb-tier-text\",\n tierBackgroundColor: \"--bb-tier-bg\",\n celebrationTextColor: \"--bb-celebration-text\",\n celebrationBgTop: \"--bb-celebration-bg-top\",\n celebrationBgBottom: \"--bb-celebration-bg-bottom\",\n celebrationBorderColor: \"--bb-celebration-border\",\n fontFamilyBody: \"--bb-font-family-body\",\n fontFamilyTitle: \"--bb-font-family-title\",\n};\n\nconst GOOGLE_FONTS_LINK_ID = \"bb-google-fonts\";\n\nfunction fontNameToParam(name: string): string {\n const s = (name ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n return s ? encodeURIComponent(s).replace(/%20/g, \"+\") : \"\";\n}\n\nfunction injectGoogleFontsLink(styles: StyleSettings | undefined) {\n if (typeof document === \"undefined\" || !document.head) return;\n if (!styles) {\n document.getElementById(GOOGLE_FONTS_LINK_ID)?.remove();\n return;\n }\n const body = (styles.fontFamilyBody ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const title = (styles.fontFamilyTitle ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const families: string[] = [];\n if (body) families.push(\"family=\" + fontNameToParam(body));\n if (title && title !== body) families.push(\"family=\" + fontNameToParam(title));\n const existing = document.getElementById(GOOGLE_FONTS_LINK_ID) as HTMLLinkElement | null;\n if (families.length === 0) {\n existing?.remove();\n return;\n }\n const href = `https://fonts.googleapis.com/css2?${families.join(\"&\")}&display=swap`;\n if (existing) {\n if (existing.getAttribute(\"href\") !== href) existing.setAttribute(\"href\", href);\n return;\n }\n const link = document.createElement(\"link\");\n link.id = GOOGLE_FONTS_LINK_ID;\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n}\n\nfunction injectStyleVariables(styles: StyleSettings | undefined) {\n if (!styles) return;\n injectGoogleFontsLink(styles);\n const root = document.documentElement;\n (Object.entries(STYLE_SETTINGS_TO_CSS_VAR) as Array<[StyleSettingCssVarKey, string]>).forEach(([key, cssVar]) => {\n let value = styles[key];\n if (value) {\n if ((key === \"fontFamilyBody\" || key === \"fontFamilyTitle\") && /^\\s*\\S+\\s+\\S/.test(value) && !/^[\"']/.test(value.trim())) {\n value = `\"${value.trim().replace(/^[\"']|[\"']$/g, \"\")}\"`;\n }\n root.style.setProperty(cssVar, value);\n }\n });\n}\n\nfunction getEffectiveStyleSettings(configSettings: StyleSettings | undefined): StyleSettings | undefined {\n if (typeof window === \"undefined\") return configSettings;\n const preview = (window as Window & { __BUNDLE_PREVIEW_STYLES__?: StyleSettings }).__BUNDLE_PREVIEW_STYLES__;\n if (preview && typeof preview === \"object\") return preview;\n return configSettings;\n}\n\nfunction safeRandomUUID() {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) return cryptoAny.randomUUID();\n } catch {\n // ignore\n }\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction clampQty(n: number) {\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.floor(n));\n}\n\nfunction clampToVariantLimit(quantity: number, limit: number) {\n const normalized = clampQty(quantity);\n if (!Number.isFinite(limit)) return normalized;\n return Math.min(normalized, Math.max(0, Math.floor(limit)));\n}\n\nfunction shouldUseActiveConfigPreload(\n allowDrawerWhenInactive: boolean,\n initialData?: BundleProviderData,\n) {\n return !allowDrawerWhenInactive && !initialData;\n}\n\nexport function BundleProvider(props: BundleProviderProps) {\n const {\n apiBaseUrl,\n shop,\n cartAdapter,\n configHandle = \"default\",\n initialData,\n configFetcher,\n activeConfigsFetcher,\n configStatusFetcher,\n analyticsEndpoint: providedAnalyticsEndpoint,\n allowDrawerWhenInactive = false,\n children,\n } = props;\n\n const normalizedInitialHandle = normalizeBundleHandle(configHandle);\n const analyticsEndpoint = providedAnalyticsEndpoint ?? `${apiBaseUrl}/api/public/bundle-analytics`;\n const useActivePreload = shouldUseActiveConfigPreload(allowDrawerWhenInactive, initialData);\n\n const [isOpen, setIsOpen] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [cartSyncing, setCartSyncing] = useState(false);\n const [cartQuantitiesByMerchandiseId, setCartQuantitiesByMerchandiseId] = useState<Record<string, number>>({});\n const [currentHandle, setCurrentHandleState] = useState(normalizedInitialHandle);\n const [configCache, setConfigCache] = useState<BundleConfigCache>(() => (\n initialData ? { [normalizedInitialHandle]: initialData } : {}\n ));\n const [bootstrapLoading, setBootstrapLoading] = useState(useActivePreload);\n const [blockingHandleLoad, setBlockingHandleLoad] = useState<string | null>(\n !useActivePreload && !initialData ? normalizedInitialHandle : null,\n );\n const [statusCheckPending, setStatusCheckPending] = useState<string | null>(null);\n const [pendingOpenHandle, setPendingOpenHandle] = useState<{ handle: string; source: OpenSource } | null>(null);\n const [selectionsState, setSelectionsState] = useState<{ selections: BundleSelectionState; order: BundleSelectionOrder }>(\n () => ({ selections: {}, order: [] }),\n );\n\n const preloadAbortRef = useRef<AbortController | null>(null);\n const handleFetchAbortRef = useRef<AbortController | null>(null);\n const statusAbortRef = useRef<AbortController | null>(null);\n const cartSyncSeqRef = useRef(0);\n const currentHandleRef = useRef(currentHandle);\n const configCacheRef = useRef(configCache);\n const bootstrapLoadingRef = useRef(bootstrapLoading);\n const openForHandleRef = useRef<((handle: string, source?: OpenSource) => void) | null>(null);\n const fetcher = configFetcher ?? defaultFetchBundleConfig;\n const activePreloadFetcher = activeConfigsFetcher ?? fetchActiveBundleConfigs;\n const statusFetcher = configStatusFetcher ?? fetchBundleConfigStatus;\n\n const loadCartQuantities = useCallback(async () => {\n if (typeof cartAdapter.getLineQuantitiesByMerchandiseId !== \"function\") return null;\n const quantities = await cartAdapter.getLineQuantitiesByMerchandiseId();\n return Object.entries(quantities ?? {}).reduce<Record<string, number>>((acc, [id, quantity]) => {\n const q = clampQty(quantity);\n if (q > 0) acc[id] = q;\n return acc;\n }, {});\n }, [cartAdapter]);\n\n const refreshCartQuantities = useCallback(async () => {\n const syncSeq = ++cartSyncSeqRef.current;\n setCartSyncing(true);\n try {\n const quantities = await loadCartQuantities();\n if (quantities && syncSeq === cartSyncSeqRef.current) {\n setCartQuantitiesByMerchandiseId(quantities);\n }\n return quantities;\n } catch {\n return null;\n } finally {\n if (syncSeq === cartSyncSeqRef.current) setCartSyncing(false);\n }\n }, [loadCartQuantities]);\n\n useEffect(() => {\n currentHandleRef.current = currentHandle;\n }, [currentHandle]);\n\n useEffect(() => {\n configCacheRef.current = configCache;\n }, [configCache]);\n\n useEffect(() => {\n bootstrapLoadingRef.current = bootstrapLoading;\n }, [bootstrapLoading]);\n\n useEffect(() => {\n void refreshCartQuantities();\n }, [refreshCartQuantities]);\n\n const setConfigHandle = useCallback((handle: string) => {\n setCurrentHandleState(normalizeBundleHandle(handle));\n }, []);\n\n const close = useCallback(() => {\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_CLOSED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_closed\",\n }).catch((trackError) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer closed:\", trackError);\n });\n } catch (trackError) {\n console.warn(\"[Bundle Analytics] Error in close() callback:\", trackError);\n }\n }\n setIsOpen(false);\n if (typeof window !== \"undefined\" && window.location.hash.toLowerCase().startsWith(BUNDLE_DRAWER_HASH)) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n }, [analyticsEndpoint, shop]);\n\n const openDrawerOnly = useCallback(() => {\n setIsOpen((current) => {\n if (current) return current;\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_OPENED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_opened\",\n }).catch((trackError) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer opened:\", trackError);\n });\n } catch (trackError) {\n console.warn(\"[Bundle Analytics] Error in open() callback:\", trackError);\n }\n }\n return true;\n });\n }, [analyticsEndpoint, shop]);\n\n const applyLatestConfigResponse = useCallback((handle: string, response: PublicBundleConfigResponse) => {\n if (!response.ok || response.config.isActive === false) {\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 ? \"Bundle is inactive.\" : (response.error || \"Failed to load bundle config.\"));\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]);\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 : \"Failed to load bundle config.\";\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]);\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 = win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__ ?? [];\n setConfigCache((prev) => ({\n ...prev,\n [currentHandleRef.current]: {\n currencyCode: currencyCode ?? null,\n config: previewConfig,\n eligibleVariants: previewVariants.length ? previewVariants : (prev[currentHandleRef.current]?.eligibleVariants ?? []),\n },\n }));\n if (win.__BUNDLE_PREVIEW_VARIANTS_LOADING__ === true) {\n setBlockingHandleLoad(currentHandleRef.current);\n } else {\n setBlockingHandleLoad((current) => current === currentHandleRef.current ? null : current);\n }\n };\n if (win.__BUNDLE_PREVIEW_CONFIG__) applyPreviewConfig();\n window.addEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n return () => window.removeEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n }, [currencyCode]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? Number.NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const variantSelectionLimitById = useMemo(() => {\n return new Map(\n eligibleVariants.map((variant) => {\n const baseLimit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(baseLimit)) return [variant.id, baseLimit] as const;\n const inCart = clampQty(cartQuantitiesByMerchandiseId[variant.id] ?? 0);\n return [variant.id, Math.max(0, Math.floor(baseLimit) - inCart)] as const;\n }),\n );\n }, [eligibleVariants, cartQuantitiesByMerchandiseId]);\n\n const eligibleVariantIdsSet = useMemo(() => {\n return new Set(\n eligibleVariants\n .filter((variant) => getVariantSelectionLimit(variant) > 0)\n .map((variant) => variant.id),\n );\n }, [eligibleVariants]);\n\n const minRequired = useMemo(() => {\n const rules = config?.rules ?? [];\n const ruleMin = rules.length ? Math.min(...rules.map((rule) => rule.minBundleSize)) : 2;\n const normalizedRuleMin = Number.isFinite(ruleMin) && ruleMin > 0 ? ruleMin : 2;\n const configuredRaw = Number(config?.minBundleSize ?? Number.NaN);\n const configuredMin =\n Number.isFinite(configuredRaw) && Number.isInteger(configuredRaw)\n ? Math.max(2, Math.min(100, configuredRaw))\n : null;\n return configuredMin == null\n ? normalizedRuleMin\n : Math.min(normalizedRuleMin, configuredMin);\n }, [config?.minBundleSize, config?.rules]);\n\n const setQuantity = useCallback((merchandiseId: string, quantity: number) => {\n if (cartSyncing) return;\n if (!eligibleVariantIdsSet.has(merchandiseId)) {\n if (!loading) return;\n }\n\n const variantLimit = variantSelectionLimitById.get(merchandiseId) ?? (loading ? Number.POSITIVE_INFINITY : 0);\n const q = clampToVariantLimit(quantity, variantLimit);\n setSelectionsState((prev) => {\n const prevQty = prev.selections[merchandiseId] ?? 0;\n const requestedDelta = q - prevQty;\n const currentBundleSize = Object.values(prev.selections).reduce((sum, value) => sum + (value || 0), 0);\n const variantRemaining =\n Number.isFinite(variantLimit)\n ? Math.max(0, Math.floor(variantLimit) - prevQty)\n : requestedDelta;\n const delta =\n requestedDelta > 0\n ? Math.min(\n requestedDelta,\n Math.max(0, maxBundleSize - currentBundleSize),\n variantRemaining,\n )\n : requestedDelta;\n\n const nextQty = prevQty + delta;\n\n let nextSelections: BundleSelectionState;\n if (nextQty <= 0) {\n const rest = { ...prev.selections };\n delete rest[merchandiseId];\n nextSelections = rest;\n } else if (prevQty === nextQty) {\n nextSelections = prev.selections;\n } else {\n nextSelections = { ...prev.selections, [merchandiseId]: nextQty };\n }\n\n let nextOrder = prev.order;\n if (delta > 0) {\n nextOrder = [...prev.order, ...Array.from({ length: delta }, () => merchandiseId)];\n } else if (delta < 0) {\n let remainingToRemove = -delta;\n const keptReversed: string[] = [];\n for (let i = prev.order.length - 1; i >= 0; i--) {\n const id = prev.order[i];\n if (id === merchandiseId && remainingToRemove > 0) {\n remainingToRemove--;\n continue;\n }\n keptReversed.push(id);\n }\n keptReversed.reverse();\n nextOrder = keptReversed;\n }\n\n if (nextSelections === prev.selections && nextOrder === prev.order) return prev;\n\n const prevBundleSize = currentBundleSize;\n const nextBundleSize = Object.values(nextSelections).reduce((sum, value) => sum + (value || 0), 0);\n\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const basePayload = {\n eventType: \"VARIANT_SELECTION_CHANGED\" as const,\n shop,\n anonymousUserId,\n before: { ...prev.selections },\n after: { ...nextSelections },\n timestamp: new Date().toISOString(),\n };\n trackEvent(analyticsEndpoint, shop, basePayload);\n\n if (prevBundleSize === 0 && nextBundleSize >= 1) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_started\",\n });\n }\n if (prevBundleSize < minRequired && nextBundleSize >= minRequired) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_completed\",\n });\n }\n } catch {\n // Analytics should not break functionality.\n }\n }\n\n return { selections: nextSelections, order: nextOrder };\n });\n }, [analyticsEndpoint, cartSyncing, eligibleVariantIdsSet, loading, maxBundleSize, minRequired, shop, variantSelectionLimitById]);\n\n useEffect(() => {\n if (loading) return;\n setSelectionsState((prev) => {\n const nextSelectionsEntries = Object.entries(prev.selections)\n .map(([id, quantity]) => {\n if (!eligibleVariantIdsSet.has(id)) return null;\n const limit = variantSelectionLimitById.get(id) ?? 0;\n const nextQuantity = clampToVariantLimit(quantity, limit);\n if (nextQuantity <= 0) return null;\n return [id, nextQuantity] as const;\n })\n .filter(Boolean) as Array<readonly [string, number]>;\n const nextSelections = Object.fromEntries(nextSelectionsEntries) as BundleSelectionState;\n const remainingById = new Map(nextSelectionsEntries);\n const nextOrder = prev.order.filter((id) => {\n const remaining = remainingById.get(id) ?? 0;\n if (remaining <= 0) return false;\n remainingById.set(id, remaining - 1);\n return true;\n });\n\n if (\n nextOrder.length === prev.order.length &&\n nextSelectionsEntries.length === Object.keys(prev.selections).length &&\n nextSelectionsEntries.every(([id, quantity]) => prev.selections[id] === quantity)\n ) {\n return prev;\n }\n\n return { selections: nextSelections, order: nextOrder };\n });\n }, [eligibleVariantIdsSet, loading, variantSelectionLimitById]);\n\n useEffect(() => {\n setSelectionsState({ selections: {}, order: [] });\n }, [currentHandle]);\n\n const clearSelections = useCallback(() => setSelectionsState({ selections: {}, order: [] }), []);\n const syncCartQuantities = useCallback(async () => {\n await refreshCartQuantities();\n }, [refreshCartQuantities]);\n const getVariantMaxSelectableQuantity = useCallback((merchandiseId: string) => {\n const limit = variantSelectionLimitById.get(merchandiseId);\n if (limit == null || !Number.isFinite(limit)) return null;\n return Math.max(0, Math.floor(limit));\n }, [variantSelectionLimitById]);\n const selections = selectionsState.selections;\n const selectionOrder = selectionsState.order;\n\n const bundleSize = useMemo(() => Object.values(selections).reduce((sum, quantity) => sum + (quantity || 0), 0), [selections]);\n\n const canSubmit = useMemo(() => {\n if (loading || cartSyncing || submitting) return false;\n if (error) return false;\n if (!config?.isActive) return false;\n if (bundleSize < minRequired) return false;\n return true;\n }, [bundleSize, cartSyncing, config?.isActive, error, loading, minRequired, submitting]);\n\n const performCartAddition = useCallback(async (options?: { onComplete?: () => void; checkout?: boolean }) => {\n if (!canSubmit || !config) return;\n\n const bundleId = safeRandomUUID();\n const bundleTitle = (config.title ?? \"\").trim().slice(0, 255);\n const latestCartQuantities = await refreshCartQuantities();\n const effectiveLimitById = new Map(\n eligibleVariants.map((variant) => {\n const baseLimit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(baseLimit)) return [variant.id, baseLimit] as const;\n const inCart = clampQty((latestCartQuantities ?? cartQuantitiesByMerchandiseId)[variant.id] ?? 0);\n return [variant.id, Math.max(0, Math.floor(baseLimit) - inCart)] as const;\n }),\n );\n const lines = Object.entries(selections)\n .map(([merchandiseId, quantity]) => ({\n merchandiseId,\n quantity: clampToVariantLimit(quantity, effectiveLimitById.get(merchandiseId) ?? 0),\n }))\n .filter((line) => line.quantity > 0)\n .filter((line) => eligibleVariantIdsSet.has(line.merchandiseId))\n .map((line) => ({\n merchandiseId: line.merchandiseId,\n quantity: line.quantity,\n attributes: [\n { key: BundleLineAttributeKeys.bundleId, value: bundleId },\n { key: BundleLineAttributeKeys.bundleConfig, value: currentHandle },\n { key: BundleLineAttributeKeys.bundleSource, value: \"bundle_builder\" },\n ...(bundleTitle ? [{ key: BundleLineAttributeKeys.bundleTitle, value: bundleTitle }] : []),\n ],\n }));\n\n if (!lines.length) return;\n\n const byId = new Map(eligibleVariants.map((variant) => [variant.id, variant] as const));\n let grossPrice = 0;\n for (const line of lines) {\n const q = line.quantity ?? 0;\n if (q <= 0) continue;\n const variant = byId.get(line.merchandiseId);\n const price = Number(variant?.price);\n if (!Number.isFinite(price)) continue;\n grossPrice += price * q;\n }\n grossPrice = Math.round(grossPrice * 100) / 100;\n\n const rulesSorted = [...(config.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n let appliedRule: (typeof rulesSorted)[number] | null = null;\n for (const rule of rulesSorted) {\n if (bundleSize >= rule.minBundleSize) appliedRule = rule;\n }\n\n const appliedDiscountPercent = appliedRule\n ? (() => {\n const pct = Number.parseFloat(appliedRule!.discountPercent);\n return Number.isFinite(pct) && pct > 0 ? pct : null;\n })()\n : null;\n\n const discountedPrice = appliedDiscountPercent\n ? Math.round(grossPrice * (1 - appliedDiscountPercent / 100) * 100) / 100\n : grossPrice;\n const discountedAmount = grossPrice - discountedPrice;\n const productVariantIds = lines.map((line) => line.merchandiseId);\n const discountThresholdIdentifier = appliedRule?.handle ?? \"\";\n const discountLabel = appliedRule?.label?.trim() || \"\";\n\n setSubmitting(true);\n try {\n if (options?.checkout) {\n await cartAdapter.linesAddForCheckout(lines);\n } else {\n await cartAdapter.linesAdd(lines);\n }\n\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const isCheckout = !!options?.checkout;\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"BUNDLE_ADDED_TO_BASKET\",\n shop,\n anonymousUserId,\n bundleId,\n productVariantIds,\n grossPrice,\n discountedPrice,\n currency: currencyCode ?? undefined,\n discountThresholdIdentifier,\n discountLabel,\n discountPercentage: appliedDiscountPercent,\n discountedAmount,\n timestamp: new Date().toISOString(),\n checkout: isCheckout,\n mixpanelEvent: isCheckout ? \"checkout_started_with_bundle\" : \"bundle_added_to_cart\",\n });\n } catch {\n // Analytics should not break functionality.\n }\n }\n\n clearSelections();\n close();\n void refreshCartQuantities();\n options?.onComplete?.();\n setError(null);\n } catch (addError) {\n const rawMessage = addError instanceof Error ? addError.message : \"\";\n const isStockError = /stock|sold out|inventory|insufficient|available|422/i.test(rawMessage);\n setError(\n isStockError\n ? \"Some bundle items are no longer available in the requested quantity. Please review your selection.\"\n : \"We couldn't add this bundle right now. Please try again.\",\n );\n void refreshCartQuantities();\n } finally {\n setSubmitting(false);\n }\n }, [\n analyticsEndpoint,\n bundleSize,\n canSubmit,\n cartAdapter,\n clearSelections,\n close,\n config,\n currencyCode,\n cartQuantitiesByMerchandiseId,\n currentHandle,\n eligibleVariantIdsSet,\n eligibleVariants,\n refreshCartQuantities,\n selections,\n shop,\n ]);\n\n const submit = useCallback(async () => {\n await performCartAddition({\n onComplete: () => {\n cartAdapter.openCartUI?.();\n },\n });\n }, [cartAdapter, performCartAddition]);\n\n const submitAndCheckout = useCallback(async () => {\n await performCartAddition({\n checkout: true,\n onComplete: () => {\n cartAdapter.navigateToCheckout?.();\n },\n });\n }, [cartAdapter, performCartAddition]);\n\n const value: BundleBuilderContextValue = useMemo(() => ({\n isOpen,\n open,\n openForHandle,\n close,\n toggle,\n currentHandle,\n setConfigHandle,\n loadHandle,\n syncCartQuantities,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n clearSelections,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n }), [\n bundleSize,\n canSubmit,\n clearSelections,\n close,\n config,\n currencyCode,\n currentHandle,\n eligibleVariants,\n error,\n isOpen,\n loading,\n minRequired,\n open,\n openForHandle,\n selectionOrder,\n selections,\n setConfigHandle,\n loadHandle,\n syncCartQuantities,\n getVariantMaxSelectableQuantity,\n setQuantity,\n submit,\n submitAndCheckout,\n submitting,\n toggle,\n ]);\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 } = useBundleBuilder();\n return (\n <button\n type=\"button\"\n onClick={toggle}\n className={[styles.button, props.className].filter(Boolean).join(\" \")}\n >\n {props.children ?? \"Build a bundle\"}\n </button>\n );\n}\n\n","'use strict';\n\n// t: current time, b: beginning value, _c: final value, d: total duration\nvar tweenFunctions = {\n linear: function(t, b, _c, d) {\n var c = _c - b;\n return c * t / d + b;\n },\n easeInQuad: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t + b;\n },\n easeOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (t /= d) * (t - 2) + b;\n },\n easeInOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t + b;\n } else {\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n }\n },\n easeInCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t + b;\n },\n easeOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t + 1) + b;\n },\n easeInOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n },\n easeInQuart: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t + b;\n },\n easeOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n },\n easeInOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t + b;\n } else {\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n },\n easeInQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t * t + b;\n },\n easeOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n },\n easeInOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n },\n easeInSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n },\n easeOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n },\n easeInOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n },\n easeInExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n },\n easeOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n },\n easeInOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n } else {\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n },\n easeInCirc: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n },\n easeOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n },\n easeInOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n } else {\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n },\n easeInElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n },\n easeOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n },\n easeInOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d / 2) === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n } else {\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b;\n }\n },\n easeInBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n },\n easeOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n },\n easeInOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n } else {\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }\n },\n easeInBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n v = tweenFunctions.easeOutBounce(d - t, 0, c, d);\n return c - v + b;\n },\n easeOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n },\n easeInOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n if (t < d / 2) {\n v = tweenFunctions.easeInBounce(t * 2, 0, c, d);\n return v * 0.5 + b;\n } else {\n v = tweenFunctions.easeOutBounce(t * 2 - d, 0, c, d);\n return v * 0.5 + c * 0.5 + b;\n }\n }\n};\n\nmodule.exports = tweenFunctions;\n","import { jsx } from 'react/jsx-runtime';\nimport React from 'react';\nimport * as tweens from 'tween-functions';\n\nfunction degreesToRads(degrees) {\n return (degrees * Math.PI) / 180;\n}\nfunction randomRange(min, max) {\n return min + Math.random() * (max - min);\n}\nfunction randomInt(min, max) {\n return Math.floor(min + Math.random() * (max - min + 1));\n}\n\nvar ParticleShape;\n(function (ParticleShape) {\n ParticleShape[ParticleShape[\"Circle\"] = 0] = \"Circle\";\n ParticleShape[ParticleShape[\"Square\"] = 1] = \"Square\";\n ParticleShape[ParticleShape[\"Strip\"] = 2] = \"Strip\";\n})(ParticleShape || (ParticleShape = {}));\nvar RotationDirection;\n(function (RotationDirection) {\n RotationDirection[RotationDirection[\"Positive\"] = 1] = \"Positive\";\n RotationDirection[RotationDirection[\"Negative\"] = -1] = \"Negative\";\n})(RotationDirection || (RotationDirection = {}));\nconst DEFAULT_FRAME_TIME = 1000 / 60;\nclass Particle {\n constructor(context, getOptions, x, y) {\n this.getOptions = getOptions;\n const { colors, initialVelocityX, initialVelocityY } = this.getOptions();\n this.context = context;\n this.x = x;\n this.y = y;\n this.w = randomRange(5, 20);\n this.h = randomRange(5, 20);\n this.radius = randomRange(5, 10);\n this.vx =\n typeof initialVelocityX === 'number'\n ? randomRange(-initialVelocityX, initialVelocityX)\n : randomRange(initialVelocityX.min, initialVelocityX.max);\n this.vy =\n typeof initialVelocityY === 'number'\n ? randomRange(-initialVelocityY, 0)\n : randomRange(initialVelocityY.min, initialVelocityY.max);\n this.shape = randomInt(0, 2);\n this.angle = degreesToRads(randomRange(0, 360));\n this.angularSpin = randomRange(-0.2, 0.2);\n this.color = colors[Math.floor(Math.random() * colors.length)];\n this.rotateY = randomRange(0, 1);\n this.rotationDirection = randomRange(0, 1)\n ? RotationDirection.Positive\n : RotationDirection.Negative;\n }\n update(elapsed) {\n const { gravity, wind, friction, opacity, drawShape } = this.getOptions();\n const frameTimeMultiplier = elapsed / DEFAULT_FRAME_TIME;\n this.x += this.vx * frameTimeMultiplier;\n this.y += this.vy * frameTimeMultiplier;\n this.vy += gravity * frameTimeMultiplier;\n this.vx += wind * frameTimeMultiplier;\n this.vx *= friction ** frameTimeMultiplier;\n this.vy *= friction ** frameTimeMultiplier;\n if (this.rotateY >= 1 &&\n this.rotationDirection === RotationDirection.Positive) {\n this.rotationDirection = RotationDirection.Negative;\n }\n else if (this.rotateY <= -1 &&\n this.rotationDirection === RotationDirection.Negative) {\n this.rotationDirection = RotationDirection.Positive;\n }\n const rotateDelta = 0.1 * this.rotationDirection * frameTimeMultiplier;\n this.rotateY += rotateDelta;\n this.angle += this.angularSpin;\n this.context.save();\n this.context.translate(this.x, this.y);\n this.context.rotate(this.angle);\n this.context.scale(1, this.rotateY);\n this.context.rotate(this.angle);\n this.context.beginPath();\n this.context.fillStyle = this.color;\n this.context.strokeStyle = this.color;\n this.context.globalAlpha = opacity;\n this.context.lineCap = 'round';\n this.context.lineWidth = 2;\n if (drawShape && typeof drawShape === 'function') {\n drawShape.call(this, this.context);\n }\n else {\n switch (this.shape) {\n case ParticleShape.Circle: {\n this.context.beginPath();\n this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);\n this.context.fill();\n break;\n }\n case ParticleShape.Square: {\n this.context.fillRect(-this.w / 2, -this.h / 2, this.w, this.h);\n break;\n }\n case ParticleShape.Strip: {\n this.context.fillRect(-this.w / 6, -this.h / 2, this.w / 3, this.h);\n break;\n }\n }\n }\n this.context.closePath();\n this.context.restore();\n }\n}\n\nclass ParticleGenerator {\n constructor(canvas, getOptions) {\n this.x = 0;\n this.y = 0;\n this.w = 0;\n this.h = 0;\n this.lastNumberOfPieces = 0;\n this.tweenProgress = 0;\n this.tweenFrom = 0;\n this.particles = [];\n this.particlesGenerated = 0;\n this.removeParticleAt = (i) => {\n this.particles.splice(i, 1);\n };\n this.getParticle = () => {\n const newParticleX = randomRange(this.x, this.w + this.x);\n const newParticleY = randomRange(this.y, this.h + this.y);\n return new Particle(this.context, this.getOptions, newParticleX, newParticleY);\n };\n this.animate = (elapsed) => {\n const { canvas, context, particlesGenerated, lastNumberOfPieces } = this;\n const { run, recycle, numberOfPieces, debug, tweenFunction, tweenDuration, } = this.getOptions();\n if (!run) {\n return false;\n }\n const nP = this.particles.length;\n const activeCount = recycle ? nP : particlesGenerated;\n // Initial population\n if (activeCount < numberOfPieces) {\n // Use the numberOfPieces prop as a key to reset the easing timing\n if (lastNumberOfPieces !== numberOfPieces) {\n this.tweenProgress = 0;\n this.tweenFrom = activeCount;\n this.lastNumberOfPieces = numberOfPieces;\n }\n // Clamp tweenProgress between 0 and tweenDuration\n this.tweenProgress = Math.min(tweenDuration, Math.max(0, this.tweenProgress + elapsed));\n const tweenedVal = tweenFunction(this.tweenProgress, this.tweenFrom, numberOfPieces, tweenDuration);\n const numToAdd = Math.round(tweenedVal - activeCount);\n for (let i = 0; i < numToAdd; i++) {\n this.particles.push(this.getParticle());\n }\n this.particlesGenerated += numToAdd;\n }\n if (debug) {\n // Draw debug text\n context.font = '12px sans-serif';\n context.fillStyle = '#333';\n context.textAlign = 'right';\n context.fillText(`Particles: ${nP}`, canvas.width - 10, canvas.height - 20);\n }\n // Maintain the population, iterating backwards to prevent issues when removing particles\n for (let i = this.particles.length - 1; i >= 0; i--) {\n const p = this.particles[i];\n // Update each particle's position\n p.update(elapsed);\n // Prune the off-canvas particles\n if (p.y > canvas.height ||\n p.y < -100 ||\n p.x > canvas.width + 100 ||\n p.x < -100) {\n if (recycle && activeCount <= numberOfPieces) {\n // Replace the particle with a brand new one\n this.particles[i] = this.getParticle();\n }\n else {\n this.removeParticleAt(i);\n }\n }\n }\n return nP > 0 || activeCount < numberOfPieces;\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.getOptions = getOptions;\n }\n}\n\nconst confettiDefaults = {\n width: typeof window !== 'undefined' ? window.innerWidth : 300,\n height: typeof window !== 'undefined' ? window.innerHeight : 200,\n numberOfPieces: 200,\n friction: 0.99,\n wind: 0,\n gravity: 0.1,\n initialVelocityX: 4,\n initialVelocityY: 10,\n colors: [\n '#f44336',\n '#e91e63',\n '#9c27b0',\n '#673ab7',\n '#3f51b5',\n '#2196f3',\n '#03a9f4',\n '#00bcd4',\n '#009688',\n '#4CAF50',\n '#8BC34A',\n '#CDDC39',\n '#FFEB3B',\n '#FFC107',\n '#FF9800',\n '#FF5722',\n '#795548',\n ],\n opacity: 1.0,\n debug: false,\n tweenFunction: tweens.easeInOutQuad,\n tweenDuration: 5000,\n recycle: true,\n run: true,\n};\nclass Confetti {\n constructor(canvas, opts) {\n this.lastFrameTime = 0;\n this.setOptionsWithDefaults = (opts) => {\n const computedConfettiDefaults = {\n confettiSource: {\n x: 0,\n y: 0,\n w: this.canvas.width,\n h: 0,\n },\n };\n this._options = {\n ...computedConfettiDefaults,\n ...confettiDefaults,\n ...opts,\n };\n Object.assign(this, opts.confettiSource);\n };\n this.update = (timestamp = 0) => {\n const { options: { run, onConfettiComplete, frameRate }, canvas, context, } = this;\n // Cap elapsed time to 50ms to prevent large time steps\n const elapsed = Math.min(timestamp - this.lastFrameTime, 50);\n // Throttle the frame rate if set\n if (frameRate && elapsed < 1000 / frameRate) {\n this.rafId = requestAnimationFrame(this.update);\n return;\n }\n this.lastFrameTime = timestamp - (frameRate ? elapsed % frameRate : 0);\n if (run) {\n context.fillStyle = 'white';\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n if (this.generator.animate(elapsed)) {\n this.rafId = requestAnimationFrame(this.update);\n }\n else {\n if (onConfettiComplete &&\n typeof onConfettiComplete === 'function' &&\n this.generator.particlesGenerated > 0) {\n onConfettiComplete.call(this, this);\n }\n this._options.run = false;\n }\n };\n this.reset = () => {\n if (this.generator && this.generator.particlesGenerated > 0) {\n this.generator.particlesGenerated = 0;\n this.generator.particles = [];\n this.generator.lastNumberOfPieces = 0;\n }\n };\n this.stop = () => {\n this.options = { run: false };\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = undefined;\n }\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.generator = new ParticleGenerator(this.canvas, () => this.options);\n this.options = opts;\n this.update();\n }\n get options() {\n return this._options;\n }\n set options(opts) {\n const lastRunState = this._options?.run;\n const lastRecycleState = this._options?.recycle;\n this.setOptionsWithDefaults(opts);\n if (this.generator) {\n Object.assign(this.generator, this.options.confettiSource);\n if (typeof opts.recycle === 'boolean' &&\n opts.recycle &&\n lastRecycleState === false) {\n this.generator.lastNumberOfPieces = this.generator.particles.length;\n }\n }\n if (typeof opts.run === 'boolean' && opts.run && lastRunState === false) {\n this.update();\n }\n }\n}\n\nconst ref = React.createRef();\nclass ReactConfettiInternal extends React.Component {\n constructor(props) {\n super(props);\n this.canvas = React.createRef();\n this.canvas = props.canvasRef || ref;\n }\n componentDidMount() {\n if (this.canvas.current) {\n const opts = extractCanvasProps(this.props)[0];\n this.confetti = new Confetti(this.canvas.current, opts);\n }\n }\n componentDidUpdate() {\n const confettiOptions = extractCanvasProps(this.props)[0];\n if (this.confetti) {\n this.confetti.options = confettiOptions;\n }\n }\n componentWillUnmount() {\n if (this.confetti) {\n this.confetti.stop();\n }\n this.confetti = undefined;\n }\n render() {\n const [confettiOptions, passedProps] = extractCanvasProps(this.props);\n const canvasStyles = {\n zIndex: 2,\n position: 'absolute',\n pointerEvents: 'none',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n ...passedProps.style,\n };\n return (jsx(\"canvas\", { width: confettiOptions.width, height: confettiOptions.height, ref: this.canvas, ...passedProps, style: canvasStyles }));\n }\n}\nReactConfettiInternal.defaultProps = {\n ...confettiDefaults,\n};\nReactConfettiInternal.displayName = 'ReactConfetti';\nfunction extractCanvasProps(props) {\n const confettiOptions = {};\n const refs = {};\n const rest = {};\n const confettiOptionKeys = [\n ...Object.keys(confettiDefaults),\n 'confettiSource',\n 'drawShape',\n 'onConfettiComplete',\n 'frameRate',\n ];\n const refProps = ['canvasRef'];\n for (const prop in props) {\n const val = props[prop];\n if (confettiOptionKeys.includes(prop)) {\n confettiOptions[prop] = val;\n }\n else if (refProps.includes(prop)) {\n refProps[prop] = val;\n }\n else {\n rest[prop] = val;\n }\n }\n return [confettiOptions, rest, refs];\n}\nconst ReactConfetti = React.forwardRef((props, ref) => jsx(ReactConfettiInternal, { canvasRef: ref, ...props }));\n\nexport { ReactConfetti as default };\n//# sourceMappingURL=react-confetti.mjs.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport Confetti from \"react-confetti\";\nimport { Link, Search } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleBuilderDrawer.module.css\";\n\nexport type BundleBuilderDrawerProps = {\n className?: string;\n};\n\nexport function BundleBuilderDrawer(props: BundleBuilderDrawerProps) {\n const {\n isOpen,\n close,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n } = useBundleBuilder();\n\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const footerRef = useRef<HTMLElement | null>(null);\n const celebrationChipRef = useRef<HTMLDivElement | null>(null);\n\n const [windowSize, setWindowSize] = useState<{ width: number; height: number }>(() => {\n if (typeof window === \"undefined\") return { width: 0, height: 0 };\n return { width: window.innerWidth, height: window.innerHeight };\n });\n\n const [confettiKey, setConfettiKey] = useState(0);\n const [confettiSource, setConfettiSource] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n const [isConfettiActive, setIsConfettiActive] = useState(false);\n const confettiTimerRef = useRef<number | null>(null);\n const prevBundleSizeForConfettiRef = useRef<number>(bundleSize);\n const confettiSettleMs = 7000;\n\n const [celebrationKey, setCelebrationKey] = useState(0);\n const [celebrationText, setCelebrationText] = useState<string | null>(null);\n const [isCelebrationActive, setIsCelebrationActive] = useState(false);\n const celebrationTimerRef = useRef<number | null>(null);\n const celebrationDurationMs = 2800;\n\n const DEFAULT_CONFETTI_COLORS = [\n \"#2563eb\",\n \"#3b82f6\",\n \"#60a5fa\",\n \"#93c5fd\",\n \"#bae6fd\",\n \"#e0f2fe\",\n ] as const;\n\n const confettiColors = useMemo(() => {\n const c = config?.styleSettings?.confettiColors;\n if (Array.isArray(c) && c.length >= 6) {\n return c.slice(0, 6).map((s, i) =>\n typeof s === \"string\" && s.trim() ? s : DEFAULT_CONFETTI_COLORS[i],\n );\n }\n return [...DEFAULT_CONFETTI_COLORS];\n }, [config?.styleSettings?.confettiColors]);\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" · \");\n };\n\n const getVariantPrimaryName = (v: (typeof eligibleVariants)[number]) => {\n return v.product?.title ?? v.displayName ?? v.title;\n };\n\n const getVariantA11yLabel = (v: (typeof eligibleVariants)[number]) => {\n const name = getVariantPrimaryName(v);\n const opts = formatVariantOptions(v.selectedOptions);\n return [name, opts].filter(Boolean).join(\" — \");\n };\n\n const [isMounted, setIsMounted] = useState(isOpen);\n const closeTimerRef = useRef<number | null>(null);\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(undefined, { style: \"currency\", currency: currencyCode }).format(n);\n } catch {\n // ignore and fall through\n }\n }\n\n return `$${n.toFixed(2)}`;\n };\n\n const title = config?.title?.trim() || \"Build your bundle\";\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n\n const sorted = useMemo(() => {\n return [...eligibleVariants].sort((a, b) => a.displayName.localeCompare(b.displayName));\n }, [eligibleVariants]);\n\n const filteredVariants = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n if (!q) return sorted;\n\n const tokens = q.split(/\\s+/).filter(Boolean);\n const matches = (v: (typeof sorted)[number]) => {\n const parts: string[] = [];\n parts.push(v.displayName);\n if (v.product?.title) parts.push(v.product.title);\n for (const o of v.selectedOptions ?? []) {\n parts.push(o.name);\n parts.push(o.value);\n }\n const haystack = parts.join(\" \").toLowerCase();\n return tokens.every((t) => haystack.includes(t));\n };\n\n return sorted.filter(matches);\n }, [searchQuery, sorted]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n // Keep cents stable for display.\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n // Slot index (0-based) => rule that becomes active at that slot.\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const slotCount = useMemo(() => {\n // Placeholders show until highest tier; if user adds more, extend (scroll).\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n // Track animation state for dual button split animation\n const [isDualButtonAnimationLoaded, setIsDualButtonAnimationLoaded] = useState(true);\n const prevItemsRemainingRef = useRef(itemsRemaining);\n\n // Trigger animation when itemsRemaining changes from > 0 to 0 in add_to_cart_checkout mode\n useEffect(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n const wasPositive = prevItemsRemainingRef.current > 0;\n const isNowZero = itemsRemaining === 0;\n\n if (wasPositive && isNowZero) {\n // Trigger animation\n setIsDualButtonAnimationLoaded(false);\n } else {\n // Reset animation\n setIsDualButtonAnimationLoaded(true);\n }\n }\n prevItemsRemainingRef.current = itemsRemaining;\n }, [itemsRemaining, config?.ctaButtonMode]);\n\n const panelRef = useRef<HTMLDivElement | null>(null);\n const bodyRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = bodyRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\"${variantId}\"]`);\n if (!row) return;\n\n const c = container.getBoundingClientRect();\n const r = row.getBoundingClientRect();\n const padding = 8;\n const isFullyVisible = r.top >= c.top + padding && r.bottom <= c.bottom - padding;\n if (isFullyVisible) return;\n\n const maxTop = Math.max(0, container.scrollHeight - container.clientHeight);\n const rowCenterOffset = (r.top - c.top) + r.height / 2;\n const targetTop = container.scrollTop + rowCenterOffset - container.clientHeight / 2;\n const nextTop = Math.min(maxTop, Math.max(0, targetTop));\n container.scrollTo({ top: nextTop, behavior: \"smooth\" });\n };\n\n useEffect(() => {\n if (!isOpen) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") close();\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [close, isOpen]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setWindowSize({ width: window.innerWidth, height: window.innerHeight });\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n useEffect(() => {\n if (closeTimerRef.current != null) {\n window.clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n if (isOpen) {\n setIsMounted(true);\n return;\n }\n\n // Keep mounted long enough to play exit animation.\n closeTimerRef.current = window.setTimeout(() => {\n setIsMounted(false);\n closeTimerRef.current = null;\n }, 220);\n }, [isOpen]);\n\n useEffect(() => {\n return () => {\n if (closeTimerRef.current != null) window.clearTimeout(closeTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isSearchOpen) return;\n const raf = requestAnimationFrame(() => searchInputRef.current?.focus());\n return () => cancelAnimationFrame(raf);\n }, [isOpen, isSearchOpen]);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n\n // When hitting a threshold, try to reveal the NEXT threshold (aligned right) if it's off-screen to the right.\n // If no remaining thresholds, scroll the newest added item into view.\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n // Only scroll rightward when the target is off-screen to the right.\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const prev = prevBundleSizeForConfettiRef.current;\n prevBundleSizeForConfettiRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n // Trigger when crossing an exact configured threshold (e.g. 2 items, 3 items, etc.).\n const hitRule = rulesSorted.find((r) => r.minBundleSize === bundleSize);\n if (!hitRule) return;\n\n // Celebration chip (centered)\n setCelebrationText(`You received a ${formatPercent0dp(hitRule.discountPercent)}% discount!`);\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=\"Bundle builder\"\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 ? \"Search (expanded)\" : \"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=\"Search\"\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=\"Clear search\"\n >\n 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=\"Close\">\n ×\n </button>\n </header>\n\n <div className={styles.body} ref={bodyRef}>\n {loading ? <p className={styles.muted}>Loading…</p> : null}\n {error ? <p className={styles.error}>{error}</p> : null}\n\n <div className={styles.variants}>\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 ? \"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={`${variantA11y} is sold out`}>\n Sold<br />Out\n </span>\n </div>\n ) : qty <= 0 && normalizedVariantSelectionLimit <= 0 ? (\n <div className={styles.stockLimitContainer}>\n <span className={styles.stockLimitNotice} aria-label={`${variantA11y} max available selected`}>\n Max Added To Cart\n </span>\n </div>\n ) : qty <= 0 ? (\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, 1)}\n disabled={submitting || !canIncreaseQuantity}\n className={styles.addToBundleButton}\n aria-label={stockStatusLabel ? `${variantA11y} ${stockStatusLabel.toLowerCase()}` : `Add ${variantA11y} to bundle`}\n >\n Add\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={`Decrease ${variantA11y}`}\n >\n −\n </button>\n <span className={styles.qtyValue} aria-label={`Quantity ${qty}`}>\n {qty}\n </span>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty + 1)}\n disabled={submitting || !canIncreaseQuantity}\n className={styles.qtyButton}\n aria-label={stockStatusLabel ? `${variantA11y} ${stockStatusLabel.toLowerCase()}` : `Increase ${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 </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 ? `${threshold.discountPercent}% off` : null;\n\n const titleText = isFilled ? variant!.displayName : `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}. Unlocks ${discountText}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • Unlocks ${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=\"Totals\">\n {appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>\n {appliedDiscountPercent}% Discount\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 ? \"Adding…\" : `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}`}\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 ? \"Adding…\" : \"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 ? \"Processing…\" : \"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 ? \"Processing…\" : itemsRemaining > 0 ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}` : \"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 ? \"Adding…\" : itemsRemaining > 0 ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}` : \"Add to Basket\"}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n powered by <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\"> BestBundles</a>\n </div>\n </footer>\n </aside>\n </div>\n );\n}\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport { Plus, Trash2 } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleBuilderPanel.module.css\";\n\nexport type BundleBuilderPanelProps = {\n className?: string;\n showRules?: boolean;\n showVariants?: boolean;\n};\n\nexport function BundleBuilderPanel(props: BundleBuilderPanelProps) {\n const {\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n } = useBundleBuilder();\n\n const {\n className,\n showRules = true,\n showVariants = true,\n } = props;\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" • \");\n };\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(undefined, { style: \"currency\", currency: currencyCode }).format(n);\n } catch {\n // ignore and fall through\n }\n }\n return `$${n.toFixed(2)}`;\n };\n\n const sortedVariants = useMemo(() => {\n return [...eligibleVariants].sort((a, b) => a.displayName.localeCompare(b.displayName));\n }, [eligibleVariants]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const title = config?.title?.trim() || \"Build your bundle\";\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}>Loading…</div> : null}\n {error ? <div className={styles.error}>{error}</div> : null}\n {!loading && config && !config.isActive ? (\n <div className={styles.inactive}>Bundles are not active.</div>\n ) : 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 ? `${formatPercent0dp(ruleForLine.discountPercent)}% off` : 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}>Select items</div>\n <div className={styles.variants}>\n <ul className={styles.variantList}>\n {sortedVariants.map((variant) => {\n const qty = selections[variant.id] ?? 0;\n const options = formatVariantOptions(variant.selectedOptions);\n const isUnavailable = variant.availableForSale === false;\n const variantSelectionLimit = getVariantMaxSelectableQuantity(variant.id);\n const normalizedVariantSelectionLimit = variantSelectionLimit == null\n ? Number.POSITIVE_INFINITY\n : variantSelectionLimit;\n const isAtVariantStockLimit = qty >= normalizedVariantSelectionLimit;\n const canIncreaseQuantity = !isUnavailable && !isAtMaxBundleSize && !isAtVariantStockLimit;\n const isClickable = canIncreaseQuantity;\n const stockStatusLabel = !isUnavailable && isAtVariantStockLimit ? \"Max Reached\" : null;\n\n return (\n <li\n key={variant.id}\n className={[\n styles.variantRow,\n isClickable ? styles.variantRowInteractive : null,\n qty > 0 ? styles.variantRowSelected : null,\n isUnavailable ? styles.variantRowSoldOut : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={variant.id}\n role={isClickable ? \"button\" : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onClick={\n isClickable\n ? () => {\n setQuantity(variant.id, qty + 1);\n }\n : undefined\n }\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setQuantity(variant.id, qty + 1);\n scrollVariantRowIntoView(variant.id);\n }\n }\n : undefined\n }\n aria-label={\n isUnavailable\n ? `${variant.displayName} is sold out`\n : stockStatusLabel\n ? `${variant.displayName} ${stockStatusLabel.toLowerCase()}`\n : `Add ${variant.displayName} to bundle`\n }\n >\n <div className={styles.variantMedia}>\n {variant.image?.url ? (\n <img\n src={variant.image.url}\n alt={variant.image.altText ?? variant.displayName}\n width={variant.image.width ?? 64}\n height={variant.image.height ?? 64}\n className={styles.variantImage}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantImageFallback}>Item</div>\n )}\n </div>\n <div className={styles.variantContent}>\n <div className={styles.variantHeader}>\n <div className={styles.variantTitle}>{variant.displayName}</div>\n {options ? <div className={styles.variantMeta}>{options}</div> : null}\n </div>\n <div className={styles.variantFooterRow}>\n <div className={styles.variantPrice}>{formatMoney(variant.price)}</div>\n <div className={styles.variantActions}>\n {isUnavailable ? (\n <div className={styles.soldOut} aria-label={`${variant.displayName} is sold out`}>\n Sold Out\n </div>\n ) : qty <= 0 && normalizedVariantSelectionLimit <= 0 ? (\n <div className={styles.stockLimitNotice} aria-label={`${variant.displayName} max available selected`}>\n Max Added To Cart\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={`Remove ${variant.displayName} from bundle`}\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={`${variant.displayName} quantity ${qty}`}\n onClick={canIncreaseQuantity\n ? (e) => {\n e.stopPropagation();\n setQuantity(variant.id, qty + 1);\n }\n : undefined}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n role={canIncreaseQuantity ? \"button\" : undefined}\n tabIndex={canIncreaseQuantity ? 0 : undefined}\n >\n {qty <= 0 ? (\n <span className={styles.qtyChipPlus} aria-hidden=\"true\">\n <Plus size={18} strokeWidth={1.8} />\n </span>\n ) : (\n <>\n <span className={styles.qtyChipValue}>{qty}</span>\n <button\n type=\"button\"\n className={styles.qtyChipClear}\n aria-label={`Add ${variant.displayName}`}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, qty + 1);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n disabled={!canIncreaseQuantity}\n >\n <Plus size={12} strokeWidth={2} />\n </button>\n </>\n )}\n </div>\n </div>\n {stockStatusLabel ? <div className={styles.stockLimitNotice}>{stockStatusLabel}</div> : null}\n </div>\n )}\n </div>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n </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 ? `${threshold.discountPercent}% off` : null;\n const titleText = isFilled ? variant!.displayName : `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}. Unlocks ${discountText}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • Unlocks ${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=\"Totals\">\n {appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>{appliedDiscountPercent}% Discount</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 ? \"Adding…\" : `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}`}\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 ? \"Adding…\" : \"Add to Basket\"}</span>\n </button>\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.ctaDualRight}>\n <span>{submitting ? \"Processing…\" : \"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 ? \"Processing…\"\n : itemsRemaining > 0\n ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}`\n : \"Checkout\"}\n </button>\n );\n }\n\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? \"Adding…\"\n : itemsRemaining > 0\n ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}`\n : \"Add to Basket\"}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n 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 type { BundleCartAdapter, BundleCartLineAttribute } from \"../types\";\n\nfunction toProperties(attributes?: BundleCartLineAttribute[]) {\n if (!attributes?.length) return undefined;\n return attributes.reduce<Record<string, string>>((acc, attr) => {\n if (attr?.key) acc[attr.key] = attr.value ?? \"\";\n return acc;\n }, {});\n}\n\nfunction normalizeVariantId(merchandiseId: string) {\n const match = /\\/(\\d+)$/.exec(merchandiseId);\n return match ? match[1] : merchandiseId;\n}\n\nfunction toVariantGid(variantId: string | number | null | undefined) {\n if (variantId == null) return null;\n const raw = String(variantId).trim();\n if (!raw) return null;\n if (raw.startsWith(\"gid://shopify/ProductVariant/\")) return raw;\n return `gid://shopify/ProductVariant/${raw}`;\n}\n\nfunction getShopifyTheme() {\n if (typeof window === \"undefined\") return null;\n return (window as Window & {\n Shopify?: { theme?: { schema_name?: string | null; name?: string | null } };\n }).Shopify?.theme ?? null;\n}\n\nfunction isSleekTheme() {\n const theme = getShopifyTheme();\n if (!theme) return false;\n\n if (theme.schema_name === \"Sleek\") return true;\n return /sleek/i.test(theme.name ?? \"\");\n}\n\nfunction hasSleekCartDrawer() {\n if (typeof document === \"undefined\") return false;\n return !!document.querySelector(\"cart-drawer\");\n}\n\nfunction tryOpenSleekCartDrawer() {\n if (!isSleekTheme() || !hasSleekCartDrawer()) return false;\n\n document.dispatchEvent(new CustomEvent(\"cart:refresh\", {\n bubbles: true,\n detail: { open: true },\n }));\n\n return true;\n}\n\n/**\n * Refreshes the page so the theme re-renders with the updated cart.\n * Liquid themes fetch cart state on load, so a full reload guarantees the cart UI\n * (drawer, icon bubble, etc.) shows the correct state after adding bundle items.\n */\nfunction reloadPageForCartUpdate() {\n window.location.reload();\n}\n\nasync function postCartJson(endpoint: string, payload: Record<string, unknown>) {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(text || `Cart request failed: ${res.status}`);\n }\n return res.json().catch(() => null);\n}\n\nasync function getCartJson() {\n const res = await fetch(\"/cart.js\", {\n method: \"GET\",\n cache: \"no-store\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n });\n if (!res.ok) {\n throw new Error(`Cart request failed: ${res.status}`);\n }\n return res.json() as Promise<{ items?: Array<{ id?: number | string | null; quantity?: number | null }> }>;\n}\n\nexport function createLiquidCartAdapter(): BundleCartAdapter {\n return {\n async linesAdd(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesAddForCheckout(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesUpdate(lines) {\n for (const line of lines) {\n await postCartJson(\"/cart/change.js\", {\n id: line.id,\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n });\n }\n },\n async linesRemove(lineIds) {\n for (const id of lineIds) {\n await postCartJson(\"/cart/change.js\", { id, quantity: 0 });\n }\n },\n async getLineQuantitiesByMerchandiseId() {\n const cart = await getCartJson();\n const quantities: Record<string, number> = {};\n for (const item of cart.items ?? []) {\n const merchandiseId = toVariantGid(item.id);\n if (!merchandiseId) continue;\n const quantity = Number(item.quantity ?? 0);\n if (!Number.isFinite(quantity) || quantity <= 0) continue;\n quantities[merchandiseId] = (quantities[merchandiseId] ?? 0) + Math.floor(quantity);\n }\n return quantities;\n },\n openCartUI() {\n if (tryOpenSleekCartDrawer()) return;\n\n // Reload the page so the theme fetches and displays the updated cart.\n window.setTimeout(() => reloadPageForCartUpdate(), 0);\n },\n navigateToCheckout() {\n // Navigate to Shopify checkout page\n window.location.href = \"/checkout\";\n },\n };\n}\n"],"names":["BundleLineAttributeKeys","fetchActiveBundleConfigs","params","url","json","fetchBundleConfig","fetchBundleConfigStatus","getVariantSelectionLimit","variant","quantity","ANONYMOUS_USER_ID_KEY","getOrCreateAnonymousUserId","existing","newId","cryptoAny","trackEvent","analyticsEndpoint","shop","event","response","error","BundleBuilderContext","createContext","BUNDLE_DRAWER_HASH","EMPTY_ELIGIBLE_VARIANTS","normalizeBundleHandle","raw","value","getBundleHashHandle","hash","prefix","STYLE_SETTINGS_TO_CSS_VAR","GOOGLE_FONTS_LINK_ID","fontNameToParam","name","s","injectGoogleFontsLink","styles","_a","body","title","families","href","link","injectStyleVariables","root","key","cssVar","getEffectiveStyleSettings","configSettings","preview","safeRandomUUID","clampQty","n","clampToVariantLimit","limit","normalized","shouldUseActiveConfigPreload","allowDrawerWhenInactive","initialData","BundleProvider","props","apiBaseUrl","cartAdapter","configHandle","configFetcher","activeConfigsFetcher","configStatusFetcher","providedAnalyticsEndpoint","children","normalizedInitialHandle","useActivePreload","isOpen","setIsOpen","useState","submitting","setSubmitting","setError","cartSyncing","setCartSyncing","cartQuantitiesByMerchandiseId","setCartQuantitiesByMerchandiseId","currentHandle","setCurrentHandleState","configCache","setConfigCache","bootstrapLoading","setBootstrapLoading","blockingHandleLoad","setBlockingHandleLoad","statusCheckPending","setStatusCheckPending","pendingOpenHandle","setPendingOpenHandle","selectionsState","setSelectionsState","preloadAbortRef","useRef","handleFetchAbortRef","statusAbortRef","cartSyncSeqRef","currentHandleRef","configCacheRef","bootstrapLoadingRef","openForHandleRef","fetcher","defaultFetchBundleConfig","activePreloadFetcher","statusFetcher","loadCartQuantities","useCallback","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","currencyCode","loading","effective","handlePreviewStyles","win","applyPreviewConfig","previewConfig","previewVariants","maxBundleSize","useMemo","variantSelectionLimitById","baseLimit","inCart","eligibleVariantIdsSet","minRequired","rules","ruleMin","rule","normalizedRuleMin","configuredRaw","configuredMin","setQuantity","merchandiseId","variantLimit","prevQty","requestedDelta","currentBundleSize","sum","variantRemaining","delta","nextQty","nextSelections","rest","nextOrder","remainingToRemove","keptReversed","i","prevBundleSize","nextBundleSize","basePayload","nextSelectionsEntries","nextQuantity","remainingById","remaining","clearSelections","syncCartQuantities","getVariantMaxSelectableQuantity","selections","selectionOrder","bundleSize","canSubmit","performCartAddition","bundleId","bundleTitle","latestCartQuantities","effectiveLimitById","lines","line","byId","grossPrice","price","rulesSorted","a","b","appliedRule","appliedDiscountPercent","pct","discountedPrice","discountedAmount","productVariantIds","discountThresholdIdentifier","discountLabel","isCheckout","addError","rawMessage","isStockError","submit","submitAndCheckout","jsx","useBundleBuilder","ctx","useContext","useBundleBuilderDrawer","BundleButton","tweenFunctions","_c","d","c","p","v","tweenFunctions_1","degreesToRads","degrees","randomRange","min","max","randomInt","ParticleShape","RotationDirection","DEFAULT_FRAME_TIME","Particle","context","getOptions","x","y","colors","initialVelocityX","initialVelocityY","elapsed","gravity","wind","friction","opacity","drawShape","frameTimeMultiplier","rotateDelta","ParticleGenerator","canvas","newParticleX","newParticleY","particlesGenerated","lastNumberOfPieces","run","recycle","numberOfPieces","debug","tweenFunction","tweenDuration","nP","activeCount","tweenedVal","numToAdd","confettiDefaults","tweens.easeInOutQuad","Confetti","opts","computedConfettiDefaults","timestamp","onConfettiComplete","frameRate","lastRunState","lastRecycleState","ref","React","ReactConfettiInternal","extractCanvasProps","confettiOptions","passedProps","canvasStyles","refs","confettiOptionKeys","refProps","prop","val","ReactConfetti","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","iconNode","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","Plus","Search","Trash2","BundleBuilderDrawer","isSearchOpen","setIsSearchOpen","searchQuery","setSearchQuery","searchInputRef","footerRef","celebrationChipRef","windowSize","setWindowSize","confettiKey","setConfettiKey","confettiSource","setConfettiSource","isConfettiActive","setIsConfettiActive","confettiTimerRef","prevBundleSizeForConfettiRef","confettiSettleMs","celebrationKey","setCelebrationKey","celebrationText","setCelebrationText","isCelebrationActive","setIsCelebrationActive","celebrationTimerRef","celebrationDurationMs","DEFAULT_CONFETTI_COLORS","confettiColors","formatPercent0dp","formatVariantOptions","selectedOptions","o","getVariantPrimaryName","getVariantA11yLabel","isMounted","setIsMounted","closeTimerRef","formatMoney","amount","isAtMaxBundleSize","sorted","filteredVariants","tokens","matches","parts","haystack","t","itemsRemaining","best","r","firstRule","hasUnlockedFirstDiscount","subtotal","total","variantId","qty","discountedTotal","maxRuleSize","filledVariants","thresholdByIndex","map","idx","slotCount","isDualButtonAnimationLoaded","setIsDualButtonAnimationLoaded","prevItemsRemainingRef","wasPositive","panelRef","bodyRef","boxSummaryWindowRef","prevBundleSizeRef","scrollVariantRowIntoView","container","row","padding","maxTop","rowCenterOffset","targetTop","nextTop","onKeyDown","e","onResize","raf","hitThreshold","nextThreshold","targetIdx","el","containerRect","deltaRight","maxLeft","nextLeft","hitRule","k","chipEl","rect","panelRect","originX","originY","jsxs","variantPrimaryName","variantOptionText","variantA11y","variantSelectionLimit","normalizedVariantSelectionLimit","isAtVariantStockLimit","canIncreaseQuantity","stockStatusLabel","discountPercentToUse","originalPriceNumber","hasDiscount","discountedPriceNumber","_d","_","threshold","isFilled","isThreshold","showThreshold","discountText","titleText","Fragment","buttonMode","BundleBuilderPanel","showRules","showVariants","sortedVariants","variantsRef","lineIndex","ruleForLine","isUnavailable","isClickable","toProperties","attributes","attr","normalizeVariantId","toVariantGid","getShopifyTheme","isSleekTheme","theme","hasSleekCartDrawer","tryOpenSleekCartDrawer","reloadPageForCartUpdate","postCartJson","endpoint","payload","res","text","getCartJson","createLiquidCartAdapter","items","lineIds","cart","item"],"mappings":"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","x_google_ignoreList":[10,11,12,13,14,15,16,17,18]}
1
+ {"version":3,"file":"index.js","sources":["../src/constants.ts","../src/api/fetchActiveBundleConfigs.ts","../src/api/fetchBundleConfig.ts","../src/api/fetchBundleConfigStatus.ts","../src/utils/stock.ts","../src/utils/analytics.ts","../src/i18n.ts","../src/context/BundleProvider.tsx","../src/hooks/useBundleBuilder.ts","../src/hooks/useBundleBuilderDrawer.ts","../src/components/BundleButton.tsx","../../../node_modules/tween-functions/index.js","../../../node_modules/react-confetti/dist/react-confetti.mjs","../../../node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/lucide-react/dist/esm/icons/plus.js","../../../node_modules/lucide-react/dist/esm/icons/search.js","../../../node_modules/lucide-react/dist/esm/icons/trash-2.js","../src/components/BundleBuilderDrawer.tsx","../src/components/BundleBuilderPanel.tsx","../src/adapters/LiquidAdapter.ts"],"sourcesContent":["export const BundleLineAttributeKeys = {\n bundleId: \"_bundle_id\",\n bundleConfig: \"_bundle_config\",\n bundleSource: \"_bundle_source\",\n bundleTitle: \"_bundle_title\",\n} as const;\n\n","import type { PublicActiveBundleConfigsResponse } from \"../types\";\n\nexport async function fetchActiveBundleConfigs(params: {\n apiBaseUrl: string;\n shop: string;\n signal?: AbortSignal;\n}): Promise<PublicActiveBundleConfigsResponse> {\n const url = new URL(\"/api/public/bundle-configs-active\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicActiveBundleConfigsResponse;\n}\n","import type { PublicBundleConfigResponse } from \"../types\";\n\nexport async function fetchBundleConfig(params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n fresh?: boolean;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigResponse> {\n const url = new URL(\"/api/public/bundle-config\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n if (params.configHandle) {\n url.searchParams.set(\"handle\", params.configHandle);\n }\n if (params.fresh) {\n url.searchParams.set(\"fresh\", \"1\");\n }\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n // The endpoint uses 4xx/5xx for some errors; normalize to {ok:false}.\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigResponse;\n}\n","import type { PublicBundleConfigStatusResponse } from \"../types\";\n\nexport async function fetchBundleConfigStatus(params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigStatusResponse> {\n const url = new URL(\"/api/public/bundle-config-status\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n if (params.configHandle) {\n url.searchParams.set(\"handle\", params.configHandle);\n }\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigStatusResponse;\n}\n","import type { BundleEligibleVariant } from \"../types\";\n\nexport function getVariantSelectionLimit(variant: BundleEligibleVariant | null | undefined) {\n if (!variant || variant.availableForSale === false) return 0;\n if (variant.inventoryPolicy === \"CONTINUE\") return Number.POSITIVE_INFINITY;\n // Untracked inventory can surface as null/0 sellable quantity while still available for sale.\n if (variant.sellableOnlineQuantity == null) return Number.POSITIVE_INFINITY;\n\n const quantity = Number(variant.sellableOnlineQuantity);\n if (!Number.isFinite(quantity)) return Number.POSITIVE_INFINITY;\n if (quantity <= 0 && variant.availableForSale === true) return Number.POSITIVE_INFINITY;\n return Math.max(0, Math.floor(quantity));\n}\n\nexport function isVariantAtStockLimit(\n variant: BundleEligibleVariant | null | undefined,\n quantity: number,\n) {\n const limit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(limit)) return false;\n return Math.max(0, Math.floor(quantity || 0)) >= limit;\n}\n","const ANONYMOUS_USER_ID_KEY = \"bb_anonymous_user_id\";\n\n/**\n * Gets or creates an anonymous user ID stored in localStorage.\n * This ID persists across sessions to attribute events to the same user.\n */\nexport function getOrCreateAnonymousUserId(): string {\n if (typeof window === \"undefined\" || typeof localStorage === \"undefined\") {\n // Fallback for SSR or environments without localStorage\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n try {\n const existing = localStorage.getItem(ANONYMOUS_USER_ID_KEY);\n if (existing && typeof existing === \"string\" && existing.length > 0) {\n return existing;\n }\n\n // Generate new ID\n let newId: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) {\n newId = cryptoAny.randomUUID();\n } else {\n throw new Error(\"crypto.randomUUID not available\");\n }\n } catch {\n // Fallback UUID generation\n newId = `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n localStorage.setItem(ANONYMOUS_USER_ID_KEY, newId);\n return newId;\n } catch {\n // If localStorage fails, generate a temporary ID\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n\nexport type AnalyticsEventType =\n | \"DRAWER_OPENED\"\n | \"DRAWER_CLOSED\"\n | \"VARIANT_SELECTION_CHANGED\"\n | \"BUNDLE_ADDED_TO_BASKET\";\n\n/** Mixpanel event names used for the bundle funnel (backend maps these to Mixpanel). */\nexport type MixpanelBundleEventName =\n | \"bundle_opened\"\n | \"bundle_closed\"\n | \"bundle_started\"\n | \"bundle_completed\"\n | \"bundle_added_to_cart\"\n | \"checkout_started_with_bundle\";\n\nexport type DrawerOpenedEvent = {\n eventType: \"DRAWER_OPENED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_opened\";\n};\n\nexport type DrawerClosedEvent = {\n eventType: \"DRAWER_CLOSED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_closed\";\n};\n\nexport type VariantSelectionChangedEvent = {\n eventType: \"VARIANT_SELECTION_CHANGED\";\n shop: string;\n anonymousUserId: string;\n before: Record<string, number>; // variantId -> quantity\n after: Record<string, number>;\n timestamp: string;\n mixpanelEvent?: \"bundle_started\" | \"bundle_completed\";\n};\n\nexport type BundleAddedToBasketEvent = {\n eventType: \"BUNDLE_ADDED_TO_BASKET\";\n shop: string;\n anonymousUserId: string;\n bundleId: string;\n productVariantIds: string[];\n grossPrice: number;\n discountedPrice: number;\n currency?: string;\n discountThresholdIdentifier: string; // rule handle\n discountLabel: string;\n discountPercentage: number | null;\n discountedAmount: number;\n timestamp: string;\n checkout?: boolean;\n mixpanelEvent?: \"bundle_added_to_cart\" | \"checkout_started_with_bundle\";\n};\n\nexport type AnalyticsEvent =\n | DrawerOpenedEvent\n | DrawerClosedEvent\n | VariantSelectionChangedEvent\n | BundleAddedToBasketEvent;\n\n/**\n * Sends an analytics event to the backend API endpoint.\n * Failures are silently caught to prevent breaking bundle functionality.\n */\nexport async function trackEvent(\n analyticsEndpoint: string,\n shop: string,\n event: AnalyticsEvent,\n): Promise<void> {\n if (typeof window === \"undefined\") {\n return; // Skip in SSR\n }\n\n try {\n const url = new URL(analyticsEndpoint, window.location.origin);\n url.searchParams.set(\"shop\", shop);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(event),\n // Don't wait for response - fire and forget\n keepalive: true,\n });\n\n if (!response.ok) {\n console.warn(\n `[Bundle Analytics] Event tracking failed with status ${response.status}:`,\n await response.text().catch(() => \"Unable to read response\"),\n );\n }\n } catch (error) {\n // Log error for debugging but don't break bundle functionality\n console.warn(\"[Bundle Analytics] Failed to track event:\", error);\n }\n}\n","export type BundleUiLocale = \"en\" | \"fr\" | \"de\" | \"es\";\n\nexport type BundleUiMessageKey =\n | \"bundle.title.default\"\n | \"bundle.loading\"\n | \"bundle.inactive\"\n | \"bundle.drawer.aria\"\n | \"bundle.search\"\n | \"bundle.search.expanded\"\n | \"bundle.search.placeholder\"\n | \"bundle.search.clear\"\n | \"bundle.close\"\n | \"bundle.section.discount_tiers\"\n | \"bundle.section.your_bundle\"\n | \"bundle.section.select_items\"\n | \"bundle.select.items\"\n | \"bundle.size.min\"\n | \"bundle.stock.max_reached\"\n | \"bundle.stock.max_added\"\n | \"bundle.stock.sold_out\"\n | \"bundle.item.generic\"\n | \"bundle.slot\"\n | \"bundle.unlocks\"\n | \"bundle.totals\"\n | \"bundle.discount.badge\"\n | \"bundle.discount.off_label\"\n | \"bundle.celebration.received_discount\"\n | \"bundle.cta.adding\"\n | \"bundle.cta.processing\"\n | \"bundle.cta.checkout\"\n | \"bundle.cta.add_to_bundle\"\n | \"bundle.cta.add_to_basket\"\n | \"bundle.cta.add_more\"\n | \"bundle.powered_by\"\n | \"bundle.button.default\"\n | \"bundle.provider.inactive_error\"\n | \"bundle.provider.load_error\"\n | \"bundle.provider.stock_error\"\n | \"bundle.provider.add_error\"\n | \"bundle.a11y.add_to_bundle\"\n | \"bundle.a11y.remove_from_bundle\"\n | \"bundle.a11y.quantity\"\n | \"bundle.a11y.sold_out\"\n | \"bundle.a11y.max_available_selected\"\n | \"bundle.a11y.increase\"\n | \"bundle.a11y.decrease\";\n\nexport type BundleUiMessages = Partial<Record<BundleUiMessageKey, string>>;\n\ntype Dict = Record<BundleUiMessageKey, string>;\n\nconst EN: Dict = {\n \"bundle.title.default\": \"Build your bundle\",\n \"bundle.loading\": \"Loading...\",\n \"bundle.inactive\": \"Bundles are not active.\",\n \"bundle.drawer.aria\": \"Bundle builder\",\n \"bundle.search\": \"Search\",\n \"bundle.search.expanded\": \"Search (expanded)\",\n \"bundle.search.placeholder\": \"Search\",\n \"bundle.search.clear\": \"Clear search\",\n \"bundle.close\": \"Close\",\n \"bundle.section.discount_tiers\": \"Discount tiers\",\n \"bundle.section.your_bundle\": \"Your bundle\",\n \"bundle.section.select_items\": \"Choose items\",\n \"bundle.select.items\": \"Select items\",\n \"bundle.size.min\": \"(min {{min}})\",\n \"bundle.stock.max_reached\": \"Max Reached\",\n \"bundle.stock.max_added\": \"Max Added To Cart\",\n \"bundle.stock.sold_out\": \"Sold Out\",\n \"bundle.item.generic\": \"Item\",\n \"bundle.slot\": \"Slot {{slot}}\",\n \"bundle.unlocks\": \"Unlocks {{discount}}\",\n \"bundle.totals\": \"Totals\",\n \"bundle.discount.badge\": \"{{discount}}% Discount\",\n \"bundle.discount.off_label\": \"{{discount}}% off\",\n \"bundle.celebration.received_discount\": \"You received a {{discount}}% discount!\",\n \"bundle.cta.adding\": \"Adding...\",\n \"bundle.cta.processing\": \"Processing...\",\n \"bundle.cta.checkout\": \"Checkout\",\n \"bundle.cta.add_to_bundle\": \"Add\",\n \"bundle.cta.add_to_basket\": \"Add to Basket\",\n \"bundle.cta.add_more\": \"Add {{count}} more {{productWord}}\",\n \"bundle.powered_by\": \"powered by\",\n \"bundle.button.default\": \"Build a bundle\",\n \"bundle.provider.inactive_error\": \"Bundle is inactive.\",\n \"bundle.provider.load_error\": \"Failed to load bundle config.\",\n \"bundle.provider.stock_error\": \"Some bundle items are no longer available in the requested quantity. Please review your selection.\",\n \"bundle.provider.add_error\": \"We couldn't add this bundle right now. Please try again.\",\n \"bundle.a11y.add_to_bundle\": \"Add {{name}} to bundle\",\n \"bundle.a11y.remove_from_bundle\": \"Remove {{name}} from bundle\",\n \"bundle.a11y.quantity\": \"{{name}} quantity {{qty}}\",\n \"bundle.a11y.sold_out\": \"{{name}} is sold out\",\n \"bundle.a11y.max_available_selected\": \"{{name}} max available selected\",\n \"bundle.a11y.increase\": \"Increase {{name}}\",\n \"bundle.a11y.decrease\": \"Decrease {{name}}\",\n};\n\nconst FR: Dict = {\n ...EN,\n \"bundle.title.default\": \"Creez votre bundle\",\n \"bundle.loading\": \"Chargement...\",\n \"bundle.inactive\": \"Les bundles ne sont pas actifs.\",\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.powered_by\": \"propulse par\",\n \"bundle.button.default\": \"Creer un bundle\",\n};\n\nconst DE: Dict = {\n ...EN,\n \"bundle.title.default\": \"Bundle erstellen\",\n \"bundle.loading\": \"Wird geladen...\",\n \"bundle.inactive\": \"Bundles sind nicht aktiv.\",\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.powered_by\": \"powered by\",\n \"bundle.button.default\": \"Bundle erstellen\",\n};\n\nconst ES: Dict = {\n ...EN,\n \"bundle.title.default\": \"Crea tu bundle\",\n \"bundle.loading\": \"Cargando...\",\n \"bundle.inactive\": \"Los bundles no estan activos.\",\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.powered_by\": \"impulsado por\",\n \"bundle.button.default\": \"Crear bundle\",\n};\n\nconst DICTS: Record<BundleUiLocale, Dict> = {\n en: EN,\n fr: FR,\n de: DE,\n es: ES,\n};\n\nexport function normalizeBundleLocale(raw: string | null | undefined): BundleUiLocale {\n const value = String(raw ?? \"\").trim().toLowerCase();\n if (!value) return \"en\";\n const base = value.split(\"-\")[0] ?? \"en\";\n if (base === \"fr\" || base === \"de\" || base === \"en\" || base === \"es\") return base;\n return \"en\";\n}\n\nexport function translateBundleUi(\n locale: BundleUiLocale,\n key: BundleUiMessageKey,\n vars?: Record<string, string | number>,\n overrides?: BundleUiMessages,\n): string {\n const template = overrides?.[key] ?? DICTS[locale]?.[key] ?? EN[key] ?? key;\n if (!vars) return template;\n return Object.entries(vars).reduce((text, [name, value]) => {\n return text.replaceAll(`{{${name}}}`, String(value));\n }, template);\n}\n\nexport function formatBundleCurrency(amount: string | number, currencyCode: string | null, locale: string) {\n const n = Number(amount);\n if (!Number.isFinite(n)) return String(amount);\n\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(locale || undefined, { style: \"currency\", currency: currencyCode }).format(n);\n } catch {\n // ignore and fall through\n }\n }\n\n return `$${n.toFixed(2)}`;\n}\n\nexport function getProductWord(locale: BundleUiLocale, count: number) {\n const plural = count === 1 ? \"one\" : \"many\";\n if (locale === \"fr\") return plural === \"one\" ? \"produit\" : \"produits\";\n if (locale === \"de\") return plural === \"one\" ? \"Produkt\" : \"Produkte\";\n if (locale === \"es\") return plural === \"one\" ? \"producto\" : \"productos\";\n return plural === \"one\" ? \"product\" : \"products\";\n}\n","import { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { fetchActiveBundleConfigs } from \"../api/fetchActiveBundleConfigs\";\nimport { fetchBundleConfig as defaultFetchBundleConfig } from \"../api/fetchBundleConfig\";\nimport { fetchBundleConfigStatus } from \"../api/fetchBundleConfigStatus\";\nimport { BundleLineAttributeKeys } from \"../constants\";\nimport type {\n BundleCartAdapter,\n BundleConfig,\n BundleEligibleVariant,\n PublicActiveBundleConfigsResponse,\n PublicBundleConfigResponse,\n PublicBundleConfigStatusResponse,\n StyleSettings,\n} from \"../types\";\nimport { getVariantSelectionLimit } from \"../utils/stock\";\nimport { getOrCreateAnonymousUserId, trackEvent } from \"../utils/analytics\";\nimport type { BundleUiLocale, BundleUiMessageKey, BundleUiMessages } from \"../i18n\";\nimport { normalizeBundleLocale, translateBundleUi } from \"../i18n\";\n\ntype BundleProviderData = {\n currencyCode: string | null;\n config: BundleConfig;\n eligibleVariants: BundleEligibleVariant[];\n};\n\ntype BundleProviderCacheEntry = BundleProviderData;\ntype BundleConfigCache = Record<string, BundleProviderCacheEntry>;\ntype BundleSelectionState = Record<string, number>;\ntype BundleSelectionOrder = string[];\ntype OpenSource = \"api\" | \"hash\" | \"click\";\n\nexport type BundleProviderProps = {\n apiBaseUrl: string;\n shop: string;\n cartAdapter: BundleCartAdapter;\n configHandle?: string;\n initialData?: BundleProviderData;\n configFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n fresh?: boolean;\n signal?: AbortSignal;\n }) => Promise<PublicBundleConfigResponse>;\n activeConfigsFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n signal?: AbortSignal;\n }) => Promise<PublicActiveBundleConfigsResponse>;\n configStatusFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n }) => Promise<PublicBundleConfigStatusResponse>;\n analyticsEndpoint?: string;\n allowDrawerWhenInactive?: boolean;\n locale?: string;\n messages?: BundleUiMessages;\n children: React.ReactNode;\n};\n\nexport type BundleBuilderContextValue = {\n isOpen: boolean;\n open: () => void;\n openForHandle: (handle: string, source?: OpenSource) => void;\n close: () => void;\n toggle: () => void;\n syncCartQuantities: () => Promise<void>;\n currentHandle: string;\n setConfigHandle: (handle: string) => void;\n loadHandle: (handle: string) => void;\n\n loading: boolean;\n submitting: boolean;\n error: string | null;\n\n currencyCode: string | null;\n config: BundleConfig | null;\n eligibleVariants: BundleEligibleVariant[];\n\n selections: BundleSelectionState;\n selectionOrder: BundleSelectionOrder;\n getVariantMaxSelectableQuantity: (merchandiseId: string) => number | null;\n setQuantity: (merchandiseId: string, quantity: number) => void;\n clearSelections: () => void;\n\n bundleSize: number;\n minRequired: number;\n canSubmit: boolean;\n submit: () => Promise<void>;\n submitAndCheckout: () => Promise<void>;\n locale: BundleUiLocale;\n t: (key: BundleUiMessageKey, vars?: Record<string, string | number>) => string;\n};\n\nexport const BundleBuilderContext = createContext<BundleBuilderContextValue | null>(null);\n\nconst BUNDLE_DRAWER_HASH = \"#best-bundles\";\nconst EMPTY_ELIGIBLE_VARIANTS: BundleEligibleVariant[] = [];\n\nfunction normalizeBundleHandle(raw: string | null | undefined) {\n const value = String(raw ?? \"\").trim().toLowerCase();\n if (!value) return \"default\";\n const cleaned = value\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+/, \"\")\n .replace(/-+$/, \"\")\n .replace(/-{2,}/g, \"-\");\n return cleaned || \"default\";\n}\n\nfunction getBundleHashHandle(hash: string): string | null {\n const value = String(hash ?? \"\").trim().toLowerCase();\n if (!value.startsWith(BUNDLE_DRAWER_HASH)) return null;\n if (value === BUNDLE_DRAWER_HASH) return \"default\";\n const prefix = `${BUNDLE_DRAWER_HASH}:`;\n if (!value.startsWith(prefix)) return null;\n return normalizeBundleHandle(value.slice(prefix.length));\n}\n\ntype StyleSettingCssVarKey = Exclude<keyof StyleSettings, \"confettiColors\">;\nconst STYLE_SETTINGS_TO_CSS_VAR: Record<StyleSettingCssVarKey, string> = {\n primaryColor: \"--bb-cta-bg\",\n primaryHoverColor: \"--bb-cta-bg-hover\",\n primaryTextColor: \"--bb-cta-text\",\n backgroundColor: \"--bb-surface-bg\",\n backdropColor: \"--bb-backdrop-bg\",\n textColor: \"--bb-text-color\",\n titleColor: \"--bb-title-color\",\n mutedTextColor: \"--bb-muted-color\",\n borderRadius: \"--bb-panel-radius\",\n borderColor: \"--bb-border-color\",\n borderStrongColor: \"--bb-border-strong-color\",\n focusRingColor: \"--bb-focus-ring\",\n tierBorderColor: \"--bb-tier-border\",\n tierTextColor: \"--bb-tier-text\",\n tierBackgroundColor: \"--bb-tier-bg\",\n celebrationTextColor: \"--bb-celebration-text\",\n celebrationBgTop: \"--bb-celebration-bg-top\",\n celebrationBgBottom: \"--bb-celebration-bg-bottom\",\n celebrationBorderColor: \"--bb-celebration-border\",\n fontFamilyBody: \"--bb-font-family-body\",\n fontFamilyTitle: \"--bb-font-family-title\",\n};\n\nconst GOOGLE_FONTS_LINK_ID = \"bb-google-fonts\";\n\nfunction fontNameToParam(name: string): string {\n const s = (name ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n return s ? encodeURIComponent(s).replace(/%20/g, \"+\") : \"\";\n}\n\nfunction injectGoogleFontsLink(styles: StyleSettings | undefined) {\n if (typeof document === \"undefined\" || !document.head) return;\n if (!styles) {\n document.getElementById(GOOGLE_FONTS_LINK_ID)?.remove();\n return;\n }\n const body = (styles.fontFamilyBody ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const title = (styles.fontFamilyTitle ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const families: string[] = [];\n if (body) families.push(\"family=\" + fontNameToParam(body));\n if (title && title !== body) families.push(\"family=\" + fontNameToParam(title));\n const existing = document.getElementById(GOOGLE_FONTS_LINK_ID) as HTMLLinkElement | null;\n if (families.length === 0) {\n existing?.remove();\n return;\n }\n const href = `https://fonts.googleapis.com/css2?${families.join(\"&\")}&display=swap`;\n if (existing) {\n if (existing.getAttribute(\"href\") !== href) existing.setAttribute(\"href\", href);\n return;\n }\n const link = document.createElement(\"link\");\n link.id = GOOGLE_FONTS_LINK_ID;\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n}\n\nfunction injectStyleVariables(styles: StyleSettings | undefined) {\n if (!styles) return;\n injectGoogleFontsLink(styles);\n const root = document.documentElement;\n (Object.entries(STYLE_SETTINGS_TO_CSS_VAR) as Array<[StyleSettingCssVarKey, string]>).forEach(([key, cssVar]) => {\n let value = styles[key];\n if (value) {\n if ((key === \"fontFamilyBody\" || key === \"fontFamilyTitle\") && /^\\s*\\S+\\s+\\S/.test(value) && !/^[\"']/.test(value.trim())) {\n value = `\"${value.trim().replace(/^[\"']|[\"']$/g, \"\")}\"`;\n }\n root.style.setProperty(cssVar, value);\n }\n });\n}\n\nfunction getEffectiveStyleSettings(configSettings: StyleSettings | undefined): StyleSettings | undefined {\n if (typeof window === \"undefined\") return configSettings;\n const preview = (window as Window & { __BUNDLE_PREVIEW_STYLES__?: StyleSettings }).__BUNDLE_PREVIEW_STYLES__;\n if (preview && typeof preview === \"object\") return preview;\n return configSettings;\n}\n\nfunction safeRandomUUID() {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) return cryptoAny.randomUUID();\n } catch {\n // ignore\n }\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction clampQty(n: number) {\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.floor(n));\n}\n\nfunction clampToVariantLimit(quantity: number, limit: number) {\n const normalized = clampQty(quantity);\n if (!Number.isFinite(limit)) return normalized;\n return Math.min(normalized, Math.max(0, Math.floor(limit)));\n}\n\nfunction shouldUseActiveConfigPreload(\n allowDrawerWhenInactive: boolean,\n initialData?: BundleProviderData,\n) {\n return !allowDrawerWhenInactive && !initialData;\n}\n\nexport function BundleProvider(props: BundleProviderProps) {\n const {\n apiBaseUrl,\n shop,\n cartAdapter,\n configHandle = \"default\",\n initialData,\n configFetcher,\n activeConfigsFetcher,\n configStatusFetcher,\n analyticsEndpoint: providedAnalyticsEndpoint,\n allowDrawerWhenInactive = false,\n locale: inputLocale,\n messages,\n children,\n } = props;\n\n const locale = normalizeBundleLocale(inputLocale);\n const t = useCallback((key: BundleUiMessageKey, vars?: Record<string, string | number>) => {\n return translateBundleUi(locale, key, vars, messages);\n }, [locale, messages]);\n\n const normalizedInitialHandle = normalizeBundleHandle(configHandle);\n const analyticsEndpoint = providedAnalyticsEndpoint ?? `${apiBaseUrl}/api/public/bundle-analytics`;\n const useActivePreload = shouldUseActiveConfigPreload(allowDrawerWhenInactive, initialData);\n\n const [isOpen, setIsOpen] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [cartSyncing, setCartSyncing] = useState(false);\n const [cartQuantitiesByMerchandiseId, setCartQuantitiesByMerchandiseId] = useState<Record<string, number>>({});\n const [currentHandle, setCurrentHandleState] = useState(normalizedInitialHandle);\n const [configCache, setConfigCache] = useState<BundleConfigCache>(() => (\n initialData ? { [normalizedInitialHandle]: initialData } : {}\n ));\n const [bootstrapLoading, setBootstrapLoading] = useState(useActivePreload);\n const [blockingHandleLoad, setBlockingHandleLoad] = useState<string | null>(\n !useActivePreload && !initialData ? normalizedInitialHandle : null,\n );\n const [statusCheckPending, setStatusCheckPending] = useState<string | null>(null);\n const [pendingOpenHandle, setPendingOpenHandle] = useState<{ handle: string; source: OpenSource } | null>(null);\n const [selectionsState, setSelectionsState] = useState<{ selections: BundleSelectionState; order: BundleSelectionOrder }>(\n () => ({ selections: {}, order: [] }),\n );\n\n const preloadAbortRef = useRef<AbortController | null>(null);\n const handleFetchAbortRef = useRef<AbortController | null>(null);\n const statusAbortRef = useRef<AbortController | null>(null);\n const cartSyncSeqRef = useRef(0);\n const currentHandleRef = useRef(currentHandle);\n const configCacheRef = useRef(configCache);\n const bootstrapLoadingRef = useRef(bootstrapLoading);\n const openForHandleRef = useRef<((handle: string, source?: OpenSource) => void) | null>(null);\n const fetcher = configFetcher ?? defaultFetchBundleConfig;\n const activePreloadFetcher = activeConfigsFetcher ?? fetchActiveBundleConfigs;\n const statusFetcher = configStatusFetcher ?? fetchBundleConfigStatus;\n\n const loadCartQuantities = useCallback(async () => {\n if (typeof cartAdapter.getLineQuantitiesByMerchandiseId !== \"function\") return null;\n const quantities = await cartAdapter.getLineQuantitiesByMerchandiseId();\n return Object.entries(quantities ?? {}).reduce<Record<string, number>>((acc, [id, quantity]) => {\n const q = clampQty(quantity);\n if (q > 0) acc[id] = q;\n return acc;\n }, {});\n }, [cartAdapter]);\n\n const refreshCartQuantities = useCallback(async () => {\n const syncSeq = ++cartSyncSeqRef.current;\n setCartSyncing(true);\n try {\n const quantities = await loadCartQuantities();\n if (quantities && syncSeq === cartSyncSeqRef.current) {\n setCartQuantitiesByMerchandiseId(quantities);\n }\n return quantities;\n } catch {\n return null;\n } finally {\n if (syncSeq === cartSyncSeqRef.current) setCartSyncing(false);\n }\n }, [loadCartQuantities]);\n\n useEffect(() => {\n currentHandleRef.current = currentHandle;\n }, [currentHandle]);\n\n useEffect(() => {\n configCacheRef.current = configCache;\n }, [configCache]);\n\n useEffect(() => {\n bootstrapLoadingRef.current = bootstrapLoading;\n }, [bootstrapLoading]);\n\n useEffect(() => {\n void refreshCartQuantities();\n }, [refreshCartQuantities]);\n\n const setConfigHandle = useCallback((handle: string) => {\n setCurrentHandleState(normalizeBundleHandle(handle));\n }, []);\n\n const close = useCallback(() => {\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_CLOSED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_closed\",\n }).catch((trackError) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer closed:\", trackError);\n });\n } catch (trackError) {\n console.warn(\"[Bundle Analytics] Error in close() callback:\", trackError);\n }\n }\n setIsOpen(false);\n if (typeof window !== \"undefined\" && window.location.hash.toLowerCase().startsWith(BUNDLE_DRAWER_HASH)) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n }, [analyticsEndpoint, shop]);\n\n const openDrawerOnly = useCallback(() => {\n setIsOpen((current) => {\n if (current) return current;\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_OPENED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_opened\",\n }).catch((trackError) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer opened:\", trackError);\n });\n } catch (trackError) {\n console.warn(\"[Bundle Analytics] Error in open() callback:\", trackError);\n }\n }\n return true;\n });\n }, [analyticsEndpoint, shop]);\n\n const applyLatestConfigResponse = useCallback((handle: string, response: PublicBundleConfigResponse) => {\n if (!response.ok || response.config.isActive === false) {\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 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 = win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__ ?? [];\n setConfigCache((prev) => ({\n ...prev,\n [currentHandleRef.current]: {\n currencyCode: currencyCode ?? null,\n config: previewConfig,\n eligibleVariants: previewVariants.length ? previewVariants : (prev[currentHandleRef.current]?.eligibleVariants ?? []),\n },\n }));\n if (win.__BUNDLE_PREVIEW_VARIANTS_LOADING__ === true) {\n setBlockingHandleLoad(currentHandleRef.current);\n } else {\n setBlockingHandleLoad((current) => current === currentHandleRef.current ? null : current);\n }\n };\n if (win.__BUNDLE_PREVIEW_CONFIG__) applyPreviewConfig();\n window.addEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n return () => window.removeEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n }, [currencyCode]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? Number.NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const variantSelectionLimitById = useMemo(() => {\n return new Map(\n eligibleVariants.map((variant) => {\n const baseLimit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(baseLimit)) return [variant.id, baseLimit] as const;\n const inCart = clampQty(cartQuantitiesByMerchandiseId[variant.id] ?? 0);\n return [variant.id, Math.max(0, Math.floor(baseLimit) - inCart)] as const;\n }),\n );\n }, [eligibleVariants, cartQuantitiesByMerchandiseId]);\n\n const eligibleVariantIdsSet = useMemo(() => {\n return new Set(\n eligibleVariants\n .filter((variant) => getVariantSelectionLimit(variant) > 0)\n .map((variant) => variant.id),\n );\n }, [eligibleVariants]);\n\n const minRequired = useMemo(() => {\n const rules = config?.rules ?? [];\n const ruleMin = rules.length ? Math.min(...rules.map((rule) => rule.minBundleSize)) : 2;\n const normalizedRuleMin = Number.isFinite(ruleMin) && ruleMin > 0 ? ruleMin : 2;\n const configuredRaw = Number(config?.minBundleSize ?? Number.NaN);\n const configuredMin =\n Number.isFinite(configuredRaw) && Number.isInteger(configuredRaw)\n ? Math.max(2, Math.min(100, configuredRaw))\n : null;\n return configuredMin == null\n ? normalizedRuleMin\n : Math.min(normalizedRuleMin, configuredMin);\n }, [config?.minBundleSize, config?.rules]);\n\n const setQuantity = useCallback((merchandiseId: string, quantity: number) => {\n if (cartSyncing) return;\n if (!eligibleVariantIdsSet.has(merchandiseId)) {\n if (!loading) return;\n }\n\n const variantLimit = variantSelectionLimitById.get(merchandiseId) ?? (loading ? Number.POSITIVE_INFINITY : 0);\n const q = clampToVariantLimit(quantity, variantLimit);\n setSelectionsState((prev) => {\n const prevQty = prev.selections[merchandiseId] ?? 0;\n const requestedDelta = q - prevQty;\n const currentBundleSize = Object.values(prev.selections).reduce((sum, value) => sum + (value || 0), 0);\n const variantRemaining =\n Number.isFinite(variantLimit)\n ? Math.max(0, Math.floor(variantLimit) - prevQty)\n : requestedDelta;\n const delta =\n requestedDelta > 0\n ? Math.min(\n requestedDelta,\n Math.max(0, maxBundleSize - currentBundleSize),\n variantRemaining,\n )\n : requestedDelta;\n\n const nextQty = prevQty + delta;\n\n let nextSelections: BundleSelectionState;\n if (nextQty <= 0) {\n const rest = { ...prev.selections };\n delete rest[merchandiseId];\n nextSelections = rest;\n } else if (prevQty === nextQty) {\n nextSelections = prev.selections;\n } else {\n nextSelections = { ...prev.selections, [merchandiseId]: nextQty };\n }\n\n let nextOrder = prev.order;\n if (delta > 0) {\n nextOrder = [...prev.order, ...Array.from({ length: delta }, () => merchandiseId)];\n } else if (delta < 0) {\n let remainingToRemove = -delta;\n const keptReversed: string[] = [];\n for (let i = prev.order.length - 1; i >= 0; i--) {\n const id = prev.order[i];\n if (id === merchandiseId && remainingToRemove > 0) {\n remainingToRemove--;\n continue;\n }\n keptReversed.push(id);\n }\n keptReversed.reverse();\n nextOrder = keptReversed;\n }\n\n if (nextSelections === prev.selections && nextOrder === prev.order) return prev;\n\n const prevBundleSize = currentBundleSize;\n const nextBundleSize = Object.values(nextSelections).reduce((sum, value) => sum + (value || 0), 0);\n\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const basePayload = {\n eventType: \"VARIANT_SELECTION_CHANGED\" as const,\n shop,\n anonymousUserId,\n before: { ...prev.selections },\n after: { ...nextSelections },\n timestamp: new Date().toISOString(),\n };\n trackEvent(analyticsEndpoint, shop, basePayload);\n\n if (prevBundleSize === 0 && nextBundleSize >= 1) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_started\",\n });\n }\n if (prevBundleSize < minRequired && nextBundleSize >= minRequired) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_completed\",\n });\n }\n } catch {\n // Analytics should not break functionality.\n }\n }\n\n return { selections: nextSelections, order: nextOrder };\n });\n }, [analyticsEndpoint, cartSyncing, eligibleVariantIdsSet, loading, maxBundleSize, minRequired, shop, variantSelectionLimitById]);\n\n useEffect(() => {\n if (loading) return;\n setSelectionsState((prev) => {\n const nextSelectionsEntries = Object.entries(prev.selections)\n .map(([id, quantity]) => {\n if (!eligibleVariantIdsSet.has(id)) return null;\n const limit = variantSelectionLimitById.get(id) ?? 0;\n const nextQuantity = clampToVariantLimit(quantity, limit);\n if (nextQuantity <= 0) return null;\n return [id, nextQuantity] as const;\n })\n .filter(Boolean) as Array<readonly [string, number]>;\n const nextSelections = Object.fromEntries(nextSelectionsEntries) as BundleSelectionState;\n const remainingById = new Map(nextSelectionsEntries);\n const nextOrder = prev.order.filter((id) => {\n const remaining = remainingById.get(id) ?? 0;\n if (remaining <= 0) return false;\n remainingById.set(id, remaining - 1);\n return true;\n });\n\n if (\n nextOrder.length === prev.order.length &&\n nextSelectionsEntries.length === Object.keys(prev.selections).length &&\n nextSelectionsEntries.every(([id, quantity]) => prev.selections[id] === quantity)\n ) {\n return prev;\n }\n\n return { selections: nextSelections, order: nextOrder };\n });\n }, [eligibleVariantIdsSet, loading, variantSelectionLimitById]);\n\n useEffect(() => {\n setSelectionsState({ selections: {}, order: [] });\n }, [currentHandle]);\n\n const clearSelections = useCallback(() => setSelectionsState({ selections: {}, order: [] }), []);\n const syncCartQuantities = useCallback(async () => {\n await refreshCartQuantities();\n }, [refreshCartQuantities]);\n const getVariantMaxSelectableQuantity = useCallback((merchandiseId: string) => {\n const limit = variantSelectionLimitById.get(merchandiseId);\n if (limit == null || !Number.isFinite(limit)) return null;\n return Math.max(0, Math.floor(limit));\n }, [variantSelectionLimitById]);\n const selections = selectionsState.selections;\n const selectionOrder = selectionsState.order;\n\n const bundleSize = useMemo(() => Object.values(selections).reduce((sum, quantity) => sum + (quantity || 0), 0), [selections]);\n\n const canSubmit = useMemo(() => {\n if (loading || cartSyncing || submitting) return false;\n if (error) return false;\n if (!config?.isActive) return false;\n if (bundleSize < minRequired) return false;\n return true;\n }, [bundleSize, cartSyncing, config?.isActive, error, loading, minRequired, submitting]);\n\n const performCartAddition = useCallback(async (options?: { onComplete?: () => void; checkout?: boolean }) => {\n if (!canSubmit || !config) return;\n\n const bundleId = safeRandomUUID();\n const bundleTitle = (config.title ?? \"\").trim().slice(0, 255);\n const latestCartQuantities = await refreshCartQuantities();\n const effectiveLimitById = new Map(\n eligibleVariants.map((variant) => {\n const baseLimit = getVariantSelectionLimit(variant);\n if (!Number.isFinite(baseLimit)) return [variant.id, baseLimit] as const;\n const inCart = clampQty((latestCartQuantities ?? cartQuantitiesByMerchandiseId)[variant.id] ?? 0);\n return [variant.id, Math.max(0, Math.floor(baseLimit) - inCart)] as const;\n }),\n );\n const lines = Object.entries(selections)\n .map(([merchandiseId, quantity]) => ({\n merchandiseId,\n quantity: clampToVariantLimit(quantity, effectiveLimitById.get(merchandiseId) ?? 0),\n }))\n .filter((line) => line.quantity > 0)\n .filter((line) => eligibleVariantIdsSet.has(line.merchandiseId))\n .map((line) => ({\n merchandiseId: line.merchandiseId,\n quantity: line.quantity,\n attributes: [\n { key: BundleLineAttributeKeys.bundleId, value: bundleId },\n { key: BundleLineAttributeKeys.bundleConfig, value: currentHandle },\n { key: BundleLineAttributeKeys.bundleSource, value: \"bundle_builder\" },\n ...(bundleTitle ? [{ key: BundleLineAttributeKeys.bundleTitle, value: bundleTitle }] : []),\n ],\n }));\n\n if (!lines.length) return;\n\n const byId = new Map(eligibleVariants.map((variant) => [variant.id, variant] as const));\n let grossPrice = 0;\n for (const line of lines) {\n const q = line.quantity ?? 0;\n if (q <= 0) continue;\n const variant = byId.get(line.merchandiseId);\n const price = Number(variant?.price);\n if (!Number.isFinite(price)) continue;\n grossPrice += price * q;\n }\n grossPrice = Math.round(grossPrice * 100) / 100;\n\n const rulesSorted = [...(config.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n let appliedRule: (typeof rulesSorted)[number] | null = null;\n for (const rule of rulesSorted) {\n if (bundleSize >= rule.minBundleSize) appliedRule = rule;\n }\n\n const appliedDiscountPercent = appliedRule\n ? (() => {\n const pct = Number.parseFloat(appliedRule!.discountPercent);\n return Number.isFinite(pct) && pct > 0 ? pct : null;\n })()\n : null;\n\n const discountedPrice = appliedDiscountPercent\n ? Math.round(grossPrice * (1 - appliedDiscountPercent / 100) * 100) / 100\n : grossPrice;\n const discountedAmount = grossPrice - discountedPrice;\n const productVariantIds = lines.map((line) => line.merchandiseId);\n const discountThresholdIdentifier = appliedRule?.handle ?? \"\";\n const discountLabel = appliedRule?.label?.trim() || \"\";\n\n setSubmitting(true);\n try {\n if (options?.checkout) {\n await cartAdapter.linesAddForCheckout(lines);\n } else {\n await cartAdapter.linesAdd(lines);\n }\n\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const isCheckout = !!options?.checkout;\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"BUNDLE_ADDED_TO_BASKET\",\n shop,\n anonymousUserId,\n bundleId,\n productVariantIds,\n grossPrice,\n discountedPrice,\n currency: currencyCode ?? undefined,\n discountThresholdIdentifier,\n discountLabel,\n discountPercentage: appliedDiscountPercent,\n discountedAmount,\n timestamp: new Date().toISOString(),\n checkout: isCheckout,\n mixpanelEvent: isCheckout ? \"checkout_started_with_bundle\" : \"bundle_added_to_cart\",\n });\n } catch {\n // Analytics should not break functionality.\n }\n }\n\n clearSelections();\n close();\n void refreshCartQuantities();\n options?.onComplete?.();\n setError(null);\n } catch (addError) {\n const rawMessage = addError instanceof Error ? addError.message : \"\";\n const isStockError = /stock|sold out|inventory|insufficient|available|422/i.test(rawMessage);\n setError(\n isStockError\n ? t(\"bundle.provider.stock_error\")\n : t(\"bundle.provider.add_error\"),\n );\n void refreshCartQuantities();\n } finally {\n setSubmitting(false);\n }\n }, [\n analyticsEndpoint,\n bundleSize,\n canSubmit,\n cartAdapter,\n clearSelections,\n close,\n config,\n currencyCode,\n cartQuantitiesByMerchandiseId,\n currentHandle,\n eligibleVariantIdsSet,\n eligibleVariants,\n refreshCartQuantities,\n selections,\n shop,\n t,\n ]);\n\n const submit = useCallback(async () => {\n await performCartAddition({\n onComplete: () => {\n cartAdapter.openCartUI?.();\n },\n });\n }, [cartAdapter, performCartAddition]);\n\n const submitAndCheckout = useCallback(async () => {\n await performCartAddition({\n checkout: true,\n onComplete: () => {\n cartAdapter.navigateToCheckout?.();\n },\n });\n }, [cartAdapter, performCartAddition]);\n\n const value: BundleBuilderContextValue = useMemo(() => ({\n isOpen,\n open,\n openForHandle,\n close,\n toggle,\n currentHandle,\n setConfigHandle,\n loadHandle,\n syncCartQuantities,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n clearSelections,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n }), [\n bundleSize,\n canSubmit,\n clearSelections,\n close,\n config,\n currencyCode,\n currentHandle,\n eligibleVariants,\n error,\n isOpen,\n loading,\n minRequired,\n open,\n openForHandle,\n selectionOrder,\n selections,\n setConfigHandle,\n loadHandle,\n syncCartQuantities,\n getVariantMaxSelectableQuantity,\n setQuantity,\n submit,\n submitAndCheckout,\n submitting,\n toggle,\n locale,\n t,\n ]);\n\n return <BundleBuilderContext.Provider value={value}>{children}</BundleBuilderContext.Provider>;\n}\n","import { useContext } from \"react\";\nimport { BundleBuilderContext } from \"../context/BundleProvider\";\n\nexport function useBundleBuilder() {\n const ctx = useContext(BundleBuilderContext);\n if (!ctx) {\n throw new Error(\"useBundleBuilder must be used within <BundleProvider />\");\n }\n return ctx;\n}\n\n","import { useBundleBuilder } from \"./useBundleBuilder\";\n\nexport type BundleBuilderDrawerControls = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n};\n\n/**\n * Convenience hook for controlling the drawer (alternative to using <BundleButton />).\n * Must be used within <BundleProvider />.\n */\nexport function useBundleBuilderDrawer(): BundleBuilderDrawerControls {\n const { isOpen, open, close, toggle } = useBundleBuilder();\n return { isOpen, open, close, toggle };\n}\n\n","import React from \"react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleButton.module.css\";\n\nexport type BundleButtonProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function BundleButton(props: BundleButtonProps) {\n const { toggle, t } = useBundleBuilder();\n return (\n <button\n type=\"button\"\n onClick={toggle}\n className={[styles.button, props.className].filter(Boolean).join(\" \")}\n >\n {props.children ?? t(\"bundle.button.default\")}\n </button>\n );\n}\n","'use strict';\n\n// t: current time, b: beginning value, _c: final value, d: total duration\nvar tweenFunctions = {\n linear: function(t, b, _c, d) {\n var c = _c - b;\n return c * t / d + b;\n },\n easeInQuad: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t + b;\n },\n easeOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (t /= d) * (t - 2) + b;\n },\n easeInOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t + b;\n } else {\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n }\n },\n easeInCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t + b;\n },\n easeOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t + 1) + b;\n },\n easeInOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n },\n easeInQuart: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t + b;\n },\n easeOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n },\n easeInOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t + b;\n } else {\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n },\n easeInQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t * t + b;\n },\n easeOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n },\n easeInOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n },\n easeInSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n },\n easeOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n },\n easeInOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n },\n easeInExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n },\n easeOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n },\n easeInOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n } else {\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n },\n easeInCirc: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n },\n easeOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n },\n easeInOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n } else {\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n },\n easeInElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n },\n easeOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n },\n easeInOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d / 2) === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n } else {\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b;\n }\n },\n easeInBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n },\n easeOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n },\n easeInOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n } else {\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }\n },\n easeInBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n v = tweenFunctions.easeOutBounce(d - t, 0, c, d);\n return c - v + b;\n },\n easeOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n },\n easeInOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n if (t < d / 2) {\n v = tweenFunctions.easeInBounce(t * 2, 0, c, d);\n return v * 0.5 + b;\n } else {\n v = tweenFunctions.easeOutBounce(t * 2 - d, 0, c, d);\n return v * 0.5 + c * 0.5 + b;\n }\n }\n};\n\nmodule.exports = tweenFunctions;\n","import { jsx } from 'react/jsx-runtime';\nimport React from 'react';\nimport * as tweens from 'tween-functions';\n\nfunction degreesToRads(degrees) {\n return (degrees * Math.PI) / 180;\n}\nfunction randomRange(min, max) {\n return min + Math.random() * (max - min);\n}\nfunction randomInt(min, max) {\n return Math.floor(min + Math.random() * (max - min + 1));\n}\n\nvar ParticleShape;\n(function (ParticleShape) {\n ParticleShape[ParticleShape[\"Circle\"] = 0] = \"Circle\";\n ParticleShape[ParticleShape[\"Square\"] = 1] = \"Square\";\n ParticleShape[ParticleShape[\"Strip\"] = 2] = \"Strip\";\n})(ParticleShape || (ParticleShape = {}));\nvar RotationDirection;\n(function (RotationDirection) {\n RotationDirection[RotationDirection[\"Positive\"] = 1] = \"Positive\";\n RotationDirection[RotationDirection[\"Negative\"] = -1] = \"Negative\";\n})(RotationDirection || (RotationDirection = {}));\nconst DEFAULT_FRAME_TIME = 1000 / 60;\nclass Particle {\n constructor(context, getOptions, x, y) {\n this.getOptions = getOptions;\n const { colors, initialVelocityX, initialVelocityY } = this.getOptions();\n this.context = context;\n this.x = x;\n this.y = y;\n this.w = randomRange(5, 20);\n this.h = randomRange(5, 20);\n this.radius = randomRange(5, 10);\n this.vx =\n typeof initialVelocityX === 'number'\n ? randomRange(-initialVelocityX, initialVelocityX)\n : randomRange(initialVelocityX.min, initialVelocityX.max);\n this.vy =\n typeof initialVelocityY === 'number'\n ? randomRange(-initialVelocityY, 0)\n : randomRange(initialVelocityY.min, initialVelocityY.max);\n this.shape = randomInt(0, 2);\n this.angle = degreesToRads(randomRange(0, 360));\n this.angularSpin = randomRange(-0.2, 0.2);\n this.color = colors[Math.floor(Math.random() * colors.length)];\n this.rotateY = randomRange(0, 1);\n this.rotationDirection = randomRange(0, 1)\n ? RotationDirection.Positive\n : RotationDirection.Negative;\n }\n update(elapsed) {\n const { gravity, wind, friction, opacity, drawShape } = this.getOptions();\n const frameTimeMultiplier = elapsed / DEFAULT_FRAME_TIME;\n this.x += this.vx * frameTimeMultiplier;\n this.y += this.vy * frameTimeMultiplier;\n this.vy += gravity * frameTimeMultiplier;\n this.vx += wind * frameTimeMultiplier;\n this.vx *= friction ** frameTimeMultiplier;\n this.vy *= friction ** frameTimeMultiplier;\n if (this.rotateY >= 1 &&\n this.rotationDirection === RotationDirection.Positive) {\n this.rotationDirection = RotationDirection.Negative;\n }\n else if (this.rotateY <= -1 &&\n this.rotationDirection === RotationDirection.Negative) {\n this.rotationDirection = RotationDirection.Positive;\n }\n const rotateDelta = 0.1 * this.rotationDirection * frameTimeMultiplier;\n this.rotateY += rotateDelta;\n this.angle += this.angularSpin;\n this.context.save();\n this.context.translate(this.x, this.y);\n this.context.rotate(this.angle);\n this.context.scale(1, this.rotateY);\n this.context.rotate(this.angle);\n this.context.beginPath();\n this.context.fillStyle = this.color;\n this.context.strokeStyle = this.color;\n this.context.globalAlpha = opacity;\n this.context.lineCap = 'round';\n this.context.lineWidth = 2;\n if (drawShape && typeof drawShape === 'function') {\n drawShape.call(this, this.context);\n }\n else {\n switch (this.shape) {\n case ParticleShape.Circle: {\n this.context.beginPath();\n this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);\n this.context.fill();\n break;\n }\n case ParticleShape.Square: {\n this.context.fillRect(-this.w / 2, -this.h / 2, this.w, this.h);\n break;\n }\n case ParticleShape.Strip: {\n this.context.fillRect(-this.w / 6, -this.h / 2, this.w / 3, this.h);\n break;\n }\n }\n }\n this.context.closePath();\n this.context.restore();\n }\n}\n\nclass ParticleGenerator {\n constructor(canvas, getOptions) {\n this.x = 0;\n this.y = 0;\n this.w = 0;\n this.h = 0;\n this.lastNumberOfPieces = 0;\n this.tweenProgress = 0;\n this.tweenFrom = 0;\n this.particles = [];\n this.particlesGenerated = 0;\n this.removeParticleAt = (i) => {\n this.particles.splice(i, 1);\n };\n this.getParticle = () => {\n const newParticleX = randomRange(this.x, this.w + this.x);\n const newParticleY = randomRange(this.y, this.h + this.y);\n return new Particle(this.context, this.getOptions, newParticleX, newParticleY);\n };\n this.animate = (elapsed) => {\n const { canvas, context, particlesGenerated, lastNumberOfPieces } = this;\n const { run, recycle, numberOfPieces, debug, tweenFunction, tweenDuration, } = this.getOptions();\n if (!run) {\n return false;\n }\n const nP = this.particles.length;\n const activeCount = recycle ? nP : particlesGenerated;\n // Initial population\n if (activeCount < numberOfPieces) {\n // Use the numberOfPieces prop as a key to reset the easing timing\n if (lastNumberOfPieces !== numberOfPieces) {\n this.tweenProgress = 0;\n this.tweenFrom = activeCount;\n this.lastNumberOfPieces = numberOfPieces;\n }\n // Clamp tweenProgress between 0 and tweenDuration\n this.tweenProgress = Math.min(tweenDuration, Math.max(0, this.tweenProgress + elapsed));\n const tweenedVal = tweenFunction(this.tweenProgress, this.tweenFrom, numberOfPieces, tweenDuration);\n const numToAdd = Math.round(tweenedVal - activeCount);\n for (let i = 0; i < numToAdd; i++) {\n this.particles.push(this.getParticle());\n }\n this.particlesGenerated += numToAdd;\n }\n if (debug) {\n // Draw debug text\n context.font = '12px sans-serif';\n context.fillStyle = '#333';\n context.textAlign = 'right';\n context.fillText(`Particles: ${nP}`, canvas.width - 10, canvas.height - 20);\n }\n // Maintain the population, iterating backwards to prevent issues when removing particles\n for (let i = this.particles.length - 1; i >= 0; i--) {\n const p = this.particles[i];\n // Update each particle's position\n p.update(elapsed);\n // Prune the off-canvas particles\n if (p.y > canvas.height ||\n p.y < -100 ||\n p.x > canvas.width + 100 ||\n p.x < -100) {\n if (recycle && activeCount <= numberOfPieces) {\n // Replace the particle with a brand new one\n this.particles[i] = this.getParticle();\n }\n else {\n this.removeParticleAt(i);\n }\n }\n }\n return nP > 0 || activeCount < numberOfPieces;\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.getOptions = getOptions;\n }\n}\n\nconst confettiDefaults = {\n width: typeof window !== 'undefined' ? window.innerWidth : 300,\n height: typeof window !== 'undefined' ? window.innerHeight : 200,\n numberOfPieces: 200,\n friction: 0.99,\n wind: 0,\n gravity: 0.1,\n initialVelocityX: 4,\n initialVelocityY: 10,\n colors: [\n '#f44336',\n '#e91e63',\n '#9c27b0',\n '#673ab7',\n '#3f51b5',\n '#2196f3',\n '#03a9f4',\n '#00bcd4',\n '#009688',\n '#4CAF50',\n '#8BC34A',\n '#CDDC39',\n '#FFEB3B',\n '#FFC107',\n '#FF9800',\n '#FF5722',\n '#795548',\n ],\n opacity: 1.0,\n debug: false,\n tweenFunction: tweens.easeInOutQuad,\n tweenDuration: 5000,\n recycle: true,\n run: true,\n};\nclass Confetti {\n constructor(canvas, opts) {\n this.lastFrameTime = 0;\n this.setOptionsWithDefaults = (opts) => {\n const computedConfettiDefaults = {\n confettiSource: {\n x: 0,\n y: 0,\n w: this.canvas.width,\n h: 0,\n },\n };\n this._options = {\n ...computedConfettiDefaults,\n ...confettiDefaults,\n ...opts,\n };\n Object.assign(this, opts.confettiSource);\n };\n this.update = (timestamp = 0) => {\n const { options: { run, onConfettiComplete, frameRate }, canvas, context, } = this;\n // Cap elapsed time to 50ms to prevent large time steps\n const elapsed = Math.min(timestamp - this.lastFrameTime, 50);\n // Throttle the frame rate if set\n if (frameRate && elapsed < 1000 / frameRate) {\n this.rafId = requestAnimationFrame(this.update);\n return;\n }\n this.lastFrameTime = timestamp - (frameRate ? elapsed % frameRate : 0);\n if (run) {\n context.fillStyle = 'white';\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n if (this.generator.animate(elapsed)) {\n this.rafId = requestAnimationFrame(this.update);\n }\n else {\n if (onConfettiComplete &&\n typeof onConfettiComplete === 'function' &&\n this.generator.particlesGenerated > 0) {\n onConfettiComplete.call(this, this);\n }\n this._options.run = false;\n }\n };\n this.reset = () => {\n if (this.generator && this.generator.particlesGenerated > 0) {\n this.generator.particlesGenerated = 0;\n this.generator.particles = [];\n this.generator.lastNumberOfPieces = 0;\n }\n };\n this.stop = () => {\n this.options = { run: false };\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = undefined;\n }\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.generator = new ParticleGenerator(this.canvas, () => this.options);\n this.options = opts;\n this.update();\n }\n get options() {\n return this._options;\n }\n set options(opts) {\n const lastRunState = this._options?.run;\n const lastRecycleState = this._options?.recycle;\n this.setOptionsWithDefaults(opts);\n if (this.generator) {\n Object.assign(this.generator, this.options.confettiSource);\n if (typeof opts.recycle === 'boolean' &&\n opts.recycle &&\n lastRecycleState === false) {\n this.generator.lastNumberOfPieces = this.generator.particles.length;\n }\n }\n if (typeof opts.run === 'boolean' && opts.run && lastRunState === false) {\n this.update();\n }\n }\n}\n\nconst ref = React.createRef();\nclass ReactConfettiInternal extends React.Component {\n constructor(props) {\n super(props);\n this.canvas = React.createRef();\n this.canvas = props.canvasRef || ref;\n }\n componentDidMount() {\n if (this.canvas.current) {\n const opts = extractCanvasProps(this.props)[0];\n this.confetti = new Confetti(this.canvas.current, opts);\n }\n }\n componentDidUpdate() {\n const confettiOptions = extractCanvasProps(this.props)[0];\n if (this.confetti) {\n this.confetti.options = confettiOptions;\n }\n }\n componentWillUnmount() {\n if (this.confetti) {\n this.confetti.stop();\n }\n this.confetti = undefined;\n }\n render() {\n const [confettiOptions, passedProps] = extractCanvasProps(this.props);\n const canvasStyles = {\n zIndex: 2,\n position: 'absolute',\n pointerEvents: 'none',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n ...passedProps.style,\n };\n return (jsx(\"canvas\", { width: confettiOptions.width, height: confettiOptions.height, ref: this.canvas, ...passedProps, style: canvasStyles }));\n }\n}\nReactConfettiInternal.defaultProps = {\n ...confettiDefaults,\n};\nReactConfettiInternal.displayName = 'ReactConfetti';\nfunction extractCanvasProps(props) {\n const confettiOptions = {};\n const refs = {};\n const rest = {};\n const confettiOptionKeys = [\n ...Object.keys(confettiDefaults),\n 'confettiSource',\n 'drawShape',\n 'onConfettiComplete',\n 'frameRate',\n ];\n const refProps = ['canvasRef'];\n for (const prop in props) {\n const val = props[prop];\n if (confettiOptionKeys.includes(prop)) {\n confettiOptions[prop] = val;\n }\n else if (refProps.includes(prop)) {\n refProps[prop] = val;\n }\n else {\n rest[prop] = val;\n }\n }\n return [confettiOptions, rest, refs];\n}\nconst ReactConfetti = React.forwardRef((props, ref) => jsx(ReactConfettiInternal, { canvasRef: ref, ...props }));\n\nexport { ReactConfetti as default };\n//# sourceMappingURL=react-confetti.mjs.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport Confetti from \"react-confetti\";\nimport { Link, Search } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport { formatBundleCurrency, getProductWord } from \"../i18n\";\nimport styles from \"./BundleBuilderDrawer.module.css\";\n\nexport type BundleBuilderDrawerProps = {\n className?: string;\n};\n\nexport function BundleBuilderDrawer(props: BundleBuilderDrawerProps) {\n const {\n isOpen,\n close,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n } = useBundleBuilder();\n\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const footerRef = useRef<HTMLElement | null>(null);\n const celebrationChipRef = useRef<HTMLDivElement | null>(null);\n\n const [windowSize, setWindowSize] = useState<{ width: number; height: number }>(() => {\n if (typeof window === \"undefined\") return { width: 0, height: 0 };\n return { width: window.innerWidth, height: window.innerHeight };\n });\n\n const [confettiKey, setConfettiKey] = useState(0);\n const [confettiSource, setConfettiSource] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n const [isConfettiActive, setIsConfettiActive] = useState(false);\n const confettiTimerRef = useRef<number | null>(null);\n const prevBundleSizeForConfettiRef = useRef<number>(bundleSize);\n const confettiSettleMs = 7000;\n\n const [celebrationKey, setCelebrationKey] = useState(0);\n const [celebrationText, setCelebrationText] = useState<string | null>(null);\n const [isCelebrationActive, setIsCelebrationActive] = useState(false);\n const celebrationTimerRef = useRef<number | null>(null);\n const celebrationDurationMs = 2800;\n\n const DEFAULT_CONFETTI_COLORS = [\n \"#2563eb\",\n \"#3b82f6\",\n \"#60a5fa\",\n \"#93c5fd\",\n \"#bae6fd\",\n \"#e0f2fe\",\n ] as const;\n\n const confettiColors = useMemo(() => {\n const c = config?.styleSettings?.confettiColors;\n if (Array.isArray(c) && c.length >= 6) {\n return c.slice(0, 6).map((s, i) =>\n typeof s === \"string\" && s.trim() ? s : DEFAULT_CONFETTI_COLORS[i],\n );\n }\n return [...DEFAULT_CONFETTI_COLORS];\n }, [config?.styleSettings?.confettiColors]);\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" · \");\n };\n\n const getVariantPrimaryName = (v: (typeof eligibleVariants)[number]) => {\n return v.product?.title ?? v.displayName ?? v.title;\n };\n\n const getVariantA11yLabel = (v: (typeof eligibleVariants)[number]) => {\n const name = getVariantPrimaryName(v);\n const opts = formatVariantOptions(v.selectedOptions);\n return [name, opts].filter(Boolean).join(\" — \");\n };\n\n const [isMounted, setIsMounted] = useState(isOpen);\n const closeTimerRef = useRef<number | null>(null);\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n\n return formatBundleCurrency(n, currencyCode, locale);\n };\n\n const title = config?.title?.trim() || t(\"bundle.title.default\");\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n\n const sorted = useMemo(() => {\n return [...eligibleVariants].sort((a, b) => a.displayName.localeCompare(b.displayName));\n }, [eligibleVariants]);\n\n const filteredVariants = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n if (!q) return sorted;\n\n const tokens = q.split(/\\s+/).filter(Boolean);\n const matches = (v: (typeof sorted)[number]) => {\n const parts: string[] = [];\n parts.push(v.displayName);\n if (v.product?.title) parts.push(v.product.title);\n for (const o of v.selectedOptions ?? []) {\n parts.push(o.name);\n parts.push(o.value);\n }\n const haystack = parts.join(\" \").toLowerCase();\n return tokens.every((t) => haystack.includes(t));\n };\n\n return sorted.filter(matches);\n }, [searchQuery, sorted]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n // Keep cents stable for display.\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n // Slot index (0-based) => rule that becomes active at that slot.\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const slotCount = useMemo(() => {\n // Placeholders show until highest tier; if user adds more, extend (scroll).\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n // Track animation state for dual button split animation\n const [isDualButtonAnimationLoaded, setIsDualButtonAnimationLoaded] = useState(true);\n const prevItemsRemainingRef = useRef(itemsRemaining);\n\n // Trigger animation when itemsRemaining changes from > 0 to 0 in add_to_cart_checkout mode\n useEffect(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n const wasPositive = prevItemsRemainingRef.current > 0;\n const isNowZero = itemsRemaining === 0;\n\n if (wasPositive && isNowZero) {\n // Trigger animation\n setIsDualButtonAnimationLoaded(false);\n } else {\n // Reset animation\n setIsDualButtonAnimationLoaded(true);\n }\n }\n prevItemsRemainingRef.current = itemsRemaining;\n }, [itemsRemaining, config?.ctaButtonMode]);\n\n const panelRef = useRef<HTMLDivElement | null>(null);\n const bodyRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = bodyRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\"${variantId}\"]`);\n if (!row) return;\n\n const c = container.getBoundingClientRect();\n const r = row.getBoundingClientRect();\n const padding = 8;\n const isFullyVisible = r.top >= c.top + padding && r.bottom <= c.bottom - padding;\n if (isFullyVisible) return;\n\n const maxTop = Math.max(0, container.scrollHeight - container.clientHeight);\n const rowCenterOffset = (r.top - c.top) + r.height / 2;\n const targetTop = container.scrollTop + rowCenterOffset - container.clientHeight / 2;\n const nextTop = Math.min(maxTop, Math.max(0, targetTop));\n container.scrollTo({ top: nextTop, behavior: \"smooth\" });\n };\n\n useEffect(() => {\n if (!isOpen) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") close();\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [close, isOpen]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setWindowSize({ width: window.innerWidth, height: window.innerHeight });\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n useEffect(() => {\n if (closeTimerRef.current != null) {\n window.clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n if (isOpen) {\n setIsMounted(true);\n return;\n }\n\n // Keep mounted long enough to play exit animation.\n closeTimerRef.current = window.setTimeout(() => {\n setIsMounted(false);\n closeTimerRef.current = null;\n }, 220);\n }, [isOpen]);\n\n useEffect(() => {\n return () => {\n if (closeTimerRef.current != null) window.clearTimeout(closeTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isSearchOpen) return;\n const raf = requestAnimationFrame(() => searchInputRef.current?.focus());\n return () => cancelAnimationFrame(raf);\n }, [isOpen, isSearchOpen]);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n\n // When hitting a threshold, try to reveal the NEXT threshold (aligned right) if it's off-screen to the right.\n // If no remaining thresholds, scroll the newest added item into view.\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n // Only scroll rightward when the target is off-screen to the right.\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const prev = prevBundleSizeForConfettiRef.current;\n prevBundleSizeForConfettiRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n // Trigger when crossing an exact configured threshold (e.g. 2 items, 3 items, etc.).\n const hitRule = rulesSorted.find((r) => r.minBundleSize === bundleSize);\n if (!hitRule) return;\n\n // Celebration chip (centered)\n setCelebrationText(\n t(\"bundle.celebration.received_discount\", {\n discount: formatPercent0dp(hitRule.discountPercent),\n }),\n );\n setCelebrationKey((k) => k + 1);\n setIsCelebrationActive(true);\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n celebrationTimerRef.current = window.setTimeout(() => {\n setIsCelebrationActive(false);\n celebrationTimerRef.current = null;\n }, celebrationDurationMs);\n }, [bundleSize, isOpen, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isCelebrationActive) return;\n if (!celebrationText) return;\n\n // After the chip renders, measure its rect and shoot confetti from it.\n const raf = requestAnimationFrame(() => {\n const chipEl = celebrationChipRef.current;\n const rect = chipEl?.getBoundingClientRect();\n\n // Fallback: use the drawer panel center if chip rect isn't available yet.\n const panelRect = panelRef.current?.getBoundingClientRect();\n const originX = rect ? rect.left + rect.width / 2 : panelRect ? panelRect.left + panelRect.width / 2 : window.innerWidth / 2;\n const originY = rect ? rect.top + rect.height / 2 : panelRect ? panelRect.top + panelRect.height / 2 : window.innerHeight / 2;\n\n const source = {\n x: originX - 2,\n y: originY - 2,\n w: 4,\n h: 4,\n };\n\n setConfettiSource(source);\n setConfettiKey((k) => k + 1);\n setIsConfettiActive(true);\n\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n confettiTimerRef.current = window.setTimeout(() => {\n setIsConfettiActive(false);\n confettiTimerRef.current = null;\n }, confettiSettleMs);\n });\n\n return () => cancelAnimationFrame(raf);\n }, [celebrationKey, celebrationText, confettiSettleMs, isCelebrationActive, isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n panelRef.current?.focus();\n }, [isOpen]);\n\n if (!isMounted) return null;\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t(\"bundle.drawer.aria\")}\n className={[styles.backdrop, isOpen ? styles.backdropOpen : styles.backdropClosed, props.className].filter(Boolean).join(\" \")}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) close();\n }}\n >\n {isConfettiActive && confettiSource && windowSize.width > 0 && windowSize.height > 0 ? (\n <Confetti\n key={confettiKey}\n width={windowSize.width}\n height={windowSize.height}\n confettiSource={confettiSource}\n colors={confettiColors}\n recycle={false}\n numberOfPieces={70}\n tweenDuration={100}\n gravity={0.45}\n initialVelocityY={{ min: -10, max: -30 }}\n initialVelocityX={{ min: -6, max: 6 }}\n style={{ position: \"fixed\", inset: 0, pointerEvents: \"none\", zIndex: 2147483646 }}\n />\n ) : null}\n <aside ref={panelRef} className={[styles.panel, isOpen ? styles.panelOpen : styles.panelClosed].filter(Boolean).join(\" \")} tabIndex={-1}>\n {isCelebrationActive && celebrationText ? (\n <div className={styles.celebrationOverlay} aria-hidden=\"true\">\n <div key={celebrationKey} ref={celebrationChipRef} className={styles.celebrationChip}>\n {celebrationText}\n </div>\n </div>\n ) : null}\n <header className={[styles.header, isSearchOpen ? styles.headerSearchOpen : null].filter(Boolean).join(\" \")}>\n <button\n type=\"button\"\n className={styles.searchIconButton}\n aria-label={isSearchOpen ? t(\"bundle.search.expanded\") : t(\"bundle.search\")}\n aria-expanded={isSearchOpen}\n onClick={() => {\n setIsSearchOpen(true);\n }}\n >\n <Search size={18} aria-hidden=\"true\" />\n </button>\n\n <div className={styles.headerCenter}>\n <div className={styles.headerTitleWrap} aria-hidden={isSearchOpen}>\n <h2 className={styles.title}>{title}</h2>\n </div>\n\n <div className={styles.headerSearchWrap} aria-hidden={!isSearchOpen}>\n <div className={styles.searchBar}>\n <input\n ref={searchInputRef}\n className={styles.searchInput}\n type=\"search\"\n value={searchQuery}\n placeholder={t(\"bundle.search.placeholder\")}\n onChange={(e) => setSearchQuery(e.target.value)}\n onBlur={() => {\n if (searchQuery.trim() === \"\") setIsSearchOpen(false);\n }}\n />\n {searchQuery.trim() ? (\n <button\n type=\"button\"\n className={styles.searchClearButton}\n onMouseDown={(e) => {\n // Prevent input blur so the bar stays open and focused.\n e.preventDefault();\n }}\n onClick={() => {\n setSearchQuery(\"\");\n searchInputRef.current?.focus();\n }}\n aria-label={t(\"bundle.search.clear\")}\n >\n {t(\"bundle.search.clear\")}\n </button>\n ) : null}\n </div>\n </div>\n </div>\n\n <button type=\"button\" onClick={close} disabled={submitting} className={styles.closeButton} aria-label={t(\"bundle.close\")}>\n ×\n </button>\n </header>\n\n <div className={styles.body} ref={bodyRef}>\n {loading ? <p className={styles.muted}>{t(\"bundle.loading\")}</p> : null}\n {error ? <p className={styles.error}>{error}</p> : null}\n\n <div className={styles.variants}>\n <ul className={styles.variantList}>\n {filteredVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const variantPrimaryName = getVariantPrimaryName(v);\n const variantOptionText = formatVariantOptions(v.selectedOptions);\n const variantA11y = getVariantA11yLabel(v);\n const variantSelectionLimit = getVariantMaxSelectableQuantity(v.id);\n const normalizedVariantSelectionLimit = variantSelectionLimit == null\n ? Number.POSITIVE_INFINITY\n : variantSelectionLimit;\n const isAtVariantStockLimit = qty >= normalizedVariantSelectionLimit;\n const canIncreaseQuantity = v.availableForSale !== false && !isAtMaxBundleSize && !isAtVariantStockLimit;\n const stockStatusLabel =\n v.availableForSale === false\n ? null\n : isAtVariantStockLimit\n ? t(\"bundle.stock.max_reached\")\n : null;\n\n // Show discounted variant price only when a rule is actually unlocked.\n const discountPercentToUse = appliedDiscountPercent;\n const originalPriceNumber = Number(v.price);\n const hasDiscount =\n discountPercentToUse != null &&\n Number.isFinite(discountPercentToUse) &&\n discountPercentToUse > 0 &&\n Number.isFinite(originalPriceNumber);\n const discountedPriceNumber = hasDiscount\n ? Math.round(originalPriceNumber * (1 - discountPercentToUse / 100) * 100) / 100\n : null;\n\n return (\n <li\n key={v.id}\n className={[styles.variantRow, v.availableForSale === false && styles.variantRowSoldOut]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={v.id}\n >\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {v.image?.url ? (\n <img\n className={styles.variantThumbImg}\n src={v.image.url}\n alt={v.image.altText ?? variantA11y}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantThumbFallback}>{v.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}</div>\n )}\n </div>\n\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{variantPrimaryName}</div>\n {variantOptionText ? <div className={styles.variantMeta}>{variantOptionText}</div> : null}\n <div className={styles.variantPriceRow}>\n {hasDiscount ? (\n <span className={styles.variantCompareAt}>\n {formatMoney(Number.isFinite(originalPriceNumber) ? originalPriceNumber.toFixed(2) : v.price)}\n </span>\n ) : null}\n <span className={styles.variantPrice}>\n {formatMoney(\n discountedPriceNumber != null\n ? discountedPriceNumber.toFixed(2)\n : Number.isFinite(originalPriceNumber)\n ? originalPriceNumber.toFixed(2)\n : v.price,\n )}\n </span>\n </div>\n </div>\n </div>\n {v.availableForSale === false ? (\n <div className={styles.soldOutContainer}>\n <span className={styles.soldOut} aria-label={t(\"bundle.a11y.sold_out\", { name: variantA11y })}>\n {t(\"bundle.stock.sold_out\")}\n </span>\n </div>\n ) : qty <= 0 && normalizedVariantSelectionLimit <= 0 ? (\n <div className={styles.stockLimitContainer}>\n <span className={styles.stockLimitNotice} aria-label={t(\"bundle.a11y.max_available_selected\", { name: variantA11y })}>\n {t(\"bundle.stock.max_added\")}\n </span>\n </div>\n ) : qty <= 0 ? (\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, 1)}\n disabled={submitting || !canIncreaseQuantity}\n className={styles.addToBundleButton}\n aria-label={stockStatusLabel ? `${variantA11y} ${stockStatusLabel.toLowerCase()}` : t(\"bundle.a11y.add_to_bundle\", { name: variantA11y })}\n >\n {t(\"bundle.cta.add_to_bundle\")}\n </button>\n ) : (\n <div className={styles.qtyControlsWrap}>\n <div className={styles.qtyControls}>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty - 1)}\n disabled={submitting || qty <= 0}\n className={styles.qtyButton}\n aria-label={t(\"bundle.a11y.decrease\", { name: variantA11y })}\n >\n −\n </button>\n <span className={styles.qtyValue} aria-label={t(\"bundle.a11y.quantity\", { name: variantA11y, qty })}>\n {qty}\n </span>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty + 1)}\n disabled={submitting || !canIncreaseQuantity}\n className={styles.qtyButton}\n aria-label={stockStatusLabel ? `${variantA11y} ${stockStatusLabel.toLowerCase()}` : t(\"bundle.a11y.increase\", { name: variantA11y })}\n >\n +\n </button>\n </div>\n {stockStatusLabel ? <div className={styles.stockLimitNotice}>{stockStatusLabel}</div> : null}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n\n <footer className={styles.footer} ref={footerRef}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n\n // Per your preference: show discount text only while it's still a placeholder (unlocked display comes later elsewhere).\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const discountText = threshold\n ? t(\"bundle.discount.off_label\", { discount: formatPercent0dp(threshold.discountPercent) })\n : null;\n\n const titleText = isFilled ? variant!.displayName : t(\"bundle.slot\", { slot: idx + 1 });\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && discountText ? `${titleText}. ${t(\"bundle.unlocks\", { discount: discountText })}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • ${t(\"bundle.unlocks\", { discount: discountText })}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && discountText ? (\n <div className={styles.boxItemDiscountText}>{discountText}</div>\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{threshold!.label}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n <div\n className={[styles.ctaTotalsWrap, hasUnlockedFirstDiscount ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={!hasUnlockedFirstDiscount}\n >\n <div className={styles.ctaTotals} aria-label={t(\"bundle.totals\")}>\n {appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>\n {t(\"bundle.discount.badge\", { discount: appliedDiscountPercent })}\n </span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n\n {(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n // Show single button with \"Add X more\" when items remaining\n // Show both buttons side-by-side when minimum is met\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })}\n </button>\n );\n }\n\n return (\n <div className={`${styles.ctaButtonGroup} ${isDualButtonAnimationLoaded ? styles.ctaButtonGroupAnimating : \"\"}`}>\n <button\n type=\"button\"\n onClick={submit}\n disabled={!canSubmit}\n className={`${styles.ctaDualLeft} ${isDualButtonAnimationLoaded ? styles.ctaDualLeftAnimating : \"\"}`}\n >\n <span>{submitting ? t(\"bundle.cta.adding\") : t(\"bundle.cta.add_to_basket\")}</span>\n </button>\n <button\n type=\"button\"\n onClick={submitAndCheckout}\n disabled={!canSubmit}\n className={`${styles.ctaDualRight} ${isDualButtonAnimationLoaded ? styles.ctaDualRightAnimating : \"\"}`}\n >\n <span>{submitting ? t(\"bundle.cta.processing\") : t(\"bundle.cta.checkout\")}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.processing\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.checkout\")}\n </button>\n );\n }\n\n // Default: add_to_cart\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? t(\"bundle.cta.adding\")\n : itemsRemaining > 0\n ? t(\"bundle.cta.add_more\", { count: itemsRemaining, productWord: getProductWord(locale, itemsRemaining) })\n : t(\"bundle.cta.add_to_basket\")}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n {t(\"bundle.powered_by\")} <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\"> BestBundles</a>\n </div>\n </footer>\n </aside>\n </div>\n );\n}\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport { Plus, Trash2 } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport { formatBundleCurrency, getProductWord } from \"../i18n\";\nimport styles from \"./BundleBuilderPanel.module.css\";\n\nexport type BundleBuilderPanelProps = {\n className?: string;\n showRules?: boolean;\n showVariants?: boolean;\n};\n\nexport function BundleBuilderPanel(props: BundleBuilderPanelProps) {\n const {\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n getVariantMaxSelectableQuantity,\n setQuantity,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n locale,\n t,\n } = useBundleBuilder();\n\n const {\n className,\n showRules = true,\n showVariants = true,\n } = props;\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" • \");\n };\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n return formatBundleCurrency(n, currencyCode, locale);\n };\n\n const sortedVariants = useMemo(() => {\n return [...eligibleVariants].sort((a, b) => a.displayName.localeCompare(b.displayName));\n }, [eligibleVariants]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const title = config?.title?.trim() || t(\"bundle.title.default\");\n\n const slotCount = useMemo(() => {\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n\n const variantsRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = variantsRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\\\"${variantId}\\\"]`);\n if (!row) return;\n row.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n };\n\n return (\n <section className={[styles.panel, className].filter(Boolean).join(\" \")} aria-busy={loading}>\n <header className={styles.header}>\n <h2 className={styles.title}>{title}</h2>\n </header>\n\n {loading ? <div className={styles.status}>{t(\"bundle.loading\")}</div> : null}\n {error ? <div className={styles.error}>{error}</div> : null}\n {!loading && config && !config.isActive ? (\n <div className={styles.inactive}>{t(\"bundle.inactive\")}</div>\n ) : 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 <ul className={styles.variantList}>\n {sortedVariants.map((variant) => {\n const qty = selections[variant.id] ?? 0;\n const options = formatVariantOptions(variant.selectedOptions);\n const isUnavailable = variant.availableForSale === false;\n const variantSelectionLimit = getVariantMaxSelectableQuantity(variant.id);\n const normalizedVariantSelectionLimit = variantSelectionLimit == null\n ? Number.POSITIVE_INFINITY\n : variantSelectionLimit;\n const isAtVariantStockLimit = qty >= normalizedVariantSelectionLimit;\n const canIncreaseQuantity = !isUnavailable && !isAtMaxBundleSize && !isAtVariantStockLimit;\n const isClickable = canIncreaseQuantity;\n const stockStatusLabel = !isUnavailable && isAtVariantStockLimit ? t(\"bundle.stock.max_reached\") : null;\n\n return (\n <li\n key={variant.id}\n className={[\n styles.variantRow,\n isClickable ? styles.variantRowInteractive : null,\n qty > 0 ? styles.variantRowSelected : null,\n isUnavailable ? styles.variantRowSoldOut : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={variant.id}\n role={isClickable ? \"button\" : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onClick={\n isClickable\n ? () => {\n setQuantity(variant.id, qty + 1);\n }\n : undefined\n }\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setQuantity(variant.id, qty + 1);\n scrollVariantRowIntoView(variant.id);\n }\n }\n : undefined\n }\n aria-label={\n isUnavailable\n ? t(\"bundle.a11y.sold_out\", { name: variant.displayName })\n : stockStatusLabel\n ? `${variant.displayName} ${stockStatusLabel.toLowerCase()}`\n : t(\"bundle.a11y.add_to_bundle\", { name: variant.displayName })\n }\n >\n <div className={styles.variantMedia}>\n {variant.image?.url ? (\n <img\n src={variant.image.url}\n alt={variant.image.altText ?? variant.displayName}\n width={variant.image.width ?? 64}\n height={variant.image.height ?? 64}\n className={styles.variantImage}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantImageFallback}>{t(\"bundle.item.generic\")}</div>\n )}\n </div>\n <div className={styles.variantContent}>\n <div className={styles.variantHeader}>\n <div className={styles.variantTitle}>{variant.displayName}</div>\n {options ? <div className={styles.variantMeta}>{options}</div> : null}\n </div>\n <div className={styles.variantFooterRow}>\n <div className={styles.variantPrice}>{formatMoney(variant.price)}</div>\n <div className={styles.variantActions}>\n {isUnavailable ? (\n <div className={styles.soldOut} aria-label={t(\"bundle.a11y.sold_out\", { name: variant.displayName })}>\n {t(\"bundle.stock.sold_out\")}\n </div>\n ) : qty <= 0 && normalizedVariantSelectionLimit <= 0 ? (\n <div className={styles.stockLimitNotice} aria-label={t(\"bundle.a11y.max_available_selected\", { name: variant.displayName })}>\n {t(\"bundle.stock.max_added\")}\n </div>\n ) : (\n <div className={styles.qtyActionsWrap}>\n <div className={styles.qtyActions}>\n {qty > 0 ? (\n <button\n type=\"button\"\n className={styles.qtyTrash}\n aria-label={t(\"bundle.a11y.remove_from_bundle\", { name: variant.displayName })}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, 0);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n >\n <Trash2 size={14} />\n </button>\n ) : null}\n <div\n className={[styles.qtyChip, canIncreaseQuantity ? styles.qtyChipInteractive : null].filter(Boolean).join(\" \")}\n aria-label={t(\"bundle.a11y.quantity\", { name: variant.displayName, qty })}\n onClick={canIncreaseQuantity\n ? (e) => {\n e.stopPropagation();\n setQuantity(variant.id, qty + 1);\n }\n : undefined}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n role={canIncreaseQuantity ? \"button\" : undefined}\n tabIndex={canIncreaseQuantity ? 0 : undefined}\n >\n {qty <= 0 ? (\n <span className={styles.qtyChipPlus} aria-hidden=\"true\">\n <Plus size={18} strokeWidth={1.8} />\n </span>\n ) : (\n <>\n <span className={styles.qtyChipValue}>{qty}</span>\n <button\n type=\"button\"\n className={styles.qtyChipClear}\n aria-label={t(\"bundle.a11y.increase\", { name: variant.displayName })}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, qty + 1);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n disabled={!canIncreaseQuantity}\n >\n <Plus size={12} strokeWidth={2} />\n </button>\n </>\n )}\n </div>\n </div>\n {stockStatusLabel ? <div className={styles.stockLimitNotice}>{stockStatusLabel}</div> : null}\n </div>\n )}\n </div>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n </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 type { BundleCartAdapter, BundleCartLineAttribute } from \"../types\";\n\nfunction toProperties(attributes?: BundleCartLineAttribute[]) {\n if (!attributes?.length) return undefined;\n return attributes.reduce<Record<string, string>>((acc, attr) => {\n if (attr?.key) acc[attr.key] = attr.value ?? \"\";\n return acc;\n }, {});\n}\n\nfunction normalizeVariantId(merchandiseId: string) {\n const match = /\\/(\\d+)$/.exec(merchandiseId);\n return match ? match[1] : merchandiseId;\n}\n\nfunction toVariantGid(variantId: string | number | null | undefined) {\n if (variantId == null) return null;\n const raw = String(variantId).trim();\n if (!raw) return null;\n if (raw.startsWith(\"gid://shopify/ProductVariant/\")) return raw;\n return `gid://shopify/ProductVariant/${raw}`;\n}\n\nfunction getShopifyTheme() {\n if (typeof window === \"undefined\") return null;\n return (window as Window & {\n Shopify?: { theme?: { schema_name?: string | null; name?: string | null } };\n }).Shopify?.theme ?? null;\n}\n\nfunction isSleekTheme() {\n const theme = getShopifyTheme();\n if (!theme) return false;\n\n if (theme.schema_name === \"Sleek\") return true;\n return /sleek/i.test(theme.name ?? \"\");\n}\n\nfunction hasSleekCartDrawer() {\n if (typeof document === \"undefined\") return false;\n return !!document.querySelector(\"cart-drawer\");\n}\n\nfunction tryOpenSleekCartDrawer() {\n if (!isSleekTheme() || !hasSleekCartDrawer()) return false;\n\n document.dispatchEvent(new CustomEvent(\"cart:refresh\", {\n bubbles: true,\n detail: { open: true },\n }));\n\n return true;\n}\n\n/**\n * Refreshes the page so the theme re-renders with the updated cart.\n * Liquid themes fetch cart state on load, so a full reload guarantees the cart UI\n * (drawer, icon bubble, etc.) shows the correct state after adding bundle items.\n */\nfunction reloadPageForCartUpdate() {\n window.location.reload();\n}\n\nasync function postCartJson(endpoint: string, payload: Record<string, unknown>) {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(text || `Cart request failed: ${res.status}`);\n }\n return res.json().catch(() => null);\n}\n\nasync function getCartJson() {\n const res = await fetch(\"/cart.js\", {\n method: \"GET\",\n cache: \"no-store\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n });\n if (!res.ok) {\n throw new Error(`Cart request failed: ${res.status}`);\n }\n return res.json() as Promise<{ items?: Array<{ id?: number | string | null; quantity?: number | null }> }>;\n}\n\nexport function createLiquidCartAdapter(): BundleCartAdapter {\n return {\n async linesAdd(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesAddForCheckout(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesUpdate(lines) {\n for (const line of lines) {\n await postCartJson(\"/cart/change.js\", {\n id: line.id,\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n });\n }\n },\n async linesRemove(lineIds) {\n for (const id of lineIds) {\n await postCartJson(\"/cart/change.js\", { id, quantity: 0 });\n }\n },\n async getLineQuantitiesByMerchandiseId() {\n const cart = await getCartJson();\n const quantities: Record<string, number> = {};\n for (const item of cart.items ?? []) {\n const merchandiseId = toVariantGid(item.id);\n if (!merchandiseId) continue;\n const quantity = Number(item.quantity ?? 0);\n if (!Number.isFinite(quantity) || quantity <= 0) continue;\n quantities[merchandiseId] = (quantities[merchandiseId] ?? 0) + Math.floor(quantity);\n }\n return quantities;\n },\n openCartUI() {\n if (tryOpenSleekCartDrawer()) return;\n\n // Reload the page so the theme fetches and displays the updated cart.\n window.setTimeout(() => reloadPageForCartUpdate(), 0);\n },\n navigateToCheckout() {\n // Navigate to Shopify checkout page\n window.location.href = \"/checkout\";\n },\n };\n}\n"],"names":["BundleLineAttributeKeys","fetchActiveBundleConfigs","params","url","json","fetchBundleConfig","fetchBundleConfigStatus","getVariantSelectionLimit","variant","quantity","ANONYMOUS_USER_ID_KEY","getOrCreateAnonymousUserId","existing","newId","cryptoAny","trackEvent","analyticsEndpoint","shop","event","response","error","EN","FR","DE","ES","DICTS","normalizeBundleLocale","raw","value","base","translateBundleUi","locale","key","vars","overrides","template","_a","text","name","formatBundleCurrency","amount","currencyCode","n","getProductWord","count","plural","BundleBuilderContext","createContext","BUNDLE_DRAWER_HASH","EMPTY_ELIGIBLE_VARIANTS","normalizeBundleHandle","getBundleHashHandle","hash","prefix","STYLE_SETTINGS_TO_CSS_VAR","GOOGLE_FONTS_LINK_ID","fontNameToParam","s","injectGoogleFontsLink","styles","body","title","families","href","link","injectStyleVariables","root","cssVar","getEffectiveStyleSettings","configSettings","preview","safeRandomUUID","clampQty","clampToVariantLimit","limit","normalized","shouldUseActiveConfigPreload","allowDrawerWhenInactive","initialData","BundleProvider","props","apiBaseUrl","cartAdapter","configHandle","configFetcher","activeConfigsFetcher","configStatusFetcher","providedAnalyticsEndpoint","inputLocale","messages","children","t","useCallback","normalizedInitialHandle","useActivePreload","isOpen","setIsOpen","useState","submitting","setSubmitting","setError","cartSyncing","setCartSyncing","cartQuantitiesByMerchandiseId","setCartQuantitiesByMerchandiseId","currentHandle","setCurrentHandleState","configCache","setConfigCache","bootstrapLoading","setBootstrapLoading","blockingHandleLoad","setBlockingHandleLoad","statusCheckPending","setStatusCheckPending","pendingOpenHandle","setPendingOpenHandle","selectionsState","setSelectionsState","preloadAbortRef","useRef","handleFetchAbortRef","statusAbortRef","cartSyncSeqRef","currentHandleRef","configCacheRef","bootstrapLoadingRef","openForHandleRef","fetcher","defaultFetchBundleConfig","activePreloadFetcher","statusFetcher","loadCartQuantities","quantities","acc","id","q","refreshCartQuantities","syncSeq","useEffect","setConfigHandle","handle","close","anonymousUserId","trackError","openDrawerOnly","current","applyLatestConfigResponse","prev","next","refreshHandleConfig","options","normalizedHandle","ac","fetchError","message","loadHandle","cachedEntry","openForHandle","source","_b","status","open","toggle","entry","openIfHash","handleInHash","currentEntry","config","eligibleVariants","loading","effective","handlePreviewStyles","win","applyPreviewConfig","previewConfig","previewVariants","maxBundleSize","useMemo","variantSelectionLimitById","baseLimit","inCart","eligibleVariantIdsSet","minRequired","rules","ruleMin","rule","normalizedRuleMin","configuredRaw","configuredMin","setQuantity","merchandiseId","variantLimit","prevQty","requestedDelta","currentBundleSize","sum","variantRemaining","delta","nextQty","nextSelections","rest","nextOrder","remainingToRemove","keptReversed","i","prevBundleSize","nextBundleSize","basePayload","nextSelectionsEntries","nextQuantity","remainingById","remaining","clearSelections","syncCartQuantities","getVariantMaxSelectableQuantity","selections","selectionOrder","bundleSize","canSubmit","performCartAddition","bundleId","bundleTitle","latestCartQuantities","effectiveLimitById","lines","line","byId","grossPrice","price","rulesSorted","a","b","appliedRule","appliedDiscountPercent","pct","discountedPrice","discountedAmount","productVariantIds","discountThresholdIdentifier","discountLabel","isCheckout","addError","rawMessage","isStockError","submit","submitAndCheckout","jsx","useBundleBuilder","ctx","useContext","useBundleBuilderDrawer","BundleButton","tweenFunctions","_c","d","c","p","v","tweenFunctions_1","degreesToRads","degrees","randomRange","min","max","randomInt","ParticleShape","RotationDirection","DEFAULT_FRAME_TIME","Particle","context","getOptions","x","y","colors","initialVelocityX","initialVelocityY","elapsed","gravity","wind","friction","opacity","drawShape","frameTimeMultiplier","rotateDelta","ParticleGenerator","canvas","newParticleX","newParticleY","particlesGenerated","lastNumberOfPieces","run","recycle","numberOfPieces","debug","tweenFunction","tweenDuration","nP","activeCount","tweenedVal","numToAdd","confettiDefaults","tweens.easeInOutQuad","Confetti","opts","computedConfettiDefaults","timestamp","onConfettiComplete","frameRate","lastRunState","lastRecycleState","ref","React","ReactConfettiInternal","extractCanvasProps","confettiOptions","passedProps","canvasStyles","refs","confettiOptionKeys","refProps","prop","val","ReactConfetti","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","iconNode","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","Plus","Search","Trash2","BundleBuilderDrawer","isSearchOpen","setIsSearchOpen","searchQuery","setSearchQuery","searchInputRef","footerRef","celebrationChipRef","windowSize","setWindowSize","confettiKey","setConfettiKey","confettiSource","setConfettiSource","isConfettiActive","setIsConfettiActive","confettiTimerRef","prevBundleSizeForConfettiRef","confettiSettleMs","celebrationKey","setCelebrationKey","celebrationText","setCelebrationText","isCelebrationActive","setIsCelebrationActive","celebrationTimerRef","celebrationDurationMs","DEFAULT_CONFETTI_COLORS","confettiColors","formatPercent0dp","formatVariantOptions","selectedOptions","o","getVariantPrimaryName","getVariantA11yLabel","isMounted","setIsMounted","closeTimerRef","formatMoney","isAtMaxBundleSize","sorted","filteredVariants","tokens","matches","parts","haystack","itemsRemaining","best","r","firstRule","hasUnlockedFirstDiscount","subtotal","total","variantId","qty","discountedTotal","maxRuleSize","filledVariants","thresholdByIndex","map","idx","slotCount","isDualButtonAnimationLoaded","setIsDualButtonAnimationLoaded","prevItemsRemainingRef","wasPositive","panelRef","bodyRef","boxSummaryWindowRef","prevBundleSizeRef","scrollVariantRowIntoView","container","row","padding","maxTop","rowCenterOffset","targetTop","nextTop","onKeyDown","e","onResize","raf","hitThreshold","nextThreshold","targetIdx","el","containerRect","deltaRight","maxLeft","nextLeft","hitRule","k","chipEl","rect","panelRect","originX","originY","jsxs","variantPrimaryName","variantOptionText","variantA11y","variantSelectionLimit","normalizedVariantSelectionLimit","isAtVariantStockLimit","canIncreaseQuantity","stockStatusLabel","discountPercentToUse","originalPriceNumber","hasDiscount","discountedPriceNumber","_d","_","threshold","isFilled","isThreshold","showThreshold","discountText","titleText","Fragment","buttonMode","BundleBuilderPanel","showRules","showVariants","sortedVariants","variantsRef","lineIndex","ruleForLine","isUnavailable","isClickable","toProperties","attributes","attr","normalizeVariantId","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]}