@best-bundles/bundle-ui 0.0.39 → 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/adapters/LiquidAdapter.d.ts.map +1 -1
- package/dist/components/BundleBuilderDrawer.d.ts.map +1 -1
- package/dist/components/BundleBuilderPanel.d.ts.map +1 -1
- package/dist/context/BundleProvider.d.ts +2 -0
- package/dist/context/BundleProvider.d.ts.map +1 -1
- package/dist/index.js +1492 -1376
- package/dist/index.js.map +1 -1
- package/dist/liquid/bundle-ui.iife.css +1 -1
- package/dist/liquid/bundle-ui.iife.js +17 -17
- package/dist/liquid/bundle-ui.iife.js.map +1 -1
- package/dist/liquid/iife.d.ts.map +1 -1
- package/dist/stories/BundleUI.stories.d.ts.map +1 -1
- package/dist/stories/fixtures/productBundle.d.ts.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/stock.d.ts +4 -0
- package/dist/utils/stock.d.ts.map +1 -0
- 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/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","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 { 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 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 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 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 [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 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 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 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 openForHandle(currentHandleRef.current, \"api\");\n }, [openForHandle]);\n\n useEffect(() => {\n openForHandleRef.current = openForHandle;\n }, [openForHandle]);\n\n const toggle = useCallback(() => {\n if (isOpen) {\n close();\n return;\n }\n openForHandle(currentHandleRef.current, \"api\");\n }, [close, isOpen, openForHandle]);\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 eligibleVariantIdsSet = useMemo(() => {\n return new Set(\n eligibleVariants.filter((variant) => variant.availableForSale !== false).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 (!eligibleVariantIdsSet.has(merchandiseId)) {\n if (!loading) return;\n }\n\n const q = clampQty(quantity);\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 delta =\n requestedDelta > 0\n ? Math.min(requestedDelta, Math.max(0, maxBundleSize - currentBundleSize))\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, eligibleVariantIdsSet, loading, maxBundleSize, minRequired, shop]);\n\n useEffect(() => {\n if (loading) return;\n setSelectionsState((prev) => {\n const nextSelectionsEntries = Object.entries(prev.selections).filter(([id]) => eligibleVariantIdsSet.has(id));\n const nextSelections = Object.fromEntries(nextSelectionsEntries) as BundleSelectionState;\n const nextOrder = prev.order.filter((id) => eligibleVariantIdsSet.has(id));\n\n if (\n nextOrder.length === prev.order.length &&\n nextSelectionsEntries.length === Object.keys(prev.selections).length\n ) {\n return prev;\n }\n\n return { selections: nextSelections, order: nextOrder };\n });\n }, [eligibleVariantIdsSet, loading]);\n\n useEffect(() => {\n setSelectionsState({ selections: {}, order: [] });\n }, [currentHandle]);\n\n const clearSelections = useCallback(() => setSelectionsState({ selections: {}, order: [] }), []);\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 || 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, 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 lines = Object.entries(selections)\n .map(([merchandiseId, quantity]) => ({ merchandiseId, quantity: clampQty(quantity) }))\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 [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const variant = byId.get(variantId);\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 options?.onComplete?.();\n } finally {\n setSubmitting(false);\n }\n }, [\n analyticsEndpoint,\n bundleSize,\n canSubmit,\n cartAdapter,\n clearSelections,\n close,\n config,\n currencyCode,\n currentHandle,\n eligibleVariantIdsSet,\n eligibleVariants,\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 loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\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 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 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\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 ? (\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, 1)}\n disabled={submitting || isAtMaxBundleSize}\n className={styles.addToBundleButton}\n aria-label={`Add ${variantA11y} to bundle`}\n >\n Add\n </button>\n ) : (\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 || isAtMaxBundleSize}\n className={styles.qtyButton}\n aria-label={`Increase ${variantA11y}`}\n >\n +\n </button>\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\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 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 isClickable = !isUnavailable && !isAtMaxBundleSize;\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 : `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 ) : (\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, qty > 0 ? styles.qtyChipInteractive : null].filter(Boolean).join(\" \")}\n aria-label={`${variant.displayName} quantity ${qty}`}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, qty + 1);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n role=\"button\"\n tabIndex={0}\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 >\n <Plus size={12} strokeWidth={2} />\n </button>\n </>\n )}\n </div>\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 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\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 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","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","shouldUseActiveConfigPreload","allowDrawerWhenInactive","initialData","BundleProvider","props","apiBaseUrl","cartAdapter","configHandle","configFetcher","activeConfigsFetcher","configStatusFetcher","providedAnalyticsEndpoint","children","normalizedInitialHandle","useActivePreload","isOpen","setIsOpen","useState","submitting","setSubmitting","setError","currentHandle","setCurrentHandleState","configCache","setConfigCache","bootstrapLoading","setBootstrapLoading","blockingHandleLoad","setBlockingHandleLoad","statusCheckPending","setStatusCheckPending","pendingOpenHandle","setPendingOpenHandle","selectionsState","setSelectionsState","preloadAbortRef","useRef","handleFetchAbortRef","statusAbortRef","currentHandleRef","configCacheRef","bootstrapLoadingRef","openForHandleRef","fetcher","defaultFetchBundleConfig","activePreloadFetcher","statusFetcher","useEffect","setConfigHandle","useCallback","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","eligibleVariantIdsSet","variant","minRequired","rules","ruleMin","rule","normalizedRuleMin","configuredRaw","configuredMin","setQuantity","merchandiseId","quantity","q","prevQty","requestedDelta","currentBundleSize","sum","delta","nextQty","nextSelections","rest","nextOrder","remainingToRemove","keptReversed","i","id","prevBundleSize","nextBundleSize","basePayload","nextSelectionsEntries","clearSelections","selections","selectionOrder","bundleSize","canSubmit","performCartAddition","bundleId","bundleTitle","lines","line","byId","grossPrice","variantId","qty","price","rulesSorted","a","b","appliedRule","appliedDiscountPercent","pct","discountedPrice","discountedAmount","productVariantIds","discountThresholdIdentifier","discountLabel","isCheckout","submit","submitAndCheckout","jsx","useBundleBuilder","ctx","useContext","useBundleBuilderDrawer","BundleButton","tweenFunctions","t","_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","itemsRemaining","best","r","firstRule","hasUnlockedFirstDiscount","subtotal","total","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","discountPercentToUse","originalPriceNumber","hasDiscount","discountedPriceNumber","_d","_","threshold","isFilled","isThreshold","showThreshold","discountText","titleText","Fragment","buttonMode","BundleBuilderPanel","showRules","showVariants","sortedVariants","variantsRef","lineIndex","ruleForLine","isUnavailable","isClickable","toProperties","attributes","acc","attr","normalizeVariantId","getShopifyTheme","isSleekTheme","theme","hasSleekCartDrawer","tryOpenSleekCartDrawer","reloadPageForCartUpdate","postCartJson","endpoint","payload","res","text","createLiquidCartAdapter","items","lineIds"],"mappings":"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","x_google_ignoreList":[9,10,11,12,13,14,15,16,17]}
|
|
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]}
|