@anpayeras/agnostic-checkout 0.1.0
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/README.md +439 -0
- package/dist/index.cjs +1622 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +321 -0
- package/dist/index.d.ts +321 -0
- package/dist/index.js +1564 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/theme/color-utils.ts","../src/theme/tokens.ts","../src/plugins/discount-plugin.tsx","../src/plugins/cart-edit-plugin.tsx","../src/core/checkout-context.tsx","../src/hooks/useCheckout.ts","../src/utils/utils.ts","../src/components/Checkout.tsx","../src/theme/theme-provider.tsx","../src/core/i18n-context.tsx","../src/locales/en.ts","../src/locales/es.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/plugins/plugin-context.tsx","../src/components/checkout-content.tsx","../src/components/OrderSummary.tsx","../src/components/PaymentMethods.tsx","../src/components/FeedbackScreen.tsx","../src/components/button.tsx","../src/components/CheckoutLayout.tsx","../src/components/dev-tools.tsx","../src/components/OrderSidebarSummary.tsx","../src/components/MobileOrderBar.tsx","../src/components/mobile-bar.tsx"],"sourcesContent":["/**\n * Color manipulation utilities for the Brand Auto Theme system.\n * All functions work with hex color strings (#RRGGBB or #RGB).\n */\n\ninterface RGB {\n r: number;\n g: number;\n b: number;\n}\n\nexport function hexToRgb(hex: string): RGB {\n const clean = hex.replace(\"#\", \"\");\n const full = clean.length === 3\n ? clean.split(\"\").map((c) => c + c).join(\"\")\n : clean;\n\n return {\n r: parseInt(full.slice(0, 2), 16),\n g: parseInt(full.slice(2, 4), 16),\n b: parseInt(full.slice(4, 6), 16),\n };\n}\n\nexport function rgbToHex({ r, g, b }: RGB): string {\n const toHex = (n: number) => Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, \"0\");\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\n/**\n * Calculates relative luminance using sRGB coefficients (W3C formula).\n * Returns a value between 0 (black) and 1 (white).\n */\nexport function getLuminance(hex: string): number {\n const { r, g, b } = hexToRgb(hex);\n const [rs, gs, bs] = [r / 255, g / 255, b / 255].map((c) =>\n c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4)\n );\n return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;\n}\n\n/**\n * Returns #000000 or #FFFFFF based on which provides better contrast\n * against the given background color.\n */\nexport function getContrastColor(hex: string): string {\n return getLuminance(hex) > 0.179 ? \"#000000\" : \"#FFFFFF\";\n}\n\n/**\n * Returns true if the color is considered \"dark\" (luminance < 0.5).\n */\nexport function isDark(hex: string): boolean {\n return getLuminance(hex) < 0.179;\n}\n\n/**\n * Darkens a hex color by a given amount (0–100).\n */\nexport function darken(hex: string, amount: number): string {\n const rgb = hexToRgb(hex);\n const factor = 1 - amount / 100;\n return rgbToHex({\n r: rgb.r * factor,\n g: rgb.g * factor,\n b: rgb.b * factor,\n });\n}\n\n/**\n * Lightens a hex color by a given amount (0–100).\n */\nexport function lighten(hex: string, amount: number): string {\n const rgb = hexToRgb(hex);\n const factor = amount / 100;\n return rgbToHex({\n r: rgb.r + (255 - rgb.r) * factor,\n g: rgb.g + (255 - rgb.g) * factor,\n b: rgb.b + (255 - rgb.b) * factor,\n });\n}\n\n/**\n * Mixes two hex colors by a given ratio (0 = first color, 1 = second color).\n */\nexport function mix(hex1: string, hex2: string, ratio: number): string {\n const c1 = hexToRgb(hex1);\n const c2 = hexToRgb(hex2);\n return rgbToHex({\n r: c1.r + (c2.r - c1.r) * ratio,\n g: c1.g + (c2.g - c1.g) * ratio,\n b: c1.b + (c2.b - c1.b) * ratio,\n });\n}\n","import type { CSSProperties } from \"react\";\nimport { getContrastColor } from \"./color-utils\";\n\nexport interface CheckoutThemeColors {\n primary: string;\n background: string;\n surface: string;\n text: string;\n border: string;\n success: string;\n error: string;\n}\n\nexport interface CheckoutTheme {\n colors: Partial<CheckoutThemeColors>;\n radius: string;\n fontFamily: string;\n}\n\nexport type CheckoutThemeName = \"light\" | \"dark\" | \"minimal\" | \"corporate\" | \"neon\";\n\nconst light: CheckoutTheme = {\n colors: {\n primary: \"#6366f1\",\n background: \"#f8fafc\",\n surface: \"#ffffff\",\n text: \"#0f172a\",\n border: \"#e2e8f0\",\n success: \"#22c55e\",\n error: \"#ef4444\",\n },\n radius: \"0.75rem\",\n fontFamily: \"Inter, system-ui, sans-serif\",\n};\n\nconst dark: CheckoutTheme = {\n colors: {\n primary: \"#818cf8\",\n background: \"#0f172a\",\n surface: \"#1e293b\",\n text: \"#f1f5f9\",\n border: \"#334155\",\n success: \"#34d399\",\n error: \"#fb7185\",\n },\n radius: \"0.75rem\",\n fontFamily: \"Inter, system-ui, sans-serif\",\n};\n\nconst minimal: CheckoutTheme = {\n colors: {\n primary: \"#0f172a\",\n background: \"#ffffff\",\n surface: \"#ffffff\",\n text: \"#0f172a\",\n border: \"#e5e7eb\",\n success: \"#059669\",\n error: \"#dc2626\",\n },\n radius: \"0.375rem\",\n fontFamily: \"'Helvetica Neue', Helvetica, Arial, sans-serif\",\n};\n\nconst corporate: CheckoutTheme = {\n colors: {\n primary: \"#1d4ed8\",\n background: \"#f0f4f8\",\n surface: \"#ffffff\",\n text: \"#1e293b\",\n border: \"#cbd5e1\",\n success: \"#16a34a\",\n error: \"#dc2626\",\n },\n radius: \"0.5rem\",\n fontFamily: \"'Segoe UI', Roboto, 'Helvetica Neue', sans-serif\",\n};\n\nconst neon: CheckoutTheme = {\n colors: {\n primary: \"#a855f7\",\n background: \"#0a0a0a\",\n surface: \"#171717\",\n text: \"#fafafa\",\n border: \"#2e2e2e\",\n success: \"#22d3ee\",\n error: \"#f43f5e\",\n },\n radius: \"1rem\",\n fontFamily: \"'Space Grotesk', system-ui, sans-serif\",\n};\n\nexport const checkoutThemes: Record<CheckoutThemeName, CheckoutTheme> = {\n light,\n dark,\n minimal,\n corporate,\n neon,\n};\n\nexport const defaultTheme = light;\n\nexport function mergeTheme(\n base: CheckoutTheme,\n overrides?: Partial<CheckoutTheme>\n): CheckoutTheme {\n if (!overrides) return base;\n\n return {\n colors: { ...base.colors, ...overrides.colors },\n radius: overrides.radius ?? base.radius,\n fontFamily: overrides.fontFamily ?? base.fontFamily,\n };\n}\n\nexport function createCssVars(theme: CheckoutTheme): CSSProperties {\n return {\n \"--color-primary\": theme.colors.primary,\n \"--color-background\": theme.colors.background,\n \"--color-surface\": theme.colors.surface,\n \"--color-text\": theme.colors.text,\n \"--color-border\": theme.colors.border,\n \"--color-success\": theme.colors.success,\n \"--color-error\": theme.colors.error,\n \"--theme-radius\": theme.radius,\n \"--theme-font\": theme.fontFamily,\n } as CSSProperties;\n}\n\n/**\n * Generates a complete CheckoutTheme from a single brand color.\n * Uses the brand color as `primary` and auto-generates all other tokens.\n */\nexport function generateBrandTheme(brandColor: string): CheckoutTheme {\n const background = \"#FFFFFF\";\n const text = getContrastColor(background);\n\n return {\n colors: {\n primary: brandColor,\n background,\n surface: \"#F9FAFB\",\n text,\n border: \"#E5E7EB\",\n success: \"#16A34A\",\n error: \"#DC2626\",\n },\n radius: \"0.75rem\",\n fontFamily: \"Inter, system-ui, sans-serif\",\n };\n}\n\n/**\n * Priority chain: customTheme overrides → brandColor theme → preset theme\n */\nexport function resolveTheme(\n theme?: CheckoutThemeName | Partial<CheckoutTheme>,\n brandColor?: string,\n customTheme?: Partial<CheckoutTheme>\n): CheckoutTheme {\n let base: CheckoutTheme;\n\n if (brandColor) {\n base = generateBrandTheme(brandColor);\n } else if (typeof theme === \"string\") {\n base = checkoutThemes[theme] ?? defaultTheme;\n } else {\n base = mergeTheme(defaultTheme, theme);\n }\n\n return mergeTheme(base, customTheme);\n}","import { useState } from \"react\";\nimport { Tag, Trash2, Loader2 } from \"lucide-react\";\nimport type { CheckoutPlugin, PluginSlotProps } from \"./types\";\nimport type { EventHandler } from \"../core/event-system\";\n\ninterface CouponInputProps {\n onApply: (code: string) => void;\n t: PluginSlotProps[\"t\"];\n compact?: boolean;\n}\n\nconst CouponInput = ({ onApply, t, compact }: CouponInputProps) => {\n const [code, setCode] = useState(\"\");\n const [status, setStatus] = useState<\"idle\" | \"loading\">(\"idle\");\n\n const handleApply = () => {\n if (!code.trim()) return;\n setStatus(\"loading\");\n onApply(code.trim());\n setCode(\"\");\n setTimeout(() => setStatus(\"idle\"), 500);\n };\n\n const isBtnDisabled = status === \"loading\" || !code.trim();\n\n return (\n <div className=\"flex gap-2\">\n <div className=\"flex-1 flex items-center gap-2 border border-border/60 focus-within:border-primary/50 focus-within:ring-2 focus-within:ring-primary/5 rounded-xs px-3 py-2 transition-all bg-white\">\n <Tag className={`${compact ? \"w-3 h-3\" : \"w-3.5 h-3.5\"} text-text/30 shrink-0`} />\n <input\n type=\"text\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleApply()}\n placeholder={t.couponPlaceholder}\n className={`bg-transparent outline-none w-full placeholder:text-text/30 text-text font-semibold ${compact ? \"text-xs\" : \"text-sm\"}`}\n />\n </div>\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={isBtnDisabled}\n className={`font-bold bg-primary text-surface rounded-xs hover:brightness-110 disabled:opacity-40 transition-all ${compact ? \"px-3 py-2 text-xs\" : \"px-4 py-2 text-sm\"} ${isBtnDisabled ? \"cursor-not-allowed\" : \"cursor-pointer\"}`}\n >\n {status === \"loading\" ? (\n <Loader2 className=\"w-3.5 h-3.5 animate-spin\" />\n ) : t.couponApply}\n </button>\n </div>\n );\n};\n\nconst RemoveCouponButton = ({ onRemove, t }: { onRemove: () => void; t: PluginSlotProps[\"t\"] }) => {\n return (\n <button\n type=\"button\"\n onClick={onRemove}\n className=\"p-0.5 rounded text-error hover:text-error hover:bg-error/10 transition-colors\"\n aria-label={t.couponRemove}\n >\n <Trash2 className=\"w-3 h-3\" />\n </button>\n );\n};\n\nexport function createDiscountPlugin(emit: EventHandler): CheckoutPlugin {\n return {\n id: \"discount\",\n slots: {\n sidebarBeforeTotals: ({ step, t }) => {\n if (step !== \"review\") return null;\n return (\n <div className=\"mb-6\">\n <CouponInput\n onApply={(code) => emit({ type: \"COUPON_APPLY_REQUESTED\", code })}\n t={t}\n compact\n />\n </div>\n );\n },\n\n mobileBarExpanded: ({ step, t }) => {\n if (step !== \"review\") return null;\n\n return (\n <div className=\"mb-3 pb-3 border-b border-border/40\">\n <CouponInput\n onApply={(code) => emit({ type: \"COUPON_APPLY_REQUESTED\", code })}\n t={t}\n />\n </div>\n );\n },\n\n totalsDiscountAction: ({ step, t }) => {\n if (step !== \"review\") return null;\n\n return (\n <RemoveCouponButton\n onRemove={() => emit({ type: \"COUPON_REMOVE_REQUESTED\" })}\n t={t}\n />\n );\n },\n },\n };\n}\n","import { useState } from \"react\";\nimport { Minus, Plus, Trash2, Loader2 } from \"lucide-react\";\nimport type { CheckoutPlugin, PluginItemSlotProps } from \"./types\";\nimport type { EventHandler } from \"../core/event-system\";\n\n// ─── Options ───────────────────────────────────────────────────────────────\n\nexport interface CartEditPluginOptions {\n allowRemove?: boolean;\n allowQuantityEdit?: boolean;\n minQuantity?: number;\n maxQuantity?: number;\n}\n\n// ─── Stepper UI ────────────────────────────────────────────────────────────\n\ninterface StepperProps {\n quantity: number;\n min: number;\n max: number;\n loading: boolean;\n onChange: (qty: number) => void;\n}\n\nconst QuantityStepper = ({ quantity, min, max, loading, onChange }: StepperProps) => {\n return (\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center border border-border/60 rounded-xl bg-background/30 p-0.5 overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => onChange(quantity - 1)}\n disabled={loading || quantity <= min}\n className=\"w-8 h-8 flex items-center justify-center text-text/60 hover:bg-border/30 rounded-lg transition-colors disabled:opacity-30\"\n >\n <Minus className=\"w-3.5 h-3.5\" />\n </button>\n <span className=\"text-sm font-bold w-7 text-center select-none\">{quantity}</span>\n <button\n type=\"button\"\n onClick={() => onChange(quantity + 1)}\n disabled={loading || quantity >= max}\n className=\"w-8 h-8 flex items-center justify-center text-text/60 hover:bg-border/30 rounded-lg transition-colors disabled:opacity-30\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n {loading && <Loader2 className=\"w-4 h-4 animate-spin text-primary\" />}\n </div>\n );\n};\n\n// ─── Remove Button ─────────────────────────────────────────────────────────\n\ninterface RemoveButtonProps {\n loading: boolean;\n onRemove: () => void;\n label: string;\n}\n\nconst RemoveButton = ({ loading, onRemove, label }: RemoveButtonProps) => {\n return (\n <button\n type=\"button\"\n onClick={onRemove}\n disabled={loading}\n className=\"p-2 -mr-1 rounded-full text-text/20 hover:text-error hover:bg-error/10 transition-all disabled:opacity-50\"\n aria-label={label}\n >\n {loading ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Trash2 className=\"w-5 h-5\" />\n )}\n </button>\n );\n};\n\n// ─── Stateful wrapper (tracks loading per item) ────────────────────────────\n\n/**\n * We need component-level state for loading indicators.\n * Since plugin slot renderers are plain functions, we use a wrapper component.\n */\n\nconst CartEditItemActions = ({\n props,\n emit,\n options,\n}: {\n props: PluginItemSlotProps;\n emit: EventHandler;\n options: Required<CartEditPluginOptions>;\n}) => {\n const [loading, setLoading] = useState(false);\n const { item, t } = props;\n\n const handleQtyChange = (qty: number) => {\n if (qty < options.minQuantity || qty > options.maxQuantity) return;\n setLoading(true);\n emit({ type: \"ITEM_QUANTITY_UPDATE_REQUESTED\", itemId: item.id, quantity: qty });\n // Loading resets when parent provides new items (re-render)\n setTimeout(() => setLoading(false), 2000);\n };\n\n if (!options.allowQuantityEdit) {\n return <span className=\"text-sm text-text/40 mt-1 block font-semibold uppercase tracking-wider\">{t.quantityShort}: {item.quantity}</span>;\n }\n\n return (\n <div className=\"mt-3\">\n <QuantityStepper\n quantity={item.quantity}\n min={options.minQuantity}\n max={options.maxQuantity}\n loading={loading}\n onChange={handleQtyChange}\n />\n </div>\n );\n};\n\nconst CartEditItemEnd = ({\n props,\n emit,\n options,\n}: {\n props: PluginItemSlotProps;\n emit: EventHandler;\n options: Required<CartEditPluginOptions>;\n}) => {\n const [loading, setLoading] = useState(false);\n const { item, t } = props;\n\n if (!options.allowRemove) return null;\n\n const handleRemove = () => {\n setLoading(true);\n emit({ type: \"ITEM_REMOVE_REQUESTED\", itemId: item.id });\n setTimeout(() => setLoading(false), 2000);\n };\n\n return (\n <RemoveButton\n loading={loading}\n onRemove={handleRemove}\n label={t.removeItem}\n />\n );\n};\n\n// ─── Plugin Factory ────────────────────────────────────────────────────────\n\nexport function createCartEditPlugin(\n emit: EventHandler,\n options?: CartEditPluginOptions\n): CheckoutPlugin {\n const opts: Required<CartEditPluginOptions> = {\n allowRemove: !!options?.allowRemove,\n allowQuantityEdit: !!options?.allowQuantityEdit,\n minQuantity: options?.minQuantity ?? 1,\n maxQuantity: options?.maxQuantity ?? 99,\n };\n\n return {\n id: \"cart-edit\",\n slots: {\n orderItemActions: (props) => (\n <CartEditItemActions props={props} emit={emit} options={opts} />\n ),\n\n orderItemEnd: (props) => (\n <CartEditItemEnd props={props} emit={emit} options={opts} />\n ),\n },\n };\n}\n","import React, { createContext, useContext, useReducer, useCallback, useEffect } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { CheckoutState } from \"./checkout-machine\";\nimport type { CheckoutItem, PaymentMethod, CheckoutTotals, CartController, CartState, PaymentResult } from \"./types\";\nimport type { PaymentProvider } from \"./provider.interface\";\nimport type { CheckoutEvent, EventHandler } from \"./event-system\";\nimport type { CheckoutTheme } from \"../theme/tokens\";\n\ninterface CheckoutContextState {\n items: CheckoutItem[];\n paymentMethods: PaymentMethod[];\n provider: PaymentProvider;\n currency: string;\n locale: string;\n step: CheckoutState;\n selectedMethodId: string | null;\n totals: CheckoutTotals;\n cartController?: CartController;\n theme?: CheckoutTheme;\n error: string | null;\n paymentResult?: PaymentResult;\n}\n\ntype Action =\n | { type: \"SET_STEP\"; step: CheckoutState }\n | { type: \"SELECT_METHOD\"; methodId: string }\n | { type: \"SET_ERROR\"; error: string | null }\n | { type: \"SET_CART\"; cartState: CartState }\n | { type: \"SYNC_PROPS\"; items: CheckoutItem[]; totals: CheckoutTotals }\n | { type: \"SET_PAYMENT_RESULT\"; result: PaymentResult };\n\nconst CheckoutContext = createContext<{\n state: CheckoutContextState;\n dispatch: React.Dispatch<Action>;\n emitEvent: (event: CheckoutEvent) => void;\n eventLog: string[];\n} | null>(null);\n\nconst checkoutReducer = (state: CheckoutContextState, action: Action): CheckoutContextState => {\n switch (action.type) {\n case \"SET_STEP\":\n return { ...state, step: action.step };\n case \"SELECT_METHOD\":\n return { ...state, selectedMethodId: action.methodId };\n case \"SET_ERROR\":\n return { ...state, error: action.error };\n case \"SET_CART\":\n return { ...state, items: action.cartState.items, totals: action.cartState.totals };\n case \"SYNC_PROPS\":\n return { ...state, items: action.items, totals: action.totals };\n case \"SET_PAYMENT_RESULT\":\n return { ...state, paymentResult: action.result };\n default:\n return state;\n }\n};\n\nexport const CheckoutProvider = ({\n children,\n config,\n initialStatus,\n onEvent,\n}: {\n children: ReactNode;\n config: Omit<CheckoutContextState, \"step\" | \"selectedMethodId\" | \"error\" | \"paymentResult\">;\n initialStatus?: Extract<PaymentResult, { status: \"success\" | \"error\" | \"pending\" }>;\n onEvent?: EventHandler;\n}) => {\n const [state, dispatch] = useReducer(checkoutReducer, {\n ...config,\n step: initialStatus ? initialStatus.status : \"review\",\n selectedMethodId: null,\n error: null,\n paymentResult: initialStatus,\n });\n\n useEffect(() => {\n dispatch({ type: \"SYNC_PROPS\", items: config.items, totals: config.totals });\n }, [config.items, config.totals]);\n\n const [eventLog, setEventLog] = React.useState<string[]>([]);\n\n const emitEvent = useCallback(\n (event: CheckoutEvent) => {\n onEvent?.(event);\n setEventLog((prev) =>\n [`[${new Date().toLocaleTimeString()}] ${event.type}`, ...prev].slice(0, 20)\n );\n },\n [onEvent]\n );\n\n return (\n <CheckoutContext.Provider value={{ state, dispatch, emitEvent, eventLog }}>{children}</CheckoutContext.Provider>\n );\n};\n\nexport const useCheckoutContext = () => {\n const context = useContext(CheckoutContext);\n\n if (!context) {\n throw new Error(\"useCheckoutContext must be used within a CheckoutProvider\");\n }\n\n return context;\n};\n","import { useCheckoutContext } from \"../core/checkout-context\";\nimport type { CheckoutState } from \"../core/checkout-machine\";\n\nexport const useCheckout = () => {\n const { state, dispatch, emitEvent } = useCheckoutContext();\n\n const setStep = (step: CheckoutState) => {\n dispatch({ type: \"SET_STEP\", step });\n emitEvent({ type: \"STEP_CHANGED\", step });\n };\n\n const selectMethod = (methodId: string) => {\n dispatch({ type: \"SELECT_METHOD\", methodId });\n emitEvent({ type: \"PAYMENT_METHOD_SELECTED\", methodId });\n };\n\n const submitPayment = async (data: unknown) => {\n if (!state.selectedMethodId) return;\n\n emitEvent({ type: \"PAYMENT_SUBMITTED\" });\n setStep(\"processing\");\n dispatch({ type: \"SET_ERROR\", error: null });\n\n try {\n const result = await state.provider.createPayment(data);\n dispatch({ type: \"SET_PAYMENT_RESULT\", result });\n\n console.log(result)\n switch (result.status) {\n case \"success\":\n emitEvent({ type: \"PAYMENT_SUCCESS\", transactionId: \"unknown\" });\n setStep(\"success\");\n break;\n case \"pending\":\n emitEvent({ type: \"STEP_CHANGED\", step: \"pending\" });\n setStep(\"pending\");\n break;\n case \"redirect\":\n emitEvent({ type: \"STEP_CHANGED\", step: \"redirect\" });\n setStep(\"redirect\");\n break;\n case \"error\": {\n const errMsg = result.feedback?.description ?? \"Payment failed\";\n dispatch({ type: \"SET_ERROR\", error: errMsg });\n emitEvent({ type: \"PAYMENT_ERROR\", error: errMsg });\n setStep(\"error\");\n break;\n }\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n dispatch({ type: \"SET_ERROR\", error: message });\n emitEvent({ type: \"PAYMENT_ERROR\", error: message });\n setStep(\"error\");\n }\n };\n\n const setError = (error: string) => {\n dispatch({ type: \"SET_ERROR\", error });\n emitEvent({ type: \"PAYMENT_ERROR\", error });\n };\n\n const updateQuantity = async (id: string, qty: number) => {\n if (!state.cartController) return;\n const cartState = await state.cartController.updateQuantity(id, qty);\n dispatch({ type: \"SET_CART\", cartState });\n };\n\n const removeItem = async (id: string) => {\n if (!state.cartController) return;\n const cartState = await state.cartController.removeItem(id);\n dispatch({ type: \"SET_CART\", cartState });\n };\n\n const applyCoupon = async (code: string): Promise<boolean> => {\n if (!state.cartController) return false;\n try {\n const cartState = await state.cartController.applyCoupon(code);\n dispatch({ type: \"SET_CART\", cartState });\n return true;\n } catch {\n return false;\n }\n };\n\n const removeCoupon = async (): Promise<boolean> => {\n if (!state.cartController?.removeCoupon) return false;\n try {\n const cartState = await state.cartController.removeCoupon();\n dispatch({ type: \"SET_CART\", cartState });\n return true;\n } catch {\n return false;\n }\n };\n\n return {\n ...state,\n setStep,\n selectMethod,\n submitPayment,\n setError,\n updateQuantity,\n removeItem,\n applyCoupon,\n removeCoupon,\n hasCartController: !!state.cartController,\n hasRemoveCoupon: !!state.cartController?.removeCoupon,\n };\n};\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport const isPaymentStep = (step: string) =>\n step === \"payment_method\" || step === \"payment_details\";\n\nexport const isReviewStep = (step: string) => step === \"review\";\n\nexport const formatNumber = (n: number, currency: string) =>\n new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency }).format(n);","import React from \"react\";\nimport { ThemeProvider } from \"../theme/theme-provider\";\nimport { CheckoutProvider } from \"../core/checkout-context\";\nimport { I18nProvider } from \"../core/i18n-context\";\nimport { PluginProvider } from \"../plugins/plugin-context\";\nimport type { CheckoutProps } from \"./types\";\nimport { CheckoutContent } from \"./checkout-content\";\n\nexport const Checkout: React.FC<CheckoutProps> = ({\n items,\n totals,\n paymentMethods,\n provider,\n currency,\n locale = \"es\",\n theme = \"light\",\n brandColor,\n customTheme,\n onEvent,\n cartController,\n initialState,\n devTools,\n messages,\n formatters,\n plugins = [],\n}) => {\n return (\n <ThemeProvider theme={theme} brandColor={brandColor} customTheme={customTheme}>\n <I18nProvider locale={locale} currency={currency} messages={messages} formatters={formatters}>\n <PluginProvider plugins={plugins}>\n <CheckoutProvider\n config={{ items, totals, paymentMethods, provider, currency, locale, cartController }}\n initialStatus={initialState}\n onEvent={onEvent}\n >\n <CheckoutContent devTools={devTools} />\n </CheckoutProvider>\n </PluginProvider>\n </I18nProvider>\n </ThemeProvider>\n );\n};\n","import React from \"react\";\nimport type { CheckoutTheme, CheckoutThemeName } from \"./tokens\";\nimport { createCssVars, resolveTheme } from \"./tokens\";\n\ninterface ThemeProviderProps {\n theme?: CheckoutThemeName | Partial<CheckoutTheme>;\n brandColor?: string;\n customTheme?: Partial<CheckoutTheme>;\n children: React.ReactNode;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme, brandColor, customTheme, children }) => {\n const resolved = resolveTheme(theme, brandColor, customTheme);\n const cssVars = createCssVars(resolved);\n\n return (\n <div\n style={cssVars}\n className=\"bg-background text-text font-(--theme-font) h-full w-full\"\n >\n {children}\n </div>\n );\n};\n","import { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { CheckoutMessages, CheckoutFormatters } from \"../locales/types\";\nimport { resolveMessages } from \"../locales\";\nimport { formatNumber } from \"../utils/utils\";\n\ninterface I18nContextValue {\n t: CheckoutMessages;\n fmt: (amount: number) => string;\n}\n\nconst I18nContext = createContext<I18nContextValue | null>(null);\n\nexport interface I18nProviderProps {\n locale: string;\n currency: string;\n messages?: Partial<CheckoutMessages>;\n formatters?: CheckoutFormatters;\n children: ReactNode;\n}\n\nexport const I18nProvider = ({ locale, currency, messages, formatters, children }: I18nProviderProps) => {\n const t = resolveMessages(locale, messages);\n\n const fmt = formatters?.currency\n ? formatters.currency\n : (amount: number) => formatNumber(amount, currency);\n\n return (\n <I18nContext.Provider value={{ t, fmt }}>\n {children}\n </I18nContext.Provider>\n );\n};\n\nexport const useI18n = (): I18nContextValue => {\n const ctx = useContext(I18nContext);\n if (!ctx) {\n throw new Error(\"useI18n must be used within an I18nProvider\");\n }\n return ctx;\n};\n","import type { CheckoutMessages } from \"./types\";\n\nexport const en: CheckoutMessages = {\n // Order Summary\n orderSummary: \"Order Summary\",\n quantity: \"Qty\",\n quantityShort: \"Qty\",\n removeItem: \"Remove item\",\n\n // Totals\n subtotal: \"Subtotal\",\n discount: \"Discount\",\n shipping: \"Shipping\",\n shippingFree: \"Free\",\n taxes: \"Taxes\",\n total: \"Total\",\n\n // Coupon\n couponPlaceholder: \"Promo code\",\n couponApply: \"Apply\",\n couponApplied: \"✓ Coupon applied\",\n couponInvalid: \"✗ Invalid code\",\n couponRemove: \"Remove coupon\",\n\n // Sidebar\n orderSummaryTitle: \"Order summary\",\n securePayment: \"SECURE SSL PAYMENT\",\n\n // Actions\n continueToPay: \"Continue to payment\",\n payNow: \"Pay now\",\n pay: \"Pay\",\n processing: \"Processing…\",\n continueNow: \"Continue now\",\n\n // Payment Methods\n paymentMethod: \"Payment method\",\n back: \"Back\",\n completeDetails: \"Complete details\",\n selectMethod: \"Select a method\",\n\n // Processing\n processingPayment: \"Processing payment…\",\n processingDescription: \"Don't close or reload this window.\",\n\n // Redirect\n redirecting: \"Redirecting…\",\n redirectDescription: \"You will be redirected to complete your payment securely.\",\n\n // Mobile bar\n showOrderDetails: \"Show order details\",\n hideOrderDetails: \"Hide order details\",\n continue: \"Continue\",\n};\n","import type { CheckoutMessages } from \"./types\";\n\nexport const es: CheckoutMessages = {\n // Order Summary\n orderSummary: \"Resumen del pedido\",\n quantity: \"Cant\",\n quantityShort: \"Cant\",\n removeItem: \"Eliminar item\",\n\n // Totals\n subtotal: \"Subtotal\",\n discount: \"Descuento\",\n shipping: \"Envío\",\n shippingFree: \"Gratis\",\n taxes: \"Impuestos\",\n total: \"Total\",\n\n // Coupon\n couponPlaceholder: \"Código promo\",\n couponApply: \"Aplicar\",\n couponApplied: \"✓ Cupón aplicado\",\n couponInvalid: \"✗ Código inválido\",\n couponRemove: \"Eliminar cupón\",\n\n // Sidebar\n orderSummaryTitle: \"Resumen del pedido\",\n securePayment: \"PAGO SEGURO SSL\",\n\n // Actions\n continueToPay: \"Continuar al pago\",\n payNow: \"Pagar ahora\",\n pay: \"Pagar\",\n processing: \"Procesando…\",\n continueNow: \"Continuar ahora\",\n\n // Payment Methods\n paymentMethod: \"Método de pago\",\n back: \"Volver\",\n completeDetails: \"Completa los datos\",\n selectMethod: \"Selecciona un método\",\n\n // Processing\n processingPayment: \"Procesando pago…\",\n processingDescription: \"No cierres ni recargues esta ventana.\",\n\n // Redirect\n redirecting: \"Redirigiendo…\",\n redirectDescription: \"Serás redirigido para completar tu pago de forma segura.\",\n\n // Mobile bar\n showOrderDetails: \"Ver detalle del pedido\",\n hideOrderDetails: \"Ocultar detalle del pedido\",\n continue: \"Continuar\",\n};\n","import type { CheckoutMessages } from \"./types\";\n\nexport const ptBR: CheckoutMessages = {\n // Order Summary\n orderSummary: \"Resumo do pedido\",\n quantity: \"Qtd\",\n quantityShort: \"Qtd\",\n removeItem: \"Remover item\",\n\n // Totals\n subtotal: \"Subtotal\",\n discount: \"Desconto\",\n shipping: \"Frete\",\n shippingFree: \"Grátis\",\n taxes: \"Impostos\",\n total: \"Total\",\n\n // Coupon\n couponPlaceholder: \"Código promocional\",\n couponApply: \"Aplicar\",\n couponApplied: \"✓ Cupom aplicado\",\n couponInvalid: \"✗ Código inválido\",\n couponRemove: \"Remover cupom\",\n\n // Sidebar\n orderSummaryTitle: \"Resumo do pedido\",\n securePayment: \"PAGAMENTO SEGURO SSL\",\n\n // Actions\n continueToPay: \"Continuar para pagamento\",\n payNow: \"Pagar agora\",\n pay: \"Pagar\",\n processing: \"Processando…\",\n continueNow: \"Continuar agora\",\n\n // Payment Methods\n paymentMethod: \"Método de pagamento\",\n back: \"Voltar\",\n completeDetails: \"Complete os dados\",\n selectMethod: \"Selecione um método\",\n\n // Processing\n processingPayment: \"Processando pagamento…\",\n processingDescription: \"Não feche nem recarregue esta janela.\",\n\n // Redirect\n redirecting: \"Redirecionando…\",\n redirectDescription: \"Você será redirecionado para completar seu pagamento com segurança.\",\n\n // Mobile bar\n showOrderDetails: \"Ver detalhes do pedido\",\n hideOrderDetails: \"Ocultar detalhes do pedido\",\n continue: \"Continuar\",\n};\n","import { en } from \"./en\";\nimport { es } from \"./es\";\nimport { ptBR } from \"./pt-BR\";\nimport type { CheckoutLocale, CheckoutMessages } from \"./types\";\n\nexport type { CheckoutMessages, CheckoutLocale, CheckoutFormatters, SupportedCurrency } from \"./types\";\n\nconst localeMap: Record<string, CheckoutMessages> = {\n en,\n es,\n \"pt-BR\": ptBR,\n};\n\nconst SUPPORTED_LOCALES = Object.keys(localeMap);\n\n/**\n * Detects the best matching locale from the browser's language settings.\n * Maps browser languages (e.g. \"es-AR\", \"pt-BR\", \"en-US\") to supported locales.\n */\nexport function detectLocale(): string {\n if (typeof navigator === \"undefined\") return \"en\";\n\n const languages = navigator.languages ?? [navigator.language];\n\n for (const lang of languages) {\n // Exact match first (e.g. \"pt-BR\")\n if (SUPPORTED_LOCALES.includes(lang)) return lang;\n\n // Base language match (e.g. \"es-AR\" → \"es\", \"pt\" → \"pt-BR\")\n const base = lang.split(\"-\")[0];\n if (SUPPORTED_LOCALES.includes(base)) return base;\n\n // Special case: any \"pt\" variant → \"pt-BR\"\n if (base === \"pt\") return \"pt-BR\";\n }\n\n return \"en\";\n}\n\n/**\n * Resolves \"auto\" to a detected locale, or returns the locale as-is.\n */\nexport function resolveLocale(locale: CheckoutLocale | string): string {\n return locale === \"auto\" ? detectLocale() : locale;\n}\n\nexport function getMessages(locale: CheckoutLocale | string): CheckoutMessages {\n const resolved = resolveLocale(locale);\n return localeMap[resolved] ?? en;\n}\n\nexport function resolveMessages(\n locale: CheckoutLocale | string,\n overrides?: Partial<CheckoutMessages>\n): CheckoutMessages {\n const base = getMessages(locale);\n if (!overrides) return base;\n return { ...base, ...overrides };\n}\n","import { createContext, Fragment, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { CheckoutPlugin, PluginSlotProps, PluginItemSlotProps, PluginContextValue } from \"./types\";\n\nconst PluginContext = createContext<PluginContextValue>({ plugins: [] });\n\nexport const PluginProvider = ({ plugins, children }: { plugins: CheckoutPlugin[]; children: ReactNode }) => {\n const value = useMemo(() => ({ plugins }), [plugins]);\n return <PluginContext.Provider value={value}>{children}</PluginContext.Provider>;\n};\n\nexport const usePlugins = () => useContext(PluginContext);\n\nexport function renderSlot(\n plugins: CheckoutPlugin[],\n slotName: keyof CheckoutPlugin[\"slots\"],\n props: PluginSlotProps\n): ReactNode[] {\n return plugins\n .filter((p) => p.slots[slotName])\n .map((p) => {\n const Slot = p.slots[slotName]!;\n return <Fragment key={p.id}>{(Slot as (props: PluginSlotProps) => ReactNode)(props)}</Fragment>;\n });\n}\n\nexport function renderItemSlot(\n plugins: CheckoutPlugin[],\n slotName: keyof CheckoutPlugin[\"slots\"],\n props: PluginItemSlotProps\n): ReactNode[] {\n return plugins\n .filter((p) => p.slots[slotName])\n .map((p) => {\n const Slot = p.slots[slotName]!;\n return <Fragment key={p.id}>{(Slot as (props: PluginItemSlotProps) => ReactNode)(props)}</Fragment>;\n });\n}\n","import { Loader2 } from \"lucide-react\";\nimport { useCheckoutContext } from \"../core/checkout-context\";\nimport { useI18n } from \"../core/i18n-context\";\nimport { OrderSummary } from \"./OrderSummary\";\nimport { PaymentMethods } from \"./PaymentMethods\";\nimport { FeedbackScreen } from \"./FeedbackScreen\";\nimport { CheckoutLayout } from \"./CheckoutLayout\";\nimport DevTools from \"./dev-tools\";\nimport { OrderSidebarSummary } from \"./OrderSidebarSummary\";\nimport { MobileBar } from \"./mobile-bar\";\nimport { isPaymentStep, isReviewStep } from \"../utils/utils\";\n\nexport const CheckoutContent = ({ devTools }: { devTools?: boolean }) => {\n const { state } = useCheckoutContext();\n const { t } = useI18n();\n const { step, paymentResult } = state;\n\n const renderStep = () => {\n switch (step) {\n case \"review\":\n return <OrderSummary />;\n case \"payment_method\":\n return <PaymentMethods />;\n case \"processing\":\n return (\n <div className=\"flex flex-col items-center justify-center py-16 gap-4\">\n <Loader2 className=\"w-12 h-12 animate-spin text-primary\" />\n <p className=\"font-medium text-lg animate-pulse\">{t.processingPayment}</p>\n <p className=\"text-sm text-text/50\">{t.processingDescription}</p>\n </div>\n );\n case \"success\":\n case \"pending\":\n case \"error\":\n return (\n <FeedbackScreen\n variant={paymentResult?.status}\n title={paymentResult?.feedback?.title ?? ''}\n description={paymentResult?.feedback?.title}\n actions={paymentResult?.feedback?.actions}\n />\n );\n case \"redirect\": {\n const result = paymentResult?.status === \"redirect\" ? paymentResult : undefined;\n const fb = result?.feedback;\n return (\n <FeedbackScreen\n variant=\"redirect\"\n title={fb?.title ?? t.redirecting}\n description={fb?.description ?? t.redirectDescription}\n actions={\n fb?.actions ?? [\n {\n label: t.continueNow,\n variant: \"solid\",\n onPress: () => {\n if (result?.url) window.location.href = result.url;\n },\n },\n ]\n }\n />\n );\n }\n\n default:\n return <OrderSummary />;\n }\n };\n\n return (\n <div className=\"h-[80vh] md:h-full w-full flex flex-col\">\n <CheckoutLayout sidebar={(isReviewStep(step) || isPaymentStep(step)) ? <OrderSidebarSummary /> : undefined}>\n {renderStep()}\n </CheckoutLayout>\n\n {(isReviewStep(step) || isPaymentStep(step)) && <MobileBar step={step} />}\n\n {devTools && <DevTools />}\n </div>\n );\n};","import { useCheckout } from \"../hooks/useCheckout\";\nimport { useI18n } from \"../core/i18n-context\";\nimport { usePlugins, renderItemSlot } from \"../plugins/plugin-context\";\nimport { cn } from \"../utils/utils\";\n\nexport const OrderSummary = () => {\n const { items, step } = useCheckout();\n const { t, fmt } = useI18n();\n const { plugins } = usePlugins();\n\n const hasItemActions = plugins.some((p) => p.slots.orderItemActions);\n const hasItemEnd = plugins.some((p) => p.slots.orderItemEnd);\n\n const slotProps = { items, totals: { subtotal: 0, total: 0 }, step, t, fmt };\n\n return (\n <div className=\"flex flex-col h-full animate-in fade-in slide-in-from-bottom-4 duration-500 overflow-hidden\">\n <h2 className=\"text-xl font-bold mb-6 shrink-0\">{t.orderSummary}</h2>\n\n <div className=\"flex-1 overflow-y-auto pr-3 custom-scrollbar flex flex-col divide-y divide-border/30\">\n {items.map((item) => {\n const discountedRow = !!item.discount;\n const itemSlotProps = { ...slotProps, item };\n\n return (\n <div\n key={item.id}\n className=\"py-5 flex items-start gap-5 transition-opacity\"\n >\n {item.image && (\n <img\n src={item.image}\n alt={item.name}\n className=\"w-20 h-20 rounded-2xl object-cover border border-border/40 shrink-0 shadow-sm transition-transform hover:scale-105 duration-300\"\n />\n )}\n\n <div className=\"flex-1 min-w-0\">\n <span className=\"font-bold text-lg text-text/90 block truncate leading-tight mb-1\">{item.name}</span>\n\n {/* Plugin: orderItemActions (stepper, etc.) or fallback static qty */}\n {hasItemActions ? (\n renderItemSlot(plugins, \"orderItemActions\", itemSlotProps)\n ) : (\n <span className=\"text-sm text-text/40 mt-1 block font-semibold uppercase tracking-wider\">{t.quantityShort}: {item.quantity}</span>\n )}\n\n {discountedRow && (\n <div className=\"flex items-center gap-2 mt-3 flex-wrap\">\n {item.discount!.label && (\n <span className=\"text-[10px] font-black uppercase tracking-widest bg-success/10 text-success px-2 py-1 rounded-md border border-success/20\">\n {item.discount!.label}\n </span>\n )}\n <span className=\"text-xs text-success font-black\">\n {item.discount!.type === \"percentage\"\n ? `-${item.discount!.value}%`\n : `-${fmt(item.discount!.value)}`}\n </span>\n </div>\n )}\n </div>\n\n <div className=\"flex flex-col items-end gap-2 shrink-0\">\n {/* Plugin: orderItemEnd (remove button, etc.) */}\n {hasItemEnd && renderItemSlot(plugins, \"orderItemEnd\", itemSlotProps)}\n\n {discountedRow ? (\n <div className={cn(\"flex flex-col items-end\", hasItemEnd ? \"\" : \"mt-1\")}>\n <span className=\"text-xs line-through text-text/30 font-medium tracking-tight\">\n {fmt(item.unitPrice * item.quantity)}\n </span>\n <span className=\"text-lg font-black text-success tracking-tight\">{fmt(item.total)}</span>\n </div>\n ) : (\n <span className={cn(\"text-lg font-bold text-text/80 tracking-tight\", hasItemEnd ? \"\" : \"mt-1\")}>{fmt(item.total)}</span>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n","import React, { useState, useCallback } from \"react\";\nimport { useCheckout } from \"../hooks/useCheckout\";\nimport { useI18n } from \"../core/i18n-context\";\nimport { cn } from \"../utils/utils\";\nimport { ChevronLeft, CreditCard, Wallet, Landmark, Loader2 } from \"lucide-react\";\n\nconst getDefaultIcon = (type: string) => {\n switch (type) {\n case \"card\": return <CreditCard className=\"w-5 h-5\" />;\n case \"wallet\": return <Wallet className=\"w-5 h-5\" />;\n case \"bank\": return <Landmark className=\"w-5 h-5\" />;\n default: return <Wallet className=\"w-5 h-5\" />;\n }\n};\n\nexport const PaymentMethods = () => {\n const { paymentMethods, selectedMethodId, selectMethod, setStep, submitPayment, totals, error } =\n useCheckout();\n const { t, fmt } = useI18n();\n\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [readyMap, setReadyMap] = useState<Record<string, boolean>>({});\n\n const selectedMethod = paymentMethods.find((m) => m.id === selectedMethodId);\n\n const isReady =\n selectedMethod\n ? selectedMethod.renderComponent\n ? !!readyMap[selectedMethod.id]\n : true\n : false;\n\n const handleSelectMethod = (id: string) => {\n selectMethod(id);\n };\n\n const makeReadyCallback = useCallback(\n (methodId: string) => (ready: boolean) => {\n setReadyMap((prev) => ({ ...prev, [methodId]: ready }));\n },\n []\n );\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!selectedMethodId || !isReady) return;\n setIsSubmitting(true);\n await submitPayment({ methodId: selectedMethodId });\n setIsSubmitting(false);\n };\n\n return (\n <form\n id=\"checkout-payment-form\"\n onSubmit={handleSubmit}\n className=\"flex flex-col gap-3 animate-in fade-in slide-in-from-right-4 duration-500\"\n >\n <div className=\"flex items-center gap-2 mb-1\">\n <button\n type=\"button\"\n onClick={() => setStep(\"review\")}\n className=\"p-1 hover:bg-border/50 rounded-full transition-colors text-text/80\"\n aria-label={t.back}\n >\n <ChevronLeft className=\"w-5 h-5\" />\n </button>\n <h2 className=\"text-xl font-semibold\">{t.paymentMethod}</h2>\n </div>\n\n <div className=\"flex-1 overflow-y-auto pr-1 custom-scrollbar flex flex-col gap-2\">\n {paymentMethods.map((method) => {\n const isSelected = selectedMethodId === method.id;\n\n return (\n <div key={method.id} className=\"flex flex-col\">\n <button\n type=\"button\"\n onClick={() => handleSelectMethod(method.id)}\n disabled={isSubmitting}\n className={cn(\n \"flex items-center gap-3 p-3.5 border transition-all duration-200 text-left\",\n isSelected\n ? \"border-primary bg-primary/5 ring-1 ring-primary shadow-sm\"\n : \"border-border/60 hover:border-primary/50 bg-background/50 hover:bg-background\",\n isSelected && method.renderComponent\n ? \"rounded-t-[var(--radius-DEFAULT)]\"\n : \"rounded-[var(--radius-DEFAULT)]\"\n )}\n >\n <div className={cn(\"p-1.5 rounded-lg shrink-0\", isSelected ? \"text-primary\" : \"text-text/50\")}>\n {getDefaultIcon(method.type)}\n </div>\n <span className=\"flex-1 font-bold text-sm tracking-tight\">{method.label}</span>\n <div\n className={cn(\n \"w-5 h-5 rounded-full border-2 flex items-center justify-center transition-all shrink-0\",\n isSelected ? \"border-primary bg-primary/10\" : \"border-text/20\"\n )}\n >\n {isSelected && <div className=\"w-2.5 h-2.5 rounded-full bg-primary shadow-sm\" />}\n </div>\n </button>\n\n {isSelected && method.renderComponent && (\n <div className=\"border border-t-0 border-primary/20 bg-background/50 rounded-b-[var(--radius-DEFAULT)] px-5 pt-5 pb-5 animate-in fade-in slide-in-from-top-2 duration-300\">\n {method.renderComponent({ onReadyChange: makeReadyCallback(method.id) })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n <button\n type=\"submit\"\n disabled={!isReady || isSubmitting}\n className={cn(\n \"md:hidden flex w-full py-4 px-4 rounded-[var(--radius-DEFAULT)] mt-2 font-black uppercase tracking-widest justify-center items-center gap-2 transition-all shadow-lg active:scale-[0.98]\",\n !isReady || isSubmitting\n ? \"bg-primary/40 text-surface cursor-not-allowed\"\n : \"bg-primary text-surface hover:brightness-110 shadow-primary/20\"\n )}\n >\n {isSubmitting ? (\n <>\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n {t.processing}\n </>\n ) : isReady ? (\n `${t.pay} ${fmt(totals.total)}`\n ) : (\n selectedMethod\n ? t.completeDetails\n : t.selectMethod\n )}\n </button>\n\n {error && !isSubmitting && (\n <p className=\"text-sm text-error text-center font-medium animate-in fade-in duration-300 -mt-1\">\n {error}\n </p>\n )}\n </form>\n );\n};\n","import { useEffect, useState } from \"react\";\nimport { CheckCircle2, Clock, XCircle, ExternalLink } from \"lucide-react\";\nimport { cn } from \"../utils/utils\";\nimport type { FeedbackScreenProps, VariantConfig } from \"./types\";\nimport { Button } from \"./button\";\n\nconst REDIRECT_DELAY = 2; // seconds\n\nconst variantConfig: Record<NonNullable<FeedbackScreenProps[\"variant\"]>, VariantConfig> = {\n success: {\n icon: <CheckCircle2 className=\"w-10 h-10\" />,\n iconBg: \"bg-success/10\",\n iconColor: \"text-success\",\n },\n pending: {\n icon: <Clock className=\"w-10 h-10\" />,\n iconBg: \"bg-orange-500/10\",\n iconColor: \"text-orange-500\",\n },\n error: {\n icon: <XCircle className=\"w-10 h-10\" />,\n iconBg: \"bg-error/10\",\n iconColor: \"text-error\",\n },\n redirect: {\n icon: <ExternalLink className=\"w-10 h-10\" />,\n iconBg: \"bg-primary/10\",\n iconColor: \"text-primary\",\n },\n};\n\nexport const FeedbackScreen = ({\n title,\n description,\n actions = [],\n variant = \"success\",\n children,\n}: FeedbackScreenProps) => {\n const config = variantConfig[variant];\n const [countdown, setCountdown] = useState(variant === \"redirect\" ? REDIRECT_DELAY : 0);\n\n useEffect(() => {\n if (variant !== \"redirect\") return;\n\n if (countdown <= 0) {\n // Find the redirect action (first solid action) and trigger it\n const primaryAction = actions.find((a) => !a.variant || a.variant === \"solid\");\n primaryAction?.onPress();\n return;\n }\n\n const timer = setInterval(() => setCountdown((c) => c - 1), 1000);\n\n return () => clearInterval(timer);\n }, [countdown, variant]); // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <div className=\"flex flex-col items-center justify-center py-8 gap-5 animate-in zoom-in-95 fade-in duration-500\">\n <div\n className={cn(\n \"w-20 h-20 rounded-full flex items-center justify-center\",\n config.iconBg,\n config.iconColor\n )}\n >\n {config.icon}\n </div>\n\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-1\">{title}</h2>\n {description && (\n <p className=\"text-text/60 text-sm max-w-[280px] mx-auto leading-relaxed\">{description}</p>\n )}\n </div>\n\n {variant === \"redirect\" && countdown > 0 && (\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"relative w-14 h-14\">\n <svg className=\"w-14 h-14 -rotate-90\" viewBox=\"0 0 56 56\">\n <circle\n cx=\"28\" cy=\"28\" r=\"24\"\n fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"4\"\n className=\"text-border\"\n />\n <circle\n cx=\"28\" cy=\"28\" r=\"24\"\n fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeDasharray={`${2 * Math.PI * 24}`}\n strokeDashoffset={`${2 * Math.PI * 24 * (1 - countdown / REDIRECT_DELAY)}`}\n className=\"text-primary transition-all duration-1000\"\n />\n </svg>\n <span className=\"absolute inset-0 flex items-center justify-center text-xl font-bold text-primary\">\n {countdown}\n </span>\n </div>\n <p className=\"text-xs text-text/50\">Redirigiendo en {countdown}s…</p>\n </div>\n )}\n\n {children && <div className=\"w-full\">{children}</div>}\n\n {actions.length > 0 && (\n <div className=\"flex flex-wrap gap-3 justify-center w-full mt-1\">\n {actions.map((action, i) => (\n <Button\n key={i}\n label={action.label}\n onPress={action.onPress}\n variant={action.variant ?? \"solid\"}\n icon={action.icon}\n className={action.variant === \"solid\" ? \"flex-1\" : undefined}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n","import { cn } from \"../utils/utils\";\nimport type { ButtonProps } from \"./types\";\n\nexport const Button = ({\n label,\n onPress,\n variant = \"solid\",\n icon,\n disabled,\n className,\n type = \"button\",\n}: ButtonProps) => {\n return (\n <button\n type={type}\n onClick={onPress}\n disabled={disabled}\n className={cn(\n \"flex items-center justify-center gap-2 px-5 py-2.5 rounded-[var(--radius-DEFAULT)] font-medium text-sm transition-all active:scale-[0.98]\",\n variant === \"solid\" && \"bg-primary text-surface hover:opacity-90 disabled:opacity-40 disabled:cursor-not-allowed\",\n variant === \"outline\" && \"border border-primary text-primary hover:bg-primary/5 disabled:opacity-40 disabled:cursor-not-allowed\",\n variant === \"ghost\" && \"text-text/70 hover:bg-border/50 hover:text-text disabled:opacity-40 disabled:cursor-not-allowed\",\n className\n )}\n >\n {icon && <span className=\"shrink-0\">{icon}</span>}\n {label}\n </button>\n );\n};\n","import { cn } from \"../utils/utils\";\nimport type { CheckoutLayoutProps } from \"./types\";\n\nexport const CheckoutLayout = ({ children, sidebar, className, ...props }: CheckoutLayoutProps) => {\n const hasSidebar = !!sidebar;\n\n return (\n <div\n className={cn(\n \"w-full h-full bg-surface text-text rounded-(--theme-radius) shadow-2xl border border-border\",\n \"overflow-hidden flex flex-col md:flex-row\",\n className\n )}\n {...props}\n >\n <div\n className={cn(\n \"flex-1 min-w-0 min-h-0 flex flex-col overflow-hidden p-4\",\n )}\n >\n {children}\n </div>\n\n {hasSidebar && (\n <>\n <div className=\"hidden md:block w-px bg-border/60 shrink-0\" />\n <div className=\"hidden md:flex w-[320px] shrink-0 flex-col overflow-y-auto p-4 bg-background/60\">\n {sidebar}\n </div>\n </>\n )}\n </div>\n );\n};\n","import { useState } from 'react';\nimport { Code2, X } from 'lucide-react';\nimport { useCheckoutContext } from '../core/checkout-context';\n\ntype MockScenario = 'success' | 'pending' | 'error' | 'redirect';\n\nconst SCENARIOS: MockScenario[] = ['success', 'pending', 'error', 'redirect'];\n\nconst SCENARIO_LABELS: Record<MockScenario, string> = {\n success: '✅ Éxito',\n pending: '⏳ Pendiente',\n error: '❌ Error',\n redirect: '↗️ Redirect',\n};\n\nexport const DevTools = () => {\n const { state, eventLog } = useCheckoutContext();\n const [showDevTools, setShowDevTools] = useState(false);\n const [scenario, setScenario] = useState<MockScenario>('success');\n\n return (\n <>\n <button\n onClick={() => setShowDevTools(true)}\n className=\"fixed top-4 right-4 z-40 bg-surface text-text/50 hover:text-primary p-3 rounded-full shadow-md border border-border transition-all hover:scale-105\"\n aria-label=\"Open Dev Tools\"\n >\n <Code2 className=\"w-5 h-5\" />\n </button>\n\n <div\n className={`fixed top-0 right-0 h-full w-80 bg-surface shadow-2xl z-50 p-6 flex flex-col gap-6 overflow-y-auto transition-transform duration-300 ${showDevTools ? 'translate-x-0' : 'translate-x-full'}`}\n style={{ colorScheme: 'light' }}\n >\n <div className=\"flex items-center justify-between pb-4 border-b border-border\">\n <h2 className=\"text-lg font-bold text-text flex items-center gap-2\">\n <Code2 className=\"w-5 h-5 text-primary\" />\n Dev Tools\n </h2>\n <button\n onClick={() => setShowDevTools(false)}\n className=\"text-text/50 hover:text-text p-1 bg-surface hover:bg-border/50 rounded-full transition-colors\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n <div>\n <h2 className=\"text-sm font-bold mb-3 text-slate-500 uppercase tracking-wider\">Escenario de pago</h2>\n <div className=\"flex flex-col gap-1\">\n {SCENARIOS.map((s) => (\n <label key={s} className=\"flex items-center gap-2 cursor-pointer p-2 hover:bg-slate-50 rounded-lg\">\n <input\n type=\"radio\"\n name=\"scenario\"\n checked={scenario === s}\n onChange={() => setScenario(s)}\n className=\"accent-indigo-500 w-4 h-4\"\n />\n <span className=\"text-sm\">{SCENARIO_LABELS[s]}</span>\n </label>\n ))}\n </div>\n <p className=\"text-[11px] text-slate-400 mt-2 p-2 bg-slate-50 rounded leading-relaxed\">\n Cupón de prueba: <code className=\"font-mono font-bold text-slate-600\">SAVE10</code>\n </p>\n </div>\n\n <div>\n <h2 className=\"text-sm font-bold mb-3 text-slate-500 uppercase tracking-wider flex items-center gap-2\">\n Event Logger <span className=\"text-[10px] bg-indigo-100 text-indigo-700 px-2 py-0.5 rounded-full font-semibold\">Live</span>\n </h2>\n <div className=\"bg-slate-900 text-emerald-400 font-mono text-[10px] p-3 rounded-xl h-56 overflow-y-auto flex flex-col gap-1\">\n {eventLog.length === 0 ? (\n <span className=\"text-slate-500 italic\">Sin eventos aún…</span>\n ) : (\n eventLog.map((log, i) => (\n <div key={i} className=\"border-b border-white/10 pb-1\">{log}</div>\n ))\n )}\n </div>\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <h2 className=\"text-sm font-bold text-slate-500 uppercase tracking-wider\">Estado interno</h2>\n <pre className=\"text-[10px] bg-slate-900 text-emerald-400 p-3 rounded-xl overflow-x-auto\">\n {JSON.stringify({ ...state, provider: 'PaymentProvider instance' }, null, 2)}\n </pre>\n </div>\n </div>\n </>\n );\n};\n\nexport default DevTools;","import { useCheckout } from \"../hooks/useCheckout\";\nimport { useI18n } from \"../core/i18n-context\";\nimport { usePlugins, renderSlot } from \"../plugins/plugin-context\";\nimport { ChevronRight, ShieldCheck, Loader2 } from \"lucide-react\";\nimport { cn } from \"../utils/utils\";\nimport type { OrderSidebarSummaryProps } from \"./types\";\n\nexport const OrderSidebarSummary = ({ showItems: propShowItems, isLoading }: OrderSidebarSummaryProps) => {\n const { items, totals, step, setStep, selectedMethodId } = useCheckout();\n const { t, fmt } = useI18n();\n const { plugins } = usePlugins();\n\n const showItems = propShowItems ?? (step !== \"review\");\n\n const handleAction = () => {\n if (step === \"review\") {\n setStep(\"payment_method\");\n } else {\n const form = document.getElementById(\"checkout-payment-form\") as HTMLFormElement | null;\n form?.requestSubmit();\n }\n };\n\n const actionLabel = step === \"review\" ? t.continueToPay : t.payNow;\n const isReady = step === \"review\" || !!selectedMethodId;\n\n const slotProps = { items, totals, step, t, fmt };\n const hasDiscountAction = plugins.some((p) => p.slots.totalsDiscountAction);\n\n return (\n <div className=\"flex flex-col h-full animate-in fade-in duration-500\">\n <h3 className=\"text-xs font-bold text-text/40 uppercase tracking-widest mb-6\">{t.orderSummaryTitle}</h3>\n\n {showItems && (\n <div className=\"flex flex-col gap-4 overflow-y-auto pr-2 custom-scrollbar\">\n {items.map((item) => (\n <div key={item.id} className=\"flex items-start gap-3\">\n {item.image && (\n <img\n src={item.image}\n alt={item.name}\n className=\"w-10 h-10 rounded-lg object-cover border border-border/40 shrink-0 shadow-sm\"\n />\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-[13px] font-semibold leading-tight truncate text-text/80\">{item.name}</p>\n <p className=\"text-[11px] text-text/40 mt-0.5 font-medium\">{t.quantityShort}: {item.quantity}</p>\n </div>\n <div className=\"text-right shrink-0\">\n <span className=\"text-[13px] font-bold text-text/80\">{fmt(item.total)}</span>\n </div>\n </div>\n ))}\n </div>\n )}\n\n <div className=\"flex flex-col gap-2\">\n {renderSlot(plugins, \"sidebarBeforeTotals\", slotProps)}\n\n <div className=\"flex border-t border-border/50 justify-between text-sm text-text/60 font-medium\">\n <span>{t.subtotal}</span>\n <span>{fmt(totals.subtotal)}</span>\n </div>\n\n {totals.discount !== undefined && totals.discount > 0 && (\n <div className=\"flex justify-between items-center text-sm font-semibold text-success\">\n <span>{t.discount}</span>\n <span className=\"flex items-center gap-1.5\">\n -{fmt(totals.discount)}\n {hasDiscountAction && renderSlot(plugins, \"totalsDiscountAction\", slotProps)}\n </span>\n </div>\n )}\n\n {totals.shipping !== undefined && (\n <div className=\"flex justify-between text-sm text-text/60 font-medium\">\n <span>{t.shipping}</span>\n <span>{totals.shipping === 0 ? t.shippingFree : fmt(totals.shipping)}</span>\n </div>\n )}\n\n {totals.taxes !== undefined && (\n <div className=\"flex justify-between text-sm text-text/60 font-medium\">\n <span>{t.taxes}</span>\n <span>{fmt(totals.taxes)}</span>\n </div>\n )}\n\n <div className=\"flex justify-between items-center pt-4 border-t border-border/50 mt-2\">\n <span className=\"font-bold text-base text-text/90\">{t.total}</span>\n <span className=\"text-2xl font-black text-primary tracking-tight\">{fmt(totals.total)}</span>\n </div>\n </div>\n\n <div className=\"flex flex-col gap-2 mt-auto\">\n <button\n onClick={handleAction}\n disabled={!isReady || isLoading}\n className={cn(\n \"w-full mt-6 py-4 px-6 rounded-xs font-bold flex items-center justify-center gap-2 transition-all duration-300 shadow-lg active:scale-[0.98]\",\n (isReady && !isLoading)\n ? \"bg-primary text-surface hover:brightness-110 shadow-primary/20 cursor-pointer\"\n : \"bg-primary/40 text-surface/60 cursor-not-allowed shadow-none\"\n )}\n >\n {isLoading ? (\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n ) : (\n <>\n {actionLabel}\n {step === \"review\" && <ChevronRight className=\"w-5 h-5\" />}\n </>\n )}\n </button>\n\n <div className=\"flex items-center justify-center gap-2 mt-4 text-[11px] text-text/30 font-semibold tracking-wide\">\n <ShieldCheck className=\"w-4 h-4 opacity-50\" />\n <span>{t.securePayment}</span>\n </div>\n </div>\n </div>\n );\n};\n","import { useState } from \"react\";\nimport { ChevronUp, ChevronDown, Loader2 } from \"lucide-react\";\nimport { useCheckout } from \"../hooks/useCheckout\";\nimport { useI18n } from \"../core/i18n-context\";\nimport { usePlugins, renderSlot } from \"../plugins/plugin-context\";\n\ninterface MobileOrderBarProps {\n onAction?: () => void;\n actionLabel?: string;\n actionDisabled?: boolean;\n isSubmitting?: boolean;\n showItems?: boolean;\n}\n\nexport const MobileOrderBar = ({\n onAction,\n actionLabel,\n actionDisabled,\n isSubmitting,\n showItems = false,\n}: MobileOrderBarProps) => {\n const { totals, items, step } = useCheckout();\n const { t, fmt } = useI18n();\n const { plugins } = usePlugins();\n const [expanded, setExpanded] = useState(false);\n\n const slotProps = { items, totals, step, t, fmt };\n const hasDiscountAction = plugins.some((p) => p.slots.totalsDiscountAction);\n\n return (\n <div className=\"fixed bottom-0 left-0 right-0 z-30 md:hidden\">\n\n <div\n className={`bg-surface border-t border-border overflow-hidden transition-all duration-300 ease-in-out ${expanded ? \"max-h-[70vh] opacity-100\" : \"max-h-0 opacity-0 pointer-events-none\"}`}\n >\n <div className=\"px-4 pt-4 pb-2 flex flex-col gap-0\">\n\n {showItems && (\n <div className=\"overflow-y-auto max-h-52 divide-y divide-border/40 mb-3\">\n {items.map((item) => (\n <div key={item.id} className=\"flex items-center gap-3 py-2.5\">\n {item.image && (\n <img\n src={item.image}\n alt={item.name}\n className=\"w-10 h-10 rounded-lg object-cover border border-border/30 shrink-0\"\n />\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{item.name}</p>\n <p className=\"text-xs text-text/50\">{t.quantityShort}: {item.quantity}</p>\n {item.discount && (\n <p className=\"text-[10px] text-success font-medium\">\n {item.discount.label && `${item.discount.label} · `}\n {item.discount.type === \"percentage\"\n ? `-${item.discount.value}%`\n : `-${fmt(item.discount.value)}`}\n </p>\n )}\n </div>\n <div className=\"text-right shrink-0\">\n {item.discount ? (\n <div className=\"flex flex-col items-end\">\n <span className=\"text-[11px] line-through text-text/40\">\n {fmt(item.unitPrice * item.quantity)}\n </span>\n <span className=\"text-sm font-semibold text-success\">{fmt(item.total)}</span>\n </div>\n ) : (\n <span className=\"text-sm font-medium\">{fmt(item.total)}</span>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* Plugin slot: mobileBarExpanded (e.g. coupon input from DiscountPlugin) */}\n {renderSlot(plugins, \"mobileBarExpanded\", slotProps)}\n\n <div className={`flex flex-col gap-1.5 text-sm pb-3 ${showItems ? \"border-t border-border/50 pt-3\" : \"pt-1\"}`}>\n <div className=\"flex justify-between text-text/60\">\n <span>{t.subtotal}</span>\n <span>{fmt(totals.subtotal)}</span>\n </div>\n {totals.discount !== undefined && totals.discount > 0 && (\n <div className=\"flex justify-between items-center text-success font-medium\">\n <span>{t.discount}</span>\n <span className=\"flex items-center gap-1.5\">\n -{fmt(totals.discount)}\n {hasDiscountAction && renderSlot(plugins, \"totalsDiscountAction\", slotProps)}\n </span>\n </div>\n )}\n {totals.shipping !== undefined && (\n <div className=\"flex justify-between text-text/60\">\n <span>{t.shipping}</span>\n <span>{totals.shipping === 0 ? t.shippingFree : fmt(totals.shipping)}</span>\n </div>\n )}\n {totals.taxes !== undefined && (\n <div className=\"flex justify-between text-text/60\">\n <span>{t.taxes}</span>\n <span>{fmt(totals.taxes)}</span>\n </div>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"bg-surface border-t border-border shadow-[0_-4px_20px_rgba(0,0,0,0.1)] px-4 pt-3 pb-4 flex flex-col gap-3\">\n\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n className=\"flex items-center justify-between w-full\"\n aria-label={expanded ? t.hideOrderDetails : t.showOrderDetails}\n >\n <span className=\"text-sm font-medium text-text/60\">{t.total}</span>\n <span className=\"flex items-center gap-1.5\">\n <span className=\"text-lg font-bold text-primary\">{fmt(totals.total)}</span>\n {expanded\n ? <ChevronDown className=\"w-4 h-4 text-text/40\" />\n : <ChevronUp className=\"w-4 h-4 text-text/40\" />}\n </span>\n </button>\n\n {onAction && (\n <button\n type=\"button\"\n onClick={onAction}\n disabled={actionDisabled || isSubmitting}\n className={`w-full py-3 rounded-[var(--radius-DEFAULT)] font-medium text-sm flex items-center justify-center gap-2 transition-all active:scale-[0.98] ${actionDisabled || isSubmitting\n ? \"bg-primary/40 text-surface cursor-not-allowed\"\n : \"bg-primary text-surface hover:opacity-90\"\n }`}\n >\n {isSubmitting ? (\n <>\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n {t.processing}\n </>\n ) : (\n actionLabel ?? t.continue\n )}\n </button>\n )}\n </div>\n </div>\n );\n};\n","import { useCheckout } from \"../hooks/useCheckout\";\nimport { useI18n } from \"../core/i18n-context\";\nimport { isPaymentStep, isReviewStep } from \"../utils/utils\";\nimport { MobileOrderBar } from \"./MobileOrderBar\";\n\nexport const MobileBar = ({ step }: { step: string }) => {\n const { setStep } = useCheckout();\n const { t } = useI18n();\n\n if (isReviewStep(step)) {\n return (\n <MobileOrderBar\n onAction={() => setStep(\"payment_method\")}\n actionLabel={`${t.continueToPay} →`}\n showItems={false}\n />\n );\n }\n if (isPaymentStep(step)) {\n return (\n <MobileOrderBar\n onAction={() => {\n const form = document.getElementById(\"checkout-payment-form\") as HTMLFormElement | null;\n form?.requestSubmit();\n }}\n actionLabel={t.pay}\n showItems={true}\n />\n );\n }\n return null;\n};"],"mappings":"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","names":["useState","Trash2","Loader2","jsx","jsxs","jsx","jsx","createContext","useContext","jsx","createContext","useContext","createContext","useContext","jsx","Loader2","jsx","jsxs","useState","useCallback","Loader2","Fragment","jsx","jsxs","useState","useCallback","useEffect","useState","jsx","jsxs","jsx","jsxs","useState","useEffect","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","Loader2","Fragment","jsx","jsxs","Loader2","useState","Loader2","Fragment","jsx","jsxs","useState","Loader2","jsx","jsx","jsxs","Loader2","jsx"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@anpayeras/agnostic-checkout",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Provider-agnostic, embeddable React checkout component with dynamic theming and plugin architecture",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./styles": "./src/styles/index.css"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"src/styles"
|
|
20
|
+
],
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsup src/index.ts --format esm,cjs --dts --sourcemap",
|
|
24
|
+
"lint": "eslint src/",
|
|
25
|
+
"typecheck": "tsc --noEmit"
|
|
26
|
+
},
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"react": ">=18",
|
|
29
|
+
"react-dom": ">=18"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"clsx": "^2.1.1",
|
|
33
|
+
"lucide-react": "^0.575.0",
|
|
34
|
+
"tailwind-merge": "^3.5.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/react": "^19.2.7",
|
|
38
|
+
"@types/react-dom": "^19.2.3",
|
|
39
|
+
"tsup": "^8.5.1",
|
|
40
|
+
"typescript": "^5.9.3"
|
|
41
|
+
},
|
|
42
|
+
"keywords": [
|
|
43
|
+
"react",
|
|
44
|
+
"checkout",
|
|
45
|
+
"payment",
|
|
46
|
+
"sdk",
|
|
47
|
+
"theming",
|
|
48
|
+
"plugins"
|
|
49
|
+
],
|
|
50
|
+
"license": "MIT"
|
|
51
|
+
}
|