@best-bundles/bundle-ui 0.0.40 → 0.0.41
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 +282 -282
- package/dist/index.js.map +1 -1
- package/dist/liquid/bundle-ui.iife.js +13 -13
- package/dist/liquid/bundle-ui.iife.js.map +1 -1
- package/dist/utils/stock.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/constants.ts","../src/api/fetchActiveBundleConfigs.ts","../src/api/fetchBundleConfig.ts","../src/api/fetchBundleConfigStatus.ts","../src/utils/stock.ts","../src/utils/analytics.ts","../src/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\n const quantity = Number(variant.sellableOnlineQuantity ?? 0);\n if (!Number.isFinite(quantity)) return 0;\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/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]}
|