@sazito/checkout 0.2.0 → 0.3.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.
@@ -1 +1 @@
1
- {"version":3,"file":"use-checkout-CQBSONj1.cjs","sources":["../../src/react/context.ts","../../src/react/client-context.tsx","../../src/react/provider.tsx","../../src/react/use-checkout.ts"],"sourcesContent":["'use client';\n\nimport { createContext, useContext } from 'react';\nimport type { CheckoutEngine } from '../core';\n\nexport const CheckoutEngineContext = createContext<CheckoutEngine | null>(null);\n\nexport function useCheckoutEngine(): CheckoutEngine {\n const engine = useContext(CheckoutEngineContext);\n if (!engine) {\n throw new Error('useCheckout must be used within <CheckoutProvider>.');\n }\n return engine;\n}\n","'use client';\n\nimport { createContext, useContext, type ReactNode } from 'react';\n\ninterface SazitoContextValue {\n client: unknown;\n}\n\nconst SazitoClientContext = createContext<SazitoContextValue | null>(null);\n\nexport interface SazitoProviderProps {\n client: unknown;\n children: ReactNode;\n}\n\nexport function SazitoProvider({ client, children }: SazitoProviderProps) {\n return (\n <SazitoClientContext.Provider value={{ client }}>\n {children}\n </SazitoClientContext.Provider>\n );\n}\n\nexport function useSazitoClient(): unknown {\n return useContext(SazitoClientContext)?.client;\n}\n","'use client';\n\nimport { useEffect, useMemo, type ReactNode } from 'react';\nimport {\n createCheckoutEngine,\n createBrowserEffectExecutor,\n type CheckoutConfig,\n type CheckoutCredentials,\n type CheckoutEngine\n} from '../core';\nimport { CheckoutEngineContext } from './context';\nimport { useSazitoClient } from './client-context';\n\nexport interface CheckoutProviderProps {\n /** Override the SazitoProvider client for this checkout instance only. */\n client?: unknown;\n credentials?: CheckoutCredentials;\n config?: CheckoutConfig;\n autoStart?: boolean;\n children: ReactNode;\n}\n\nexport function CheckoutProvider({\n client: clientProp,\n credentials,\n config,\n autoStart = true,\n children\n}: CheckoutProviderProps) {\n const contextClient = useSazitoClient();\n const client = clientProp ?? contextClient;\n\n const cartIdentifier = credentials?.cart?.identifier;\n const invoiceId = credentials?.invoice?.id;\n const invoiceIdentifier = credentials?.invoice?.identifier;\n const engine = useMemo<CheckoutEngine>(() => {\n const nextEngine = createCheckoutEngine({ client, credentials, config });\n nextEngine.setEffectExecutor(createBrowserEffectExecutor(config));\n return nextEngine;\n // Recreate only when the SDK/session changes. Config-only updates are applied below.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, cartIdentifier, invoiceId, invoiceIdentifier]);\n\n useEffect(() => {\n engine.setEffectExecutor(createBrowserEffectExecutor(config));\n }, [engine, config]);\n\n useEffect(() => {\n if (autoStart) {\n void engine.actions.start();\n }\n return () => engine.destroy();\n }, [engine, autoStart]);\n\n const value = useMemo(() => engine, [engine]);\n\n return <CheckoutEngineContext.Provider value={value}>{children}</CheckoutEngineContext.Provider>;\n}\n","'use client';\n\nimport { useSyncExternalStore } from 'react';\nimport {\n formatMoney,\n formatPrice,\n selectDigitalItems,\n selectSummary,\n strings,\n type CheckoutActions,\n type CheckoutState,\n type CheckoutSummary,\n type InvoiceItem,\n type Strings\n} from '../core';\nimport { useCheckoutEngine } from './context';\n\nexport interface UseCheckout {\n state: CheckoutState;\n actions: CheckoutActions;\n /** Localized UI strings. */\n t: Strings;\n /** Format an amount with the currency label for the active locale. */\n money(value: number): string;\n /** Like `money`, but renders 0 as \"Free\". */\n price(value: number): string;\n summary: CheckoutSummary;\n digitalItems: InvoiceItem[];\n}\n\nexport function useCheckout(): UseCheckout {\n const engine = useCheckoutEngine();\n const state = useSyncExternalStore(\n engine.subscribe,\n engine.getState,\n engine.getState\n );\n\n return {\n state,\n actions: engine.actions,\n t: strings(state.locale),\n money: (value: number) => formatMoney(value, state.locale),\n price: (value: number) => formatPrice(value, state.locale),\n summary: selectSummary(state.invoice),\n digitalItems: selectDigitalItems(state.invoice, state.shippingGroups, state.applicable)\n };\n}\n"],"names":["createContext","useContext","_jsx","useMemo","createCheckoutEngine","createBrowserEffectExecutor","useEffect","useSyncExternalStore","strings","formatMoney","formatPrice","selectSummary","selectDigitalItems"],"mappings":"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"}
1
+ {"version":3,"file":"use-checkout-DGP2xazd.cjs","sources":["../../src/react/context.ts","../../src/react/client-context.tsx","../../src/react/provider.tsx","../../src/react/use-checkout.ts"],"sourcesContent":["'use client';\n\nimport { createContext, useContext } from 'react';\nimport type { CheckoutEngine } from '../core';\n\nexport const CheckoutEngineContext = createContext<CheckoutEngine | null>(null);\n\nexport function useCheckoutEngine(): CheckoutEngine {\n const engine = useContext(CheckoutEngineContext);\n if (!engine) {\n throw new Error('useCheckout must be used within <CheckoutProvider>.');\n }\n return engine;\n}\n","'use client';\n\nimport { createContext, useContext, type ReactNode } from 'react';\n\ninterface SazitoContextValue {\n client: unknown;\n}\n\nconst SazitoClientContext = createContext<SazitoContextValue | null>(null);\n\nexport interface SazitoProviderProps {\n client: unknown;\n children: ReactNode;\n}\n\nexport function SazitoProvider({ client, children }: SazitoProviderProps) {\n return (\n <SazitoClientContext.Provider value={{ client }}>\n {children}\n </SazitoClientContext.Provider>\n );\n}\n\nexport function useSazitoClient(): unknown {\n return useContext(SazitoClientContext)?.client;\n}\n","'use client';\n\nimport { useEffect, useMemo, type ReactNode } from 'react';\nimport {\n createCheckoutEngine,\n createBrowserEffectExecutor,\n type CheckoutConfig,\n type CheckoutCredentials,\n type CheckoutEngine\n} from '../core';\nimport { CheckoutEngineContext } from './context';\nimport { useSazitoClient } from './client-context';\n\nexport interface CheckoutProviderProps {\n /** Override the SazitoProvider client for this checkout instance only. */\n client?: unknown;\n credentials?: CheckoutCredentials;\n config?: CheckoutConfig;\n autoStart?: boolean;\n children: ReactNode;\n}\n\nexport function CheckoutProvider({\n client: clientProp,\n credentials,\n config,\n autoStart = true,\n children\n}: CheckoutProviderProps) {\n const contextClient = useSazitoClient();\n const client = clientProp ?? contextClient;\n\n const cartIdentifier = credentials?.cart?.identifier;\n const invoiceId = credentials?.invoice?.id;\n const invoiceIdentifier = credentials?.invoice?.identifier;\n const engine = useMemo<CheckoutEngine>(() => {\n const nextEngine = createCheckoutEngine({ client, credentials, config });\n nextEngine.setEffectExecutor(createBrowserEffectExecutor(config));\n return nextEngine;\n // Recreate only when the SDK/session changes. Config-only updates are applied below.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, cartIdentifier, invoiceId, invoiceIdentifier]);\n\n useEffect(() => {\n engine.setEffectExecutor(createBrowserEffectExecutor(config));\n }, [engine, config]);\n\n useEffect(() => {\n if (autoStart) {\n void engine.actions.start();\n }\n return () => engine.destroy();\n }, [engine, autoStart]);\n\n const value = useMemo(() => engine, [engine]);\n\n return <CheckoutEngineContext.Provider value={value}>{children}</CheckoutEngineContext.Provider>;\n}\n","'use client';\n\nimport { useSyncExternalStore } from 'react';\nimport {\n formatMoney,\n formatPrice,\n selectDigitalItems,\n selectSummary,\n strings,\n type CheckoutActions,\n type CheckoutState,\n type CheckoutSummary,\n type InvoiceItem,\n type Strings\n} from '../core';\nimport { useCheckoutEngine } from './context';\n\nexport interface UseCheckout {\n state: CheckoutState;\n actions: CheckoutActions;\n /** Localized UI strings. */\n t: Strings;\n /** Format an amount with the currency label for the active locale. */\n money(value: number): string;\n /** Like `money`, but renders 0 as \"Free\". */\n price(value: number): string;\n summary: CheckoutSummary;\n digitalItems: InvoiceItem[];\n}\n\nexport function useCheckout(): UseCheckout {\n const engine = useCheckoutEngine();\n const state = useSyncExternalStore(\n engine.subscribe,\n engine.getState,\n engine.getState\n );\n\n return {\n state,\n actions: engine.actions,\n t: strings(state.locale),\n money: (value: number) => formatMoney(value, state.locale),\n price: (value: number) => formatPrice(value, state.locale),\n summary: selectSummary(state.invoice),\n digitalItems: selectDigitalItems(state.invoice, state.shippingGroups, state.applicable)\n };\n}\n"],"names":["createContext","useContext","_jsx","useMemo","createCheckoutEngine","createBrowserEffectExecutor","useEffect","useSyncExternalStore","strings","formatMoney","formatPrice","selectSummary","selectDigitalItems"],"mappings":";;;;;;AAKO,MAAM,qBAAqB,GAAGA,mBAAa,CAAwB,IAAI,CAAC;SAE/D,iBAAiB,GAAA;AAC/B,IAAA,MAAM,MAAM,GAAGC,gBAAU,CAAC,qBAAqB,CAAC;IAChD,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC;IACxE;AACA,IAAA,OAAO,MAAM;AACf;;ACLA,MAAM,mBAAmB,GAAGD,mBAAa,CAA4B,IAAI,CAAC;SAO1D,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAuB,EAAA;AACtE,IAAA,QACEE,cAAA,CAAC,mBAAmB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAA,QAAA,EAC5C,QAAQ,EAAA,CACoB;AAEnC;SAEgB,eAAe,GAAA;AAC7B,IAAA,OAAOD,gBAAU,CAAC,mBAAmB,CAAC,EAAE,MAAM;AAChD;;SCHgB,gBAAgB,CAAC,EAC/B,MAAM,EAAE,UAAU,EAClB,WAAW,EACX,MAAM,EACN,SAAS,GAAG,IAAI,EAChB,QAAQ,EACc,EAAA;AACtB,IAAA,MAAM,aAAa,GAAG,eAAe,EAAE;AACvC,IAAA,MAAM,MAAM,GAAG,UAAU,IAAI,aAAa;AAE1C,IAAA,MAAM,cAAc,GAAG,WAAW,EAAE,IAAI,EAAE,UAAU;AACpD,IAAA,MAAM,SAAS,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE;AAC1C,IAAA,MAAM,iBAAiB,GAAG,WAAW,EAAE,OAAO,EAAE,UAAU;AAC1D,IAAA,MAAM,MAAM,GAAGE,aAAO,CAAiB,MAAK;AAC1C,QAAA,MAAM,UAAU,GAAGC,2BAAoB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QACxE,UAAU,CAAC,iBAAiB,CAACC,kCAA2B,CAAC,MAAM,CAAC,CAAC;AACjE,QAAA,OAAO,UAAU;;;IAGnB,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAE1DC,eAAS,CAAC,MAAK;QACb,MAAM,CAAC,iBAAiB,CAACD,kCAA2B,CAAC,MAAM,CAAC,CAAC;AAC/D,IAAA,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpBC,eAAS,CAAC,MAAK;QACb,IAAI,SAAS,EAAE;AACb,YAAA,KAAK,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;QAC7B;AACA,QAAA,OAAO,MAAM,MAAM,CAAC,OAAO,EAAE;AAC/B,IAAA,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAEvB,IAAA,MAAM,KAAK,GAAGH,aAAO,CAAC,MAAM,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;IAE7C,OAAOD,cAAA,CAAC,qBAAqB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,KAAK,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAkC;AAClG;;SC3BgB,WAAW,GAAA;AACzB,IAAA,MAAM,MAAM,GAAG,iBAAiB,EAAE;AAClC,IAAA,MAAM,KAAK,GAAGK,0BAAoB,CAChC,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,QAAQ,CAChB;IAED,OAAO;QACL,KAAK;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;AACvB,QAAA,CAAC,EAAEC,cAAO,CAAC,KAAK,CAAC,MAAM,CAAC;AACxB,QAAA,KAAK,EAAE,CAAC,KAAa,KAAKC,kBAAW,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;AAC1D,QAAA,KAAK,EAAE,CAAC,KAAa,KAAKC,kBAAW,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;AAC1D,QAAA,OAAO,EAAEC,oBAAa,CAAC,KAAK,CAAC,OAAO,CAAC;AACrC,QAAA,YAAY,EAAEC,yBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,UAAU;KACvF;AACH;;;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var labels = require('../chunks/labels-DJ_RnkCQ.cjs');
3
+ var labels = require('../chunks/labels-3zH04p3y.cjs');
4
4
  require('@sazito/client-sdk');
5
5
 
6
6
 
@@ -258,6 +258,7 @@ interface Store<T> {
258
258
  getState(): T;
259
259
  setState(partial: Partial<T> | ((prev: T) => Partial<T>)): void;
260
260
  subscribe(listener: () => void): () => void;
261
+ batch<R>(callback: () => R): R;
261
262
  }
262
263
  declare function createStore<T extends object>(initialState: T): Store<T>;
263
264
 
@@ -258,6 +258,7 @@ interface Store<T> {
258
258
  getState(): T;
259
259
  setState(partial: Partial<T> | ((prev: T) => Partial<T>)): void;
260
260
  subscribe(listener: () => void): () => void;
261
+ batch<R>(callback: () => R): R;
261
262
  }
262
263
  declare function createStore<T extends object>(initialState: T): Store<T>;
263
264
 
@@ -1,3 +1,3 @@
1
- export { a as addressFormFromInvoice, b as buildShippingAssignments, c as classifyAppliedDiscount, d as createBrowserEffectExecutor, e as createCheckoutEngine, f as createSdkBinding, g as createStore, h as defaultCurrencyLabel, i as deriveShippingGroups, j as emptyAddressForm, k as formatMoney, l as formatNumber, m as formatPercent, n as formatPrice, o as fromSdkError, p as isAddressComplete, q as isAddressDirty, r as isDigitalServiceGroup, s as isShippingComplete, t as isValidIranianMobile, u as isValidIranianPhone, v as makeError, w as makeEvent, x as messageForCode, y as noopEffectExecutor, z as normalizeIranianPhone, A as paymentMethodInfo, B as paymentMethodLabel, C as selectDigitalItems, D as selectSummary, E as sortCartItemsNewestFirst, F as strings, G as toEnglishDigits, H as toPersianDigits } from '../chunks/labels-ByA_yGKl.js';
1
+ export { a as addressFormFromInvoice, b as buildShippingAssignments, c as classifyAppliedDiscount, d as createBrowserEffectExecutor, e as createCheckoutEngine, f as createSdkBinding, g as createStore, h as defaultCurrencyLabel, i as deriveShippingGroups, j as emptyAddressForm, k as formatMoney, l as formatNumber, m as formatPercent, n as formatPrice, o as fromSdkError, p as isAddressComplete, q as isAddressDirty, r as isDigitalServiceGroup, s as isShippingComplete, t as isValidIranianMobile, u as isValidIranianPhone, v as makeError, w as makeEvent, x as messageForCode, y as noopEffectExecutor, z as normalizeIranianPhone, A as paymentMethodInfo, B as paymentMethodLabel, C as selectDigitalItems, D as selectSummary, E as sortCartItemsNewestFirst, F as strings, G as toEnglishDigits, H as toPersianDigits } from '../chunks/labels-BdxqgReM.js';
2
2
  import '@sazito/client-sdk';
3
3
  //# sourceMappingURL=index.js.map
@@ -3,8 +3,8 @@
3
3
 
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
5
  var react = require('react');
6
- var useCheckout = require('../chunks/use-checkout-CQBSONj1.cjs');
7
- var labels = require('../chunks/labels-DJ_RnkCQ.cjs');
6
+ var useCheckout = require('../chunks/use-checkout-DGP2xazd.cjs');
7
+ var labels = require('../chunks/labels-3zH04p3y.cjs');
8
8
  require('@sazito/client-sdk');
9
9
 
10
10
  /**
@@ -186,17 +186,29 @@ function attrHexColor(value) {
186
186
  }
187
187
  return toHexColor(value);
188
188
  }
189
- function CartStep({ continueShoppingUrl, renderEmpty, }) {
189
+ function CartStep({ continueShoppingUrl, emptyCart, renderEmpty, }) {
190
190
  const { state, actions, money, t } = useCheckout.useCheckout();
191
191
  const cart = state.cart;
192
192
  const busy = state.flags.updatingCart;
193
193
  const newestCartItems = react.useMemo(() => labels.sortCartItemsNewestFirst(cart?.items ?? []), [cart?.items]);
194
194
  const invoiceItemsByVariant = new Map((state.invoice?.items ?? []).map((item) => [item.productVariantId, item]));
195
195
  if (!cart || cart.items.length === 0) {
196
+ const title = emptyCart?.title ?? t.cartEmpty;
197
+ const description = emptyCart?.description ?? t.cartEmptyHint;
198
+ const actionLabel = emptyCart?.actionLabel ?? t.continueShopping;
199
+ const actionUrl = emptyCart?.actionUrl ?? continueShoppingUrl;
200
+ const visibleActionUrl = emptyCart?.hideAction ? undefined : actionUrl;
201
+ const icon = emptyCart?.icon ?? jsxRuntime.jsx(CartIcon, {});
196
202
  if (renderEmpty) {
197
- return renderEmpty({ continueShoppingUrl });
203
+ return renderEmpty({
204
+ continueShoppingUrl: visibleActionUrl,
205
+ title,
206
+ description,
207
+ actionLabel,
208
+ icon,
209
+ });
198
210
  }
199
- return (jsxRuntime.jsx("section", { className: "szc-empty", role: "status", "aria-live": "polite", children: jsxRuntime.jsxs("div", { className: "szc-empty__card", children: [jsxRuntime.jsx("span", { className: "szc-empty__badge", children: jsxRuntime.jsx(CartIcon, {}) }), jsxRuntime.jsxs("div", { className: "szc-empty__copy", children: [jsxRuntime.jsx("h3", { className: "szc-empty__title", children: t.cartEmpty }), jsxRuntime.jsx("p", { className: "szc-empty__hint", children: t.cartEmptyHint })] }), continueShoppingUrl ? (jsxRuntime.jsx(Button, { className: "szc-empty__cta", variant: "primary", onClick: () => { window.location.href = continueShoppingUrl; }, children: t.continueShopping })) : null] }) }));
211
+ return (jsxRuntime.jsx("section", { className: "szc-empty", role: "status", "aria-live": "polite", children: jsxRuntime.jsxs("div", { className: "szc-empty__card", children: [jsxRuntime.jsx("span", { className: "szc-empty__badge", "aria-hidden": "true", children: icon }), jsxRuntime.jsxs("div", { className: "szc-empty__copy", children: [jsxRuntime.jsx("h2", { className: "szc-empty__title", children: title }), jsxRuntime.jsx("p", { className: "szc-empty__hint", children: description })] }), visibleActionUrl ? (jsxRuntime.jsx(Button, { className: "szc-empty__cta", variant: "primary", asChild: true, children: jsxRuntime.jsx("a", { href: visibleActionUrl, children: actionLabel }) })) : null] }) }));
200
212
  }
201
213
  return (jsxRuntime.jsx("section", { className: "szc-step-panel", children: jsxRuntime.jsx("ul", { className: "szc-cart-list", children: newestCartItems.map((item) => {
202
214
  const max = item.product.maxOrderQuantity;
@@ -756,15 +768,16 @@ function themeVars(theme) {
756
768
  vars['--szc-font'] = theme.fontFamily;
757
769
  return vars;
758
770
  }
759
- function CheckoutSkeleton({ label }) {
760
- return (jsxRuntime.jsxs("div", { className: "szc-layout szc-skeleton-layout", role: "status", "aria-label": label, children: [jsxRuntime.jsxs("main", { className: "szc-main", "aria-hidden": "true", children: [jsxRuntime.jsxs("div", { className: "szc-skeleton-cart-row", children: [jsxRuntime.jsx("span", { className: "szc-skeleton szc-skeleton--thumb" }), jsxRuntime.jsxs("div", { className: "szc-skeleton-copy", children: [jsxRuntime.jsx("span", { className: "szc-skeleton szc-skeleton--title" }), jsxRuntime.jsx("span", { className: "szc-skeleton szc-skeleton--text" }), jsxRuntime.jsx("span", { className: "szc-skeleton szc-skeleton--price" })] }), jsxRuntime.jsx("span", { className: "szc-skeleton szc-skeleton--counter" })] }), jsxRuntime.jsxs("div", { className: "szc-skeleton-cart-row", children: [jsxRuntime.jsx("span", { className: "szc-skeleton szc-skeleton--thumb" }), jsxRuntime.jsxs("div", { className: "szc-skeleton-copy", children: [jsxRuntime.jsx("span", { className: "szc-skeleton szc-skeleton--title" }), jsxRuntime.jsx("span", { className: "szc-skeleton szc-skeleton--text" }), jsxRuntime.jsx("span", { className: "szc-skeleton szc-skeleton--price" })] }), jsxRuntime.jsx("span", { className: "szc-skeleton szc-skeleton--counter" })] })] }), jsxRuntime.jsxs("div", { className: "szc-side", "aria-hidden": "true", children: [jsxRuntime.jsxs("aside", { className: "szc-summary szc-summary--skeleton", children: [jsxRuntime.jsxs("div", { className: "szc-summary__total-head", children: [jsxRuntime.jsx("span", { className: "szc-skeleton szc-skeleton--summary-label" }), jsxRuntime.jsx("span", { className: "szc-skeleton szc-skeleton--summary-total" })] }), jsxRuntime.jsxs("div", { className: "szc-skeleton-summary-lines", children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("span", { className: "szc-skeleton" }), jsxRuntime.jsx("span", { className: "szc-skeleton" })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("span", { className: "szc-skeleton" }), jsxRuntime.jsx("span", { className: "szc-skeleton" })] })] }), jsxRuntime.jsxs("div", { className: "szc-skeleton-summary-grand", children: [jsxRuntime.jsx("span", { className: "szc-skeleton" }), jsxRuntime.jsx("span", { className: "szc-skeleton" })] })] }), jsxRuntime.jsx("div", { className: "szc-side__cta", children: jsxRuntime.jsx("span", { className: "szc-skeleton szc-skeleton--button" }) })] })] }));
771
+ function CheckoutLoading({ label }) {
772
+ return (jsxRuntime.jsxs("div", { className: "szc-checkout-loading", role: "status", "aria-live": "polite", children: [jsxRuntime.jsx(Spinner, { className: "szc-checkout-loading__spinner" }), jsxRuntime.jsx("span", { children: label })] }));
761
773
  }
762
- function SazitoCheckout({ theme, continueShoppingUrl, className, renderNextButton, renderBackButton, renderEmptyCart, }) {
774
+ function SazitoCheckout({ theme, continueShoppingUrl, className, renderNextButton, renderBackButton, renderEmptyCart, emptyCart, }) {
763
775
  const { state, actions, t, summary, money } = useCheckout.useCheckout();
764
776
  const { step, direction, flags, error } = state;
765
777
  const isResult = step === 'result';
766
778
  const bootstrapping = step === 'cart' && !error && (!state.cart || !state.invoice || flags.bootstrapping);
767
- const fatal = error && !state.cart && step === 'cart';
779
+ const emptyCartError = error?.code === 'no_cart';
780
+ const fatal = error && !state.cart && step === 'cart' && !emptyCartError;
768
781
  const cartEmpty = !state.cart || state.cart.items.length === 0;
769
782
  const footerVisible = (step === 'cart' && !cartEmpty) || step === 'shipping' || step === 'payment';
770
783
  const nextBusy = state.status === 'working' ||
@@ -832,13 +845,13 @@ function SazitoCheckout({ theme, continueShoppingUrl, className, renderNextButto
832
845
  ? CardIcon
833
846
  : ClipboardIcon;
834
847
  const mobileHead = (jsxRuntime.jsxs("div", { className: "szc-mobile-head", children: [footerVisible && backVisible ? (jsxRuntime.jsx("button", { type: "button", className: "szc-mobile-head__back", "aria-label": t.back, onClick: backOnClick, children: jsxRuntime.jsx("svg", { className: "szc-back-arrow", viewBox: "0 0 16 16", width: "18", height: "18", fill: "none", "aria-hidden": "true", children: jsxRuntime.jsx("path", { d: "M9.5 3.5 5 8l4.5 4.5", stroke: "currentColor", strokeWidth: "1.8", strokeLinecap: "round", strokeLinejoin: "round" }) }) })) : (jsxRuntime.jsx("span", {})), jsxRuntime.jsxs("span", { className: "szc-mobile-head__title", children: [jsxRuntime.jsx("span", { className: "szc-mobile-head__dot", children: jsxRuntime.jsx(HeadIcon, {}) }), headTitle] }), flowIndex >= 0 ? (jsxRuntime.jsx("span", { className: "szc-mobile-head__count", children: t.stepOf(labels.formatNumber(flowIndex + 1, state.locale), labels.formatNumber(flowSteps.length, state.locale)) })) : (jsxRuntime.jsx("span", {}))] }));
835
- return (jsxRuntime.jsxs("div", { className: `szc-root${className ? ` ${className}` : ''}`, dir: direction, style: themeVars(theme), children: [mobileHead, jsxRuntime.jsx(Stepper, {}), bootstrapping ? (jsxRuntime.jsx(CheckoutSkeleton, { label: t.loading })) : fatal ? (jsxRuntime.jsx(ErrorBanner, { message: error.message })) : isResult ? (jsxRuntime.jsx("div", { className: "szc-result-wrap", children: jsxRuntime.jsx(ResultStep, { continueShoppingUrl: continueShoppingUrl }) })) : (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs("div", { className: `szc-layout${cartEmpty ? ' szc-layout--full' : ''}`, children: [jsxRuntime.jsxs("main", { className: "szc-main", children: [error ? jsxRuntime.jsx(ErrorBanner, { message: error.message }) : null, step === 'cart' ? jsxRuntime.jsx(CartStep, { continueShoppingUrl: continueShoppingUrl, renderEmpty: renderEmptyCart }) : null, step === 'shipping' ? jsxRuntime.jsx(ShippingStep, {}) : null, step === 'payment' ? jsxRuntime.jsx(PaymentStep, {}) : null, actionsVisible && backButtonNode ? (jsxRuntime.jsx("div", { className: "szc-back-row", children: backButtonNode })) : null] }), !cartEmpty ? (jsxRuntime.jsxs("div", { className: "szc-side", children: [jsxRuntime.jsx(OrderSummary, {}), actionsVisible ? jsxRuntime.jsx("div", { className: "szc-side__cta", children: nextButtonNode }) : null] })) : null] }) })), actionsVisible ? (jsxRuntime.jsx("div", { className: "szc-footer-bar", children: jsxRuntime.jsxs("div", { className: "szc-footer", children: [jsxRuntime.jsxs("div", { className: "szc-footer__total", children: [jsxRuntime.jsx("span", { className: "szc-footer__total-label", children: t.total }), jsxRuntime.jsx("span", { className: "szc-footer__total-value", children: money(summary.total) })] }), jsxRuntime.jsx("div", { className: "szc-footer__actions", children: nextButtonNode })] }) })) : null] }));
848
+ return (jsxRuntime.jsxs("div", { className: `szc-root${className ? ` ${className}` : ''}`, dir: direction, style: themeVars(theme), children: [mobileHead, jsxRuntime.jsx(Stepper, {}), bootstrapping ? (jsxRuntime.jsx(CheckoutLoading, { label: t.loading })) : fatal ? (jsxRuntime.jsx(ErrorBanner, { message: error.message })) : isResult ? (jsxRuntime.jsx("div", { className: "szc-result-wrap", children: jsxRuntime.jsx(ResultStep, { continueShoppingUrl: continueShoppingUrl }) })) : (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs("div", { className: `szc-layout${cartEmpty ? ' szc-layout--full' : ''}`, children: [jsxRuntime.jsxs("main", { className: "szc-main", children: [error && !emptyCartError ? jsxRuntime.jsx(ErrorBanner, { message: error.message }) : null, step === 'cart' ? (jsxRuntime.jsx(CartStep, { continueShoppingUrl: continueShoppingUrl, emptyCart: emptyCart, renderEmpty: renderEmptyCart })) : null, step === 'shipping' ? jsxRuntime.jsx(ShippingStep, {}) : null, step === 'payment' ? jsxRuntime.jsx(PaymentStep, {}) : null, actionsVisible && backButtonNode ? (jsxRuntime.jsx("div", { className: "szc-back-row", children: backButtonNode })) : null] }), !cartEmpty ? (jsxRuntime.jsxs("div", { className: "szc-side", children: [jsxRuntime.jsx(OrderSummary, {}), actionsVisible ? jsxRuntime.jsx("div", { className: "szc-side__cta", children: nextButtonNode }) : null] })) : null] }) })), actionsVisible ? (jsxRuntime.jsx("div", { className: "szc-footer-bar", children: jsxRuntime.jsxs("div", { className: "szc-footer", children: [jsxRuntime.jsxs("div", { className: "szc-footer__total", children: [jsxRuntime.jsx("span", { className: "szc-footer__total-label", children: t.total }), jsxRuntime.jsx("span", { className: "szc-footer__total-value", children: money(summary.total) })] }), jsxRuntime.jsx("div", { className: "szc-footer__actions", children: nextButtonNode })] }) })) : null] }));
836
849
  }
837
850
 
838
- function SazitoCheckoutPage({ credentials, config, paymentReturnParams, className, renderNextButton, renderBackButton, renderEmptyCart, }) {
851
+ function SazitoCheckoutPage({ credentials, config, paymentReturnParams, className, renderNextButton, renderBackButton, renderEmptyCart, emptyCart, }) {
839
852
  const isReturn = paymentReturnParams != null;
840
853
  const client = useCheckout.useSazitoClient();
841
- return (jsxRuntime.jsxs(useCheckout.CheckoutProvider, { client: client, credentials: credentials, config: config, autoStart: !isReturn, children: [isReturn ? jsxRuntime.jsx(ResolveReturn, { params: paymentReturnParams }) : null, jsxRuntime.jsx(SazitoCheckout, { theme: config?.theme, continueShoppingUrl: config?.continueShoppingUrl, className: className, renderNextButton: renderNextButton, renderBackButton: renderBackButton, renderEmptyCart: renderEmptyCart })] }));
854
+ return (jsxRuntime.jsxs(useCheckout.CheckoutProvider, { client: client, credentials: credentials, config: config, autoStart: !isReturn, children: [isReturn ? jsxRuntime.jsx(ResolveReturn, { params: paymentReturnParams }) : null, jsxRuntime.jsx(SazitoCheckout, { theme: config?.theme, continueShoppingUrl: config?.continueShoppingUrl, className: className, renderNextButton: renderNextButton, renderBackButton: renderBackButton, renderEmptyCart: renderEmptyCart, emptyCart: emptyCart })] }));
842
855
  }
843
856
  function ResolveReturn({ params }) {
844
857
  const { actions } = useCheckout.useCheckout();