@best-bundles/bundle-ui 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/constants.ts","../src/api/fetchBundleConfig.ts","../src/context/BundleProvider.tsx","../src/hooks/useBundleBuilder.ts","../src/hooks/useBundleBuilderDrawer.ts","../src/components/BundleButton.tsx","../../../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/search.js","../src/components/BundleBuilderDrawer.tsx"],"sourcesContent":["export const BundleLineAttributeKeys = {\n bundleId: \"_bundle_id\",\n bundleConfig: \"_bundle_config\",\n bundleSource: \"_bundle_source\",\n} as const;\n\n","import type { PublicBundleConfigResponse } from \"../types\";\n\nexport async function fetchBundleConfig(params: {\n apiBaseUrl: string;\n shop: string;\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\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\n","import React, { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { BundleLineAttributeKeys } from \"../constants\";\nimport { fetchBundleConfig as defaultFetchBundleConfig } from \"../api/fetchBundleConfig\";\nimport type { BundleCartAdapter, BundleConfig, BundleEligibleVariant, PublicBundleConfigResponse } from \"../types\";\n\ntype BundleProviderData = {\n currencyCode: string | null;\n config: BundleConfig;\n eligibleVariants: BundleEligibleVariant[];\n};\n\ntype BundleSelectionState = Record<string, number>; // merchandiseId -> qty\ntype BundleSelectionOrder = string[]; // merchandiseId (variant GID) per-item, in first-added -> last-added order\n\nexport type BundleProviderProps = {\n apiBaseUrl: string;\n shop: string;\n cartAdapter: BundleCartAdapter;\n\n /**\n * v1 default is \"default\" to mirror the app's current single-config endpoint.\n * Kept as a prop to avoid an API break when the public endpoint supports multiple handles.\n */\n configHandle?: string;\n\n /**\n * Optional override for Storybook/tests so we can avoid network calls.\n */\n initialData?: BundleProviderData;\n\n /**\n * Optional fetcher override for Storybook/tests.\n */\n configFetcher?: (params: { apiBaseUrl: string; shop: string; signal?: AbortSignal }) => Promise<PublicBundleConfigResponse>;\n\n children: React.ReactNode;\n};\n\nexport type BundleBuilderContextValue = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => 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};\n\nexport const BundleBuilderContext = createContext<BundleBuilderContextValue | null>(null);\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\nexport function BundleProvider(props: BundleProviderProps) {\n const {\n apiBaseUrl,\n shop,\n cartAdapter,\n configHandle = \"default\",\n initialData,\n configFetcher,\n children,\n } = props;\n\n const [isOpen, setIsOpen] = useState(false);\n const [loading, setLoading] = useState(!initialData);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const [currencyCode, setCurrencyCode] = useState<string | null>(initialData?.currencyCode ?? null);\n const [config, setConfig] = useState<BundleConfig | null>(initialData?.config ?? null);\n const [eligibleVariants, setEligibleVariants] = useState<BundleEligibleVariant[]>(\n initialData?.eligibleVariants ?? [],\n );\n\n const [selectionsState, setSelectionsState] = useState<{ selections: BundleSelectionState; order: BundleSelectionOrder }>(\n () => ({ selections: {}, order: [] }),\n );\n\n const abortRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (initialData) return;\n\n abortRef.current?.abort();\n const ac = new AbortController();\n abortRef.current = ac;\n\n const fetcher = configFetcher ?? defaultFetchBundleConfig;\n\n setLoading(true);\n setError(null);\n fetcher({ apiBaseUrl, shop, signal: ac.signal })\n .then((json) => {\n if (!json.ok) {\n setError(json.error || \"Failed to load bundle config.\");\n setConfig(null);\n setEligibleVariants([]);\n setCurrencyCode(null);\n return;\n }\n setCurrencyCode(json.currencyCode ?? null);\n setConfig(json.config);\n setEligibleVariants(json.eligibleVariants ?? []);\n })\n .catch((e: unknown) => {\n const msg = e instanceof Error ? e.message : \"Failed to load bundle config.\";\n setError(msg);\n setConfig(null);\n setEligibleVariants([]);\n setCurrencyCode(null);\n })\n .finally(() => setLoading(false));\n\n return () => ac.abort();\n }, [apiBaseUrl, shop, initialData, configFetcher]);\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((v) => !v), []);\n\n const setQuantity = useCallback((merchandiseId: string, quantity: number) => {\n const q = clampQty(quantity);\n setSelectionsState((prev) => {\n const prevQty = prev.selections[merchandiseId] ?? 0;\n const delta = q - prevQty;\n\n // selections\n let nextSelections: BundleSelectionState;\n if (q <= 0) {\n const { [merchandiseId]: _, ...rest } = prev.selections;\n nextSelections = rest;\n } else if (prevQty === q) {\n nextSelections = prev.selections;\n } else {\n nextSelections = { ...prev.selections, [merchandiseId]: q };\n }\n\n // order\n let nextOrder = prev.order;\n if (delta > 0) {\n // Add N items to the end.\n nextOrder = [...prev.order, ...Array.from({ length: delta }, () => merchandiseId)];\n } else if (delta < 0) {\n // Remove N most-recent occurrences of this variant.\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 return { selections: nextSelections, order: nextOrder };\n });\n }, []);\n\n const clearSelections = useCallback(() => setSelectionsState({ selections: {}, order: [] }), []);\n\n const selections = selectionsState.selections;\n const selectionOrder = selectionsState.order;\n\n const bundleSize = useMemo(() => Object.values(selections).reduce((sum, q) => sum + (q || 0), 0), [selections]);\n\n const minRequired = useMemo(() => {\n const rules = config?.rules ?? [];\n const min = rules.length ? Math.min(...rules.map((r) => r.minBundleSize)) : 2;\n return Number.isFinite(min) && min > 0 ? min : 2;\n }, [config]);\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 submit = useCallback(async () => {\n if (!canSubmit || !config) return;\n\n const bundleId = safeRandomUUID();\n const lines = Object.entries(selections)\n .map(([merchandiseId, quantity]) => ({ merchandiseId, quantity: clampQty(quantity) }))\n .filter((l) => l.quantity > 0)\n .map((l) => ({\n merchandiseId: l.merchandiseId,\n quantity: l.quantity,\n attributes: [\n { key: BundleLineAttributeKeys.bundleId, value: bundleId },\n { key: BundleLineAttributeKeys.bundleConfig, value: configHandle },\n { key: BundleLineAttributeKeys.bundleSource, value: \"bundle_builder\" },\n ],\n }));\n\n if (!lines.length) return;\n\n setSubmitting(true);\n try {\n await cartAdapter.linesAdd(lines);\n clearSelections();\n close();\n cartAdapter.openCartUI?.();\n } finally {\n setSubmitting(false);\n }\n }, [canSubmit, cartAdapter, clearSelections, close, config, configHandle, selections]);\n\n const value: BundleBuilderContextValue = useMemo(\n () => ({\n isOpen,\n open,\n close,\n toggle,\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 }),\n [\n isOpen,\n open,\n close,\n toggle,\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 ],\n );\n\n return <BundleBuilderContext.Provider value={value}>{children}</BundleBuilderContext.Provider>;\n}\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","/**\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: \"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","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { 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 } = useBundleBuilder();\n\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const searchInputRef = useRef<HTMLInputElement | null>(null);\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\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\n const minRuleDiscountPercent = useMemo(() => {\n const r = rulesSorted[0];\n if (!r) return null;\n const pct = Number.parseFloat(r.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [rulesSorted]);\n\n const badgeDiscountPercent = appliedDiscountPercent ?? minRuleDiscountPercent;\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 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 (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 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 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 <aside ref={panelRef} className={[styles.panel, isOpen ? styles.panelOpen : styles.panelClosed].filter(Boolean).join(\" \")} tabIndex={-1}>\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 {!loading && config && !config.isActive ? <p className={styles.error}>Bundles are not active.</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 // Price display:\n // - Always show a \"discounted\" price based on the unlocked discount, falling back to the minimum rule discount.\n // - Show the original price with a strikethrough when a discount applies.\n const discountPercentToUse = badgeDiscountPercent;\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 key={v.id} className={styles.variantRow} data-variant-row={v.id}>\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 {qty <= 0 ? (\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, 1)}\n disabled={submitting}\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}\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}>\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, itemsRemaining <= 0 ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={itemsRemaining > 0}\n >\n <div className={styles.ctaTotals} aria-label=\"Totals\">\n {badgeDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>\n {appliedDiscountPercent ? \"Unlocked \" : \"\"}\n {badgeDiscountPercent}% off\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 <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 </footer>\n </aside>\n </div>\n );\n}\n\n"],"names":["BundleLineAttributeKeys","fetchBundleConfig","params","url","json","BundleBuilderContext","createContext","safeRandomUUID","cryptoAny","clampQty","n","BundleProvider","props","apiBaseUrl","shop","cartAdapter","configHandle","initialData","configFetcher","children","isOpen","setIsOpen","useState","loading","setLoading","submitting","setSubmitting","error","setError","currencyCode","setCurrencyCode","config","setConfig","eligibleVariants","setEligibleVariants","selectionsState","setSelectionsState","abortRef","useRef","useEffect","_a","ac","fetcher","defaultFetchBundleConfig","e","msg","open","useCallback","close","toggle","v","setQuantity","merchandiseId","quantity","q","prev","prevQty","delta","nextSelections","_","rest","nextOrder","remainingToRemove","keptReversed","i","id","clearSelections","selections","selectionOrder","bundleSize","useMemo","sum","minRequired","rules","min","r","canSubmit","submit","bundleId","lines","value","jsx","useBundleBuilder","ctx","useContext","useBundleBuilderDrawer","BundleButton","styles","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","prop","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","iconNode","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","Search","BundleBuilderDrawer","isSearchOpen","setIsSearchOpen","searchQuery","setSearchQuery","searchInputRef","formatVariantOptions","selectedOptions","opts","o","name","_b","getVariantPrimaryName","getVariantA11yLabel","isMounted","setIsMounted","closeTimerRef","formatMoney","amount","title","sorted","a","b","filteredVariants","tokens","matches","parts","haystack","t","rulesSorted","itemsRemaining","appliedRule","best","appliedDiscountPercent","pct","minRuleDiscountPercent","badgeDiscountPercent","subtotal","byId","total","variantId","qty","price","discountedTotal","maxRuleSize","filledVariants","thresholdByIndex","map","idx","slotCount","panelRef","bodyRef","boxSummaryWindowRef","prevBundleSizeRef","scrollVariantRowIntoView","container","row","c","padding","maxTop","rowCenterOffset","targetTop","nextTop","onKeyDown","raf","hitThreshold","nextThreshold","targetIdx","el","containerRect","deltaRight","maxLeft","nextLeft","jsxs","variantPrimaryName","variantOptionText","variantA11y","discountPercentToUse","originalPriceNumber","hasDiscount","discountedPriceNumber","_d","_c","variant","threshold","isFilled","isThreshold","showThreshold","discountText","titleText","Fragment"],"mappings":"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","x_google_ignoreList":[6,7,8,9,10]}
1
+ {"version":3,"file":"index.js","sources":["../src/constants.ts","../src/api/fetchBundleConfig.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/search.js","../src/components/BundleBuilderDrawer.tsx"],"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 { PublicBundleConfigResponse } from \"../types\";\n\nexport async function fetchBundleConfig(params: {\n apiBaseUrl: string;\n shop: string;\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\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\n","import React, { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { BundleLineAttributeKeys } from \"../constants\";\nimport { fetchBundleConfig as defaultFetchBundleConfig } from \"../api/fetchBundleConfig\";\nimport type { BundleCartAdapter, BundleConfig, BundleEligibleVariant, PublicBundleConfigResponse } from \"../types\";\n\ntype BundleProviderData = {\n currencyCode: string | null;\n config: BundleConfig;\n eligibleVariants: BundleEligibleVariant[];\n};\n\ntype BundleSelectionState = Record<string, number>; // merchandiseId -> qty\ntype BundleSelectionOrder = string[]; // merchandiseId (variant GID) per-item, in first-added -> last-added order\n\nexport type BundleProviderProps = {\n apiBaseUrl: string;\n shop: string;\n cartAdapter: BundleCartAdapter;\n\n /**\n * v1 default is \"default\" to mirror the app's current single-config endpoint.\n * Kept as a prop to avoid an API break when the public endpoint supports multiple handles.\n */\n configHandle?: string;\n\n /**\n * Optional override for Storybook/tests so we can avoid network calls.\n */\n initialData?: BundleProviderData;\n\n /**\n * Optional fetcher override for Storybook/tests.\n */\n configFetcher?: (params: { apiBaseUrl: string; shop: string; signal?: AbortSignal }) => Promise<PublicBundleConfigResponse>;\n\n children: React.ReactNode;\n};\n\nexport type BundleBuilderContextValue = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => 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};\n\nexport const BundleBuilderContext = createContext<BundleBuilderContextValue | null>(null);\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\nexport function BundleProvider(props: BundleProviderProps) {\n const {\n apiBaseUrl,\n shop,\n cartAdapter,\n configHandle = \"default\",\n initialData,\n configFetcher,\n children,\n } = props;\n\n const [isOpen, setIsOpen] = useState(false);\n const [loading, setLoading] = useState(!initialData);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const [currencyCode, setCurrencyCode] = useState<string | null>(initialData?.currencyCode ?? null);\n const [config, setConfig] = useState<BundleConfig | null>(initialData?.config ?? null);\n const [eligibleVariants, setEligibleVariants] = useState<BundleEligibleVariant[]>(\n initialData?.eligibleVariants ?? [],\n );\n\n const [selectionsState, setSelectionsState] = useState<{ selections: BundleSelectionState; order: BundleSelectionOrder }>(\n () => ({ selections: {}, order: [] }),\n );\n\n const abortRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (initialData) return;\n\n abortRef.current?.abort();\n const ac = new AbortController();\n abortRef.current = ac;\n\n const fetcher = configFetcher ?? defaultFetchBundleConfig;\n\n setLoading(true);\n setError(null);\n fetcher({ apiBaseUrl, shop, signal: ac.signal })\n .then((json) => {\n if (!json.ok) {\n setError(json.error || \"Failed to load bundle config.\");\n setConfig(null);\n setEligibleVariants([]);\n setCurrencyCode(null);\n return;\n }\n setCurrencyCode(json.currencyCode ?? null);\n setConfig(json.config);\n setEligibleVariants(json.eligibleVariants ?? []);\n })\n .catch((e: unknown) => {\n const msg = e instanceof Error ? e.message : \"Failed to load bundle config.\";\n setError(msg);\n setConfig(null);\n setEligibleVariants([]);\n setCurrencyCode(null);\n })\n .finally(() => setLoading(false));\n\n return () => ac.abort();\n }, [apiBaseUrl, shop, initialData, configFetcher]);\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((v) => !v), []);\n\n const setQuantity = useCallback((merchandiseId: string, quantity: number) => {\n const q = clampQty(quantity);\n setSelectionsState((prev) => {\n const prevQty = prev.selections[merchandiseId] ?? 0;\n const delta = q - prevQty;\n\n // selections\n let nextSelections: BundleSelectionState;\n if (q <= 0) {\n const { [merchandiseId]: _, ...rest } = prev.selections;\n nextSelections = rest;\n } else if (prevQty === q) {\n nextSelections = prev.selections;\n } else {\n nextSelections = { ...prev.selections, [merchandiseId]: q };\n }\n\n // order\n let nextOrder = prev.order;\n if (delta > 0) {\n // Add N items to the end.\n nextOrder = [...prev.order, ...Array.from({ length: delta }, () => merchandiseId)];\n } else if (delta < 0) {\n // Remove N most-recent occurrences of this variant.\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 return { selections: nextSelections, order: nextOrder };\n });\n }, []);\n\n const clearSelections = useCallback(() => setSelectionsState({ selections: {}, order: [] }), []);\n\n const selections = selectionsState.selections;\n const selectionOrder = selectionsState.order;\n\n const bundleSize = useMemo(() => Object.values(selections).reduce((sum, q) => sum + (q || 0), 0), [selections]);\n\n const minRequired = useMemo(() => {\n const rules = config?.rules ?? [];\n const min = rules.length ? Math.min(...rules.map((r) => r.minBundleSize)) : 2;\n return Number.isFinite(min) && min > 0 ? min : 2;\n }, [config]);\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 submit = useCallback(async () => {\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((l) => l.quantity > 0)\n .map((l) => ({\n merchandiseId: l.merchandiseId,\n quantity: l.quantity,\n attributes: [\n { key: BundleLineAttributeKeys.bundleId, value: bundleId },\n { key: BundleLineAttributeKeys.bundleConfig, value: configHandle },\n { key: BundleLineAttributeKeys.bundleSource, value: \"bundle_builder\" },\n ...(bundleTitle ? [{ key: BundleLineAttributeKeys.bundleTitle, value: bundleTitle }] : []),\n ],\n }));\n\n if (!lines.length) return;\n\n setSubmitting(true);\n try {\n await cartAdapter.linesAdd(lines);\n clearSelections();\n close();\n cartAdapter.openCartUI?.();\n } finally {\n setSubmitting(false);\n }\n }, [canSubmit, cartAdapter, clearSelections, close, config, configHandle, selections]);\n\n const value: BundleBuilderContextValue = useMemo(\n () => ({\n isOpen,\n open,\n close,\n toggle,\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 }),\n [\n isOpen,\n open,\n close,\n toggle,\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 ],\n );\n\n return <BundleBuilderContext.Provider value={value}>{children}</BundleBuilderContext.Provider>;\n}\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: \"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","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport Confetti from \"react-confetti\";\nimport { 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 } = 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\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 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\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\n const minRuleDiscountPercent = useMemo(() => {\n const r = rulesSorted[0];\n if (!r) return null;\n const pct = Number.parseFloat(r.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [rulesSorted]);\n\n const badgeDiscountPercent = appliedDiscountPercent ?? minRuleDiscountPercent;\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 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 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 hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n if (!hitThreshold) return;\n\n const footerEl = footerRef.current;\n if (!footerEl) return;\n\n const rect = footerEl.getBoundingClientRect();\n // Use a narrow source near the top-center of the footer so it looks like it \"shoots out\".\n const source = {\n x: rect.left + rect.width / 2 - 2,\n y: rect.top + 4,\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 }, [bundleSize, isOpen, rulesSorted]);\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={[\n \"#2563eb\", // blue-600\n \"#3b82f6\", // blue-500\n \"#60a5fa\", // blue-400\n \"#93c5fd\", // blue-300\n \"#bae6fd\", // blue-200\n \"#e0f2fe\" // blue-100\n ]}\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: 2147483647 }}\n />\n ) : null}\n <aside ref={panelRef} className={[styles.panel, isOpen ? styles.panelOpen : styles.panelClosed].filter(Boolean).join(\" \")} tabIndex={-1}>\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 {!loading && config && !config.isActive ? <p className={styles.error}>Bundles are not active.</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 // Price display:\n // - Always show a \"discounted\" price based on the unlocked discount, falling back to the minimum rule discount.\n // - Show the original price with a strikethrough when a discount applies.\n const discountPercentToUse = badgeDiscountPercent;\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 key={v.id} className={styles.variantRow} data-variant-row={v.id}>\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 {qty <= 0 ? (\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, 1)}\n disabled={submitting}\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}\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, itemsRemaining <= 0 ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={itemsRemaining > 0}\n >\n <div className={styles.ctaTotals} aria-label=\"Totals\">\n {badgeDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>\n {appliedDiscountPercent ? \"Unlocked \" : \"\"}\n {badgeDiscountPercent}% off\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 <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 </footer>\n </aside>\n </div>\n );\n}\n\n"],"names":["BundleLineAttributeKeys","fetchBundleConfig","params","url","json","BundleBuilderContext","createContext","safeRandomUUID","cryptoAny","clampQty","n","BundleProvider","props","apiBaseUrl","shop","cartAdapter","configHandle","initialData","configFetcher","children","isOpen","setIsOpen","useState","loading","setLoading","submitting","setSubmitting","error","setError","currencyCode","setCurrencyCode","config","setConfig","eligibleVariants","setEligibleVariants","selectionsState","setSelectionsState","abortRef","useRef","useEffect","_a","ac","fetcher","defaultFetchBundleConfig","e","msg","open","useCallback","close","toggle","v","setQuantity","merchandiseId","quantity","q","prev","prevQty","delta","nextSelections","_","rest","nextOrder","remainingToRemove","keptReversed","i","id","clearSelections","selections","selectionOrder","bundleSize","useMemo","sum","minRequired","rules","min","r","canSubmit","submit","bundleId","bundleTitle","lines","l","value","jsx","useBundleBuilder","ctx","useContext","useBundleBuilderDrawer","BundleButton","styles","tweenFunctions","b","_c","d","c","a","p","s","tweenFunctions_1","degreesToRads","degrees","randomRange","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","_b","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","Search","BundleBuilderDrawer","isSearchOpen","setIsSearchOpen","searchQuery","setSearchQuery","searchInputRef","footerRef","windowSize","setWindowSize","confettiKey","setConfettiKey","confettiSource","setConfettiSource","isConfettiActive","setIsConfettiActive","confettiTimerRef","prevBundleSizeForConfettiRef","confettiSettleMs","formatVariantOptions","selectedOptions","o","name","getVariantPrimaryName","getVariantA11yLabel","isMounted","setIsMounted","closeTimerRef","formatMoney","amount","title","sorted","filteredVariants","tokens","matches","parts","haystack","t","rulesSorted","itemsRemaining","appliedRule","best","appliedDiscountPercent","pct","minRuleDiscountPercent","badgeDiscountPercent","subtotal","byId","total","variantId","qty","price","discountedTotal","maxRuleSize","filledVariants","thresholdByIndex","map","idx","slotCount","panelRef","bodyRef","boxSummaryWindowRef","prevBundleSizeRef","scrollVariantRowIntoView","container","row","padding","maxTop","rowCenterOffset","targetTop","nextTop","onKeyDown","onResize","raf","hitThreshold","nextThreshold","targetIdx","el","containerRect","deltaRight","maxLeft","nextLeft","footerEl","rect","source","k","jsxs","variantPrimaryName","variantOptionText","variantA11y","discountPercentToUse","originalPriceNumber","hasDiscount","discountedPriceNumber","_d","variant","threshold","isFilled","isThreshold","showThreshold","discountText","titleText","Fragment"],"mappings":"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","x_google_ignoreList":[6,7,8,9,10,11,12]}
@@ -1 +1 @@
1
- {"version":3,"file":"BundleUI.stories.d.ts","sourceRoot":"","sources":["../../src/stories/BundleUI.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAKvD,QAAA,MAAM,IAAI,EAAE,IAEX,CAAC;AAEF,eAAe,IAAI,CAAC;AA6JpB,eAAO,MAAM,eAAe,EAAE,QAwB7B,CAAC;AAwBF,eAAO,MAAM,oBAAoB,EAAE,QAyBlC,CAAC;AAUF,eAAO,MAAM,qBAAqB,EAAE,QAyBnC,CAAC"}
1
+ {"version":3,"file":"BundleUI.stories.d.ts","sourceRoot":"","sources":["../../src/stories/BundleUI.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAKvD,QAAA,MAAM,IAAI,EAAE,IAEX,CAAC;AAEF,eAAe,IAAI,CAAC;AA8JpB,eAAO,MAAM,eAAe,EAAE,QAwB7B,CAAC;AAwBF,eAAO,MAAM,oBAAoB,EAAE,QAyBlC,CAAC;AAUF,eAAO,MAAM,qBAAqB,EAAE,QAyBnC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@best-bundles/bundle-ui",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "files": [
@@ -34,7 +34,6 @@
34
34
  "react-dom": ">=18"
35
35
  },
36
36
  "devDependencies": {
37
- "@vitejs/plugin-react": "^4.7.0",
38
37
  "@storybook/addon-essentials": "^8.6.0",
39
38
  "@storybook/addon-interactions": "^8.6.0",
40
39
  "@storybook/addon-links": "^8.6.0",
@@ -43,10 +42,14 @@
43
42
  "@storybook/test": "^8.6.0",
44
43
  "@types/react": "^18.3.25",
45
44
  "@types/react-dom": "^18.3.7",
45
+ "@vitejs/plugin-react": "^4.7.0",
46
46
  "lucide-react": "^0.515.0",
47
47
  "storybook": "^8.6.0",
48
48
  "typescript": "^5.9.3",
49
49
  "vite": "^6.3.6",
50
50
  "vite-plugin-css-injected-by-js": "^3.5.2"
51
+ },
52
+ "dependencies": {
53
+ "react-confetti": "^6.4.0"
51
54
  }
52
55
  }