@thorprovider/blocks 3.0.2 → 4.0.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 +61 -21
- package/dist/blocks/designs/marketplace-product-card/block.d.ts +12 -0
- package/dist/blocks/designs/marketplace-product-card/block.d.ts.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/block.js +243 -0
- package/dist/blocks/designs/marketplace-product-card/block.js.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/block.mjs +233 -0
- package/dist/blocks/designs/marketplace-product-card/block.mjs.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/index.d.ts +3 -0
- package/dist/blocks/designs/marketplace-product-card/index.d.ts.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/index.js +36 -0
- package/dist/blocks/designs/marketplace-product-card/index.js.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/index.mjs +6 -0
- package/dist/blocks/designs/marketplace-product-card/index.mjs.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/normalize.d.ts +13 -0
- package/dist/blocks/designs/marketplace-product-card/normalize.d.ts.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/normalize.js +36 -0
- package/dist/blocks/designs/marketplace-product-card/normalize.js.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/normalize.mjs +12 -0
- package/dist/blocks/designs/marketplace-product-card/normalize.mjs.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/variants.d.ts +72 -0
- package/dist/blocks/designs/marketplace-product-card/variants.d.ts.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/variants.js +123 -0
- package/dist/blocks/designs/marketplace-product-card/variants.js.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/variants.mjs +89 -0
- package/dist/blocks/designs/marketplace-product-card/variants.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkbox-check.js +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkbox-check.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkbox-check.mjs +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkbox-check.mjs.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.d.ts +11 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.js +46 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.mjs +22 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.d.ts +28 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.js +278 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.mjs +260 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.d.ts +12 -9
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.d.ts.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.js +49 -71
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.mjs +50 -72
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.mjs.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.d.ts.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.js +6 -3
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.mjs +6 -3
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.mjs.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.d.ts +7 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.js +41 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.mjs +16 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.d.ts +24 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.js +75 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.mjs +58 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.d.ts +3 -2
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.d.ts.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.js +9 -2
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.mjs +9 -2
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.mjs.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.d.ts +23 -8
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.d.ts.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.js +136 -31
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.mjs +143 -32
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.mjs.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.d.ts +13 -7
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.d.ts.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.js +179 -28
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.mjs +180 -29
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.mjs.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.d.ts +20 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.js +199 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.mjs +175 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.d.ts +14 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.js +136 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.mjs +109 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.d.ts +32 -10
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.d.ts.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.js +265 -147
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.mjs +272 -148
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.mjs.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.d.ts +13 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.js +74 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.mjs +50 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.d.ts +7 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.js +91 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.mjs +65 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout.d.ts +174 -44
- package/dist/blocks/e-commerce/checkout-forms/checkout.d.ts.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout.js +532 -108
- package/dist/blocks/e-commerce/checkout-forms/checkout.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout.mjs +542 -109
- package/dist/blocks/e-commerce/checkout-forms/checkout.mjs.map +1 -1
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.d.ts.map +1 -1
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.js +44 -20
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.js.map +1 -1
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.mjs +44 -20
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.mjs.map +1 -1
- package/dist/blocks/e-commerce/navigation/storefront-navbar.d.ts.map +1 -1
- package/dist/blocks/e-commerce/navigation/storefront-navbar.js +21 -10
- package/dist/blocks/e-commerce/navigation/storefront-navbar.js.map +1 -1
- package/dist/blocks/e-commerce/navigation/storefront-navbar.mjs +21 -10
- package/dist/blocks/e-commerce/navigation/storefront-navbar.mjs.map +1 -1
- package/dist/blocks/e-commerce/product-list/product-card.d.ts.map +1 -1
- package/dist/blocks/e-commerce/product-list/product-card.js +36 -9
- package/dist/blocks/e-commerce/product-list/product-card.js.map +1 -1
- package/dist/blocks/e-commerce/product-list/product-card.mjs +36 -9
- package/dist/blocks/e-commerce/product-list/product-card.mjs.map +1 -1
- package/dist/blocks/e-commerce/product-list/product-showcase-1.d.ts.map +1 -1
- package/dist/blocks/e-commerce/product-list/product-showcase-1.js +7 -2
- package/dist/blocks/e-commerce/product-list/product-showcase-1.js.map +1 -1
- package/dist/blocks/e-commerce/product-list/product-showcase-1.mjs +7 -2
- package/dist/blocks/e-commerce/product-list/product-showcase-1.mjs.map +1 -1
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.d.ts.map +1 -1
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.js +5 -1
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.js.map +1 -1
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.mjs +5 -1
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.mjs.map +1 -1
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.d.ts.map +1 -1
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.js +71 -51
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.js.map +1 -1
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.mjs +71 -51
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.mjs.map +1 -1
- package/dist/blocks/marketing/banners/banner-1.d.ts.map +1 -1
- package/dist/blocks/marketing/banners/banner-1.js +15 -27
- package/dist/blocks/marketing/banners/banner-1.js.map +1 -1
- package/dist/blocks/marketing/banners/banner-1.mjs +16 -28
- package/dist/blocks/marketing/banners/banner-1.mjs.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -0
- package/dist/index.mjs.map +1 -1
- package/dist/lib/contracts/marketplace-product-card.d.ts +324 -0
- package/dist/lib/contracts/marketplace-product-card.d.ts.map +1 -0
- package/dist/lib/contracts/marketplace-product-card.js +85 -0
- package/dist/lib/contracts/marketplace-product-card.js.map +1 -0
- package/dist/lib/contracts/marketplace-product-card.mjs +61 -0
- package/dist/lib/contracts/marketplace-product-card.mjs.map +1 -0
- package/dist/lib/contracts.d.ts +1861 -88
- package/dist/lib/contracts.d.ts.map +1 -1
- package/dist/lib/contracts.js +252 -25
- package/dist/lib/contracts.js.map +1 -1
- package/dist/lib/contracts.mjs +208 -5
- package/dist/lib/contracts.mjs.map +1 -1
- package/dist/lib/money-schema.d.ts +19 -0
- package/dist/lib/money-schema.d.ts.map +1 -0
- package/dist/lib/money-schema.js +33 -0
- package/dist/lib/money-schema.js.map +1 -0
- package/dist/lib/money-schema.mjs +9 -0
- package/dist/lib/money-schema.mjs.map +1 -0
- package/dist/lib/motion.d.ts +29 -0
- package/dist/lib/motion.d.ts.map +1 -0
- package/dist/lib/motion.js +65 -0
- package/dist/lib/motion.js.map +1 -0
- package/dist/lib/motion.mjs +41 -0
- package/dist/lib/motion.mjs.map +1 -0
- package/dist/ui/accordion.d.ts +3 -1
- package/dist/ui/accordion.d.ts.map +1 -1
- package/dist/ui/accordion.js +21 -5
- package/dist/ui/accordion.js.map +1 -1
- package/dist/ui/accordion.mjs +21 -5
- package/dist/ui/accordion.mjs.map +1 -1
- package/dist/ui/input-group.d.ts +1 -1
- package/package.json +18 -3
- package/dist/.tsbuildinfo +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-location-select.tsx"],"sourcesContent":["'use client'\n\nimport { Button } from '../../../ui/button'\nimport { Field, FieldLabel } from '../../../ui/field'\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../../ui/select'\nimport type { CheckoutAddressOption, CheckoutReadState } from '@thorprovider/types'\nimport { CheckoutFieldFeedback, checkoutFieldAria } from './checkout-field-feedback'\nimport type { CheckoutFieldError } from './checkout-form-types'\nimport type { CheckoutLabels } from './checkout'\n\nexport interface CheckoutLocationSelectProps {\n id: string\n label: string\n placeholder: string\n value: string\n options: CheckoutAddressOption[]\n state?: CheckoutReadState\n error?: string\n disabled?: boolean\n onChange: (value: string) => void\n onRetry?: () => void\n labels: CheckoutLabels\n errors?: CheckoutFieldError[]\n description?: string\n}\n\n/**\n * One country/province/city selector. The block renders the supplied options\n * and states; it never fetches, filters, clears, or cascades them.\n */\nexport function CheckoutLocationSelect({\n id,\n label,\n placeholder,\n value,\n options,\n state = 'idle',\n error,\n disabled = false,\n onChange,\n onRetry,\n labels,\n errors,\n description,\n}: CheckoutLocationSelectProps) {\n const pending = state === 'pending'\n const failed = state === 'error'\n const unavailable = state === 'unavailable'\n const noOptions = options.length === 0\n const isDisabled = disabled || pending || failed || unavailable || noOptions\n const locationErrors: CheckoutFieldError[] = error ? [{ message: error }] : []\n const allErrors = [...(errors ?? []), ...locationErrors]\n\n return (\n <Field data-invalid={!!allErrors.length}>\n <FieldLabel htmlFor={id}>{label}</FieldLabel>\n <Select value={value} onValueChange={onChange} disabled={isDisabled}>\n <SelectTrigger id={id} data-checkout-location={id} {...checkoutFieldAria(id, allErrors)}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\n {pending ? (\n <p className=\"text-muted-foreground text-sm\" role=\"status\">\n {labels.locationLoadingLabel}\n </p>\n ) : null}\n {unavailable || (!pending && !failed && noOptions) ? (\n <p className=\"text-muted-foreground text-sm\" role=\"status\">\n {labels.locationUnavailableLabel}\n </p>\n ) : null}\n {failed && onRetry ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetry}>\n {labels.retryLabel}\n </Button>\n ) : null}\n <CheckoutFieldFeedback\n id={id}\n errors={allErrors}\n description={description}\n />\n </Field>\n )\n}\n"],"mappings":";AA8DM,cACA,YADA;AA5DN,SAAS,cAAc;AACvB,SAAS,OAAO,kBAAkB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,uBAAuB,yBAAyB;AAwBlD,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgC;AAC9B,QAAM,UAAU,UAAU;AAC1B,QAAM,SAAS,UAAU;AACzB,QAAM,cAAc,UAAU;AAC9B,QAAM,YAAY,QAAQ,WAAW;AACrC,QAAM,aAAa,YAAY,WAAW,UAAU,eAAe;AACnE,QAAM,iBAAuC,QAAQ,CAAC,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC;AAC7E,QAAM,YAAY,CAAC,GAAI,UAAU,CAAC,GAAI,GAAG,cAAc;AAEvD,SACE,qBAAC,SAAM,gBAAc,CAAC,CAAC,UAAU,QAC/B;AAAA,wBAAC,cAAW,SAAS,IAAK,iBAAM;AAAA,IAChC,qBAAC,UAAO,OAAc,eAAe,UAAU,UAAU,YACvD;AAAA,0BAAC,iBAAc,IAAQ,0BAAwB,IAAK,GAAG,kBAAkB,IAAI,SAAS,GACpF,8BAAC,eAAY,aAA0B,GACzC;AAAA,MACA,oBAAC,iBACC,8BAAC,eACE,kBAAQ,IAAI,CAAC,WACZ,oBAAC,cAA8B,OAAO,OAAO,OAC1C,iBAAO,SADO,OAAO,KAExB,CACD,GACH,GACF;AAAA,OACF;AAAA,IACC,UACC,oBAAC,OAAE,WAAU,iCAAgC,MAAK,UAC/C,iBAAO,sBACV,IACE;AAAA,IACH,eAAgB,CAAC,WAAW,CAAC,UAAU,YACtC,oBAAC,OAAE,WAAU,iCAAgC,MAAK,UAC/C,iBAAO,0BACV,IACE;AAAA,IACH,UAAU,UACT,oBAAC,UAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,WAAU,SAAQ,SAAS,SAC1E,iBAAO,YACV,IACE;AAAA,IACJ;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAQ;AAAA,QACR;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Money } from '@thorprovider/types';
|
|
2
|
-
import type { CheckoutLabels, CheckoutOrderSummary, CheckoutTotalsState } from './checkout';
|
|
2
|
+
import type { CheckoutAdjustmentPayment, CheckoutLabels, CheckoutOrderSummary, CheckoutTotalsState } from './checkout';
|
|
3
3
|
export interface CheckoutOrderSummaryPanelProps {
|
|
4
4
|
summary: CheckoutOrderSummary;
|
|
5
5
|
labels: CheckoutLabels;
|
|
@@ -10,11 +10,12 @@ export interface CheckoutOrderSummaryPanelProps {
|
|
|
10
10
|
onPromoCodeChange: (value: string) => void;
|
|
11
11
|
onApplyPromo?: (code: string) => void;
|
|
12
12
|
promoPending?: boolean;
|
|
13
|
+
adjustmentPayments?: CheckoutAdjustmentPayment[];
|
|
13
14
|
trustNotes?: string[];
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
17
|
* Internal projection of the checkout's own cart. It is not a public block: the
|
|
17
18
|
* amount contract is `Money` only and every total is rendered verbatim.
|
|
18
19
|
*/
|
|
19
|
-
export declare function CheckoutOrderSummaryPanel({ summary, labels, formatMoney: formatMoneyProp, totalsState, onRetryTotals, promoCode, onPromoCodeChange, onApplyPromo, promoPending, trustNotes, }: CheckoutOrderSummaryPanelProps): import("react").JSX.Element;
|
|
20
|
+
export declare function CheckoutOrderSummaryPanel({ summary, labels, formatMoney: formatMoneyProp, totalsState, onRetryTotals, promoCode, onPromoCodeChange, onApplyPromo, promoPending, adjustmentPayments, trustNotes, }: CheckoutOrderSummaryPanelProps): import("react").JSX.Element;
|
|
20
21
|
//# sourceMappingURL=checkout-order-summary.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout-order-summary.d.ts","sourceRoot":"","sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-order-summary.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"checkout-order-summary.d.ts","sourceRoot":"","sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-order-summary.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,KAAK,EACV,yBAAyB,EACzB,cAAc,EACd,oBAAoB,EAEpB,mBAAmB,EACpB,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,oBAAoB,CAAA;IAC7B,MAAM,EAAE,cAAc,CAAA;IACtB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAA;IACtC,WAAW,CAAC,EAAE,mBAAmB,CAAA;IACjC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,kBAAkB,CAAC,EAAE,yBAAyB,EAAE,CAAA;IAChD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,OAAO,EACP,MAAM,EACN,WAAW,EAAE,eAAe,EAC5B,WAAoB,EACpB,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,YAAoB,EACpB,kBAAkB,EAClB,UAAU,GACX,EAAE,8BAA8B,+BAqMhC"}
|
|
@@ -28,6 +28,7 @@ var import_badge = require("../../../ui/badge.js");
|
|
|
28
28
|
var import_button = require("../../../ui/button.js");
|
|
29
29
|
var import_card = require("../../../ui/card.js");
|
|
30
30
|
var import_field = require("../../../ui/field.js");
|
|
31
|
+
var import_checkout_id_context = require("./checkout-id-context.js");
|
|
31
32
|
var import_input = require("../../../ui/input.js");
|
|
32
33
|
var import_separator = require("../../../ui/separator.js");
|
|
33
34
|
var import_money = require("../../../lib/money.js");
|
|
@@ -41,8 +42,10 @@ function CheckoutOrderSummaryPanel({
|
|
|
41
42
|
onPromoCodeChange,
|
|
42
43
|
onApplyPromo,
|
|
43
44
|
promoPending = false,
|
|
45
|
+
adjustmentPayments,
|
|
44
46
|
trustNotes
|
|
45
47
|
}) {
|
|
48
|
+
const checkoutId = (0, import_checkout_id_context.useCheckoutIds)();
|
|
46
49
|
const format = (value) => (0, import_money.formatMoney)(value, formatMoneyProp);
|
|
47
50
|
const lineAmount = (item) => (0, import_money.isAvailableMoney)(item.lineTotal) ? format(item.lineTotal) : null;
|
|
48
51
|
const renderTotals = () => {
|
|
@@ -137,12 +140,12 @@ function CheckoutOrderSummaryPanel({
|
|
|
137
140
|
onApplyPromo ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
138
141
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_separator.Separator, {}),
|
|
139
142
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.Field, { className: "gap-2", children: [
|
|
140
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldLabel, { htmlFor: "checkout-promo-code", children: labels.promoCodeLabel }),
|
|
143
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldLabel, { htmlFor: checkoutId("checkout-promo-code"), children: labels.promoCodeLabel }),
|
|
141
144
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex gap-2", children: [
|
|
142
145
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
143
146
|
import_input.Input,
|
|
144
147
|
{
|
|
145
|
-
id: "checkout-promo-code",
|
|
148
|
+
id: checkoutId("checkout-promo-code"),
|
|
146
149
|
placeholder: labels.promoPlaceholder,
|
|
147
150
|
value: promoCode,
|
|
148
151
|
onChange: (e) => onPromoCodeChange(e.target.value)
|
|
@@ -161,6 +164,10 @@ function CheckoutOrderSummaryPanel({
|
|
|
161
164
|
] })
|
|
162
165
|
] })
|
|
163
166
|
] }) : null,
|
|
167
|
+
adjustmentPayments && adjustmentPayments.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex flex-col gap-2 text-sm", children: adjustmentPayments.map((adjustment) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
168
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground", children: adjustment.label }),
|
|
169
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "font-medium tabular-nums", children: format(adjustment.amount) })
|
|
170
|
+
] }, adjustment.id)) }) : null,
|
|
164
171
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_separator.Separator, {}),
|
|
165
172
|
renderTotals(),
|
|
166
173
|
trustNotes && trustNotes.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-muted-foreground flex flex-col gap-2 text-sm", children: trustNotes.map((note, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "flex items-center gap-2", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-order-summary.tsx"],"sourcesContent":["'use client'\n\nimport { Shield, Truck } from 'lucide-react'\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardTitle } from '../../../ui/card'\nimport { Field, FieldLabel } from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport { Separator } from '../../../ui/separator'\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport type { Money } from '@thorprovider/types'\nimport type {\n CheckoutLabels,\n CheckoutOrderSummary,\n CheckoutOrderLine,\n CheckoutTotalsState,\n} from './checkout'\n\nexport interface CheckoutOrderSummaryPanelProps {\n summary: CheckoutOrderSummary\n labels: CheckoutLabels\n formatMoney?: (money: Money) => string\n totalsState?: CheckoutTotalsState\n onRetryTotals?: () => void\n promoCode: string\n onPromoCodeChange: (value: string) => void\n onApplyPromo?: (code: string) => void\n promoPending?: boolean\n trustNotes?: string[]\n}\n\n/**\n * Internal projection of the checkout's own cart. It is not a public block: the\n * amount contract is `Money` only and every total is rendered verbatim.\n */\nexport function CheckoutOrderSummaryPanel({\n summary,\n labels,\n formatMoney: formatMoneyProp,\n totalsState = 'idle',\n onRetryTotals,\n promoCode,\n onPromoCodeChange,\n onApplyPromo,\n promoPending = false,\n trustNotes,\n}: CheckoutOrderSummaryPanelProps) {\n const format = (value: Money | null | undefined) => formatMoney(value, formatMoneyProp)\n const lineAmount = (item: CheckoutOrderLine): string | null =>\n isAvailableMoney(item.lineTotal) ? format(item.lineTotal) : null\n\n const renderTotals = () => {\n if (totalsState === 'pending') {\n return (\n <p className=\"text-muted-foreground text-sm\" aria-live=\"polite\">\n {labels.totalsPendingLabel}\n </p>\n )\n }\n if (totalsState === 'error') {\n return (\n <div className=\"flex flex-col gap-2\" role=\"alert\">\n <p className=\"text-destructive text-sm\">{labels.totalsErrorLabel}</p>\n {onRetryTotals ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryTotals}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n const totals = summary.totals\n if (!totals) {\n return (\n <div className=\"flex flex-col gap-2\" role=\"status\">\n <p className=\"text-muted-foreground text-sm\">{labels.totalsUnavailableLabel}</p>\n {onRetryTotals ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryTotals}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n const subtotalText = format(totals.subtotal)\n const totalText = format(totals.total)\n // Required totals: an absent/malformed amount is unavailable, never a\n // fabricated zero.\n if (subtotalText === null || totalText === null) {\n return (\n <div className=\"flex flex-col gap-2\" role=\"status\">\n <p className=\"text-muted-foreground text-sm\">{labels.totalsUnavailableLabel}</p>\n {onRetryTotals ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryTotals}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n return (\n <div className=\"flex flex-col gap-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">{labels.subtotalLabel}</span>\n <span className=\"font-medium tabular-nums\">{subtotalText}</span>\n </div>\n {isAvailableMoney(totals.discount) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">{labels.discountLabel}</span>\n <span className=\"font-medium tabular-nums\">{format(totals.discount)}</span>\n </div>\n ) : null}\n {isAvailableMoney(totals.tax) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">{labels.taxLabel}</span>\n <span className=\"font-medium tabular-nums\">{format(totals.tax)}</span>\n </div>\n ) : null}\n {isAvailableMoney(totals.shipping) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-1.5 text-muted-foreground\">\n <Truck aria-hidden=\"true\" className=\"size-4\" />\n {labels.shippingLabel}\n </span>\n <span className=\"font-medium tabular-nums\">{format(totals.shipping)}</span>\n </div>\n ) : null}\n <Separator />\n <div className=\"flex items-center justify-between\">\n <span className=\"font-semibold\">{labels.totalLabel}</span>\n <span className=\"font-semibold tabular-nums\">{totalText}</span>\n </div>\n </div>\n )\n }\n\n return (\n <Card className=\"lg:sticky lg:top-8\">\n <CardContent className=\"flex flex-col gap-4 p-6\">\n <CardTitle>{labels.orderSummaryTitle}</CardTitle>\n\n <div className=\"flex flex-col gap-4\">\n {summary.items.map((item) => {\n const amount = lineAmount(item)\n return (\n <div key={String(item.id)} className=\"flex items-center gap-3\">\n <div className=\"relative\">\n {item.image ? (\n <img\n src={item.image}\n alt={item.name}\n width={64}\n height={64}\n className=\"bg-muted size-16 rounded-lg object-cover\"\n />\n ) : (\n <div aria-hidden=\"true\" className=\"bg-muted size-16 rounded-lg\" />\n )}\n <Badge\n variant=\"secondary\"\n className=\"absolute -right-2 -top-2 size-6 justify-center rounded-full p-0 text-xs\"\n >\n {item.quantity}\n </Badge>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium\">{item.name}</p>\n {item.variant ? (\n <p className=\"text-sm text-muted-foreground\">{item.variant}</p>\n ) : null}\n {item.quantity > 1 && isAvailableMoney(item.unitPrice) ? (\n <p className=\"text-muted-foreground text-xs\">\n {format(item.unitPrice)} {labels.eachLabel}\n </p>\n ) : null}\n </div>\n <p className=\"text-sm font-medium tabular-nums\">\n {amount ?? labels.amountUnavailableLabel}\n </p>\n </div>\n )\n })}\n </div>\n\n {onApplyPromo ? (\n <>\n <Separator />\n <Field className=\"gap-2\">\n <FieldLabel htmlFor=\"checkout-promo-code\">{labels.promoCodeLabel}</FieldLabel>\n <div className=\"flex gap-2\">\n <Input\n id=\"checkout-promo-code\"\n placeholder={labels.promoPlaceholder}\n value={promoCode}\n onChange={(e) => onPromoCodeChange(e.target.value)}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={promoPending}\n onClick={() => onApplyPromo(promoCode)}\n >\n {labels.promoApplyLabel}\n </Button>\n </div>\n </Field>\n </>\n ) : null}\n\n <Separator />\n\n {renderTotals()}\n\n {trustNotes && trustNotes.length > 0 ? (\n <div className=\"text-muted-foreground flex flex-col gap-2 text-sm\">\n {trustNotes.map((note, index) => (\n <span key={`${index}:${note}`} className=\"flex items-center gap-2\">\n <Shield aria-hidden=\"true\" className=\"size-4\" />\n {note}\n </span>\n ))}\n </div>\n ) : null}\n </CardContent>\n </Card>\n )\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-order-summary.tsx"],"sourcesContent":["'use client'\n\nimport { Shield, Truck } from 'lucide-react'\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardTitle } from '../../../ui/card'\nimport { Field, FieldLabel } from '../../../ui/field'\nimport { useCheckoutIds } from './checkout-id-context'\nimport { Input } from '../../../ui/input'\nimport { Separator } from '../../../ui/separator'\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport type { Money } from '@thorprovider/types'\nimport type {\n CheckoutAdjustmentPayment,\n CheckoutLabels,\n CheckoutOrderSummary,\n CheckoutOrderLine,\n CheckoutTotalsState,\n} from './checkout'\n\nexport interface CheckoutOrderSummaryPanelProps {\n summary: CheckoutOrderSummary\n labels: CheckoutLabels\n formatMoney?: (money: Money) => string\n totalsState?: CheckoutTotalsState\n onRetryTotals?: () => void\n promoCode: string\n onPromoCodeChange: (value: string) => void\n onApplyPromo?: (code: string) => void\n promoPending?: boolean\n adjustmentPayments?: CheckoutAdjustmentPayment[]\n trustNotes?: string[]\n}\n\n/**\n * Internal projection of the checkout's own cart. It is not a public block: the\n * amount contract is `Money` only and every total is rendered verbatim.\n */\nexport function CheckoutOrderSummaryPanel({\n summary,\n labels,\n formatMoney: formatMoneyProp,\n totalsState = 'idle',\n onRetryTotals,\n promoCode,\n onPromoCodeChange,\n onApplyPromo,\n promoPending = false,\n adjustmentPayments,\n trustNotes,\n}: CheckoutOrderSummaryPanelProps) {\n const checkoutId = useCheckoutIds()\n const format = (value: Money | null | undefined) => formatMoney(value, formatMoneyProp)\n const lineAmount = (item: CheckoutOrderLine): string | null =>\n isAvailableMoney(item.lineTotal) ? format(item.lineTotal) : null\n\n const renderTotals = () => {\n if (totalsState === 'pending') {\n return (\n <p className=\"text-muted-foreground text-sm\" aria-live=\"polite\">\n {labels.totalsPendingLabel}\n </p>\n )\n }\n if (totalsState === 'error') {\n return (\n <div className=\"flex flex-col gap-2\" role=\"alert\">\n <p className=\"text-destructive text-sm\">{labels.totalsErrorLabel}</p>\n {onRetryTotals ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryTotals}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n const totals = summary.totals\n if (!totals) {\n return (\n <div className=\"flex flex-col gap-2\" role=\"status\">\n <p className=\"text-muted-foreground text-sm\">{labels.totalsUnavailableLabel}</p>\n {onRetryTotals ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryTotals}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n const subtotalText = format(totals.subtotal)\n const totalText = format(totals.total)\n // Required totals: an absent/malformed amount is unavailable, never a\n // fabricated zero.\n if (subtotalText === null || totalText === null) {\n return (\n <div className=\"flex flex-col gap-2\" role=\"status\">\n <p className=\"text-muted-foreground text-sm\">{labels.totalsUnavailableLabel}</p>\n {onRetryTotals ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryTotals}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n return (\n <div className=\"flex flex-col gap-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">{labels.subtotalLabel}</span>\n <span className=\"font-medium tabular-nums\">{subtotalText}</span>\n </div>\n {isAvailableMoney(totals.discount) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">{labels.discountLabel}</span>\n <span className=\"font-medium tabular-nums\">{format(totals.discount)}</span>\n </div>\n ) : null}\n {isAvailableMoney(totals.tax) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">{labels.taxLabel}</span>\n <span className=\"font-medium tabular-nums\">{format(totals.tax)}</span>\n </div>\n ) : null}\n {isAvailableMoney(totals.shipping) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-1.5 text-muted-foreground\">\n <Truck aria-hidden=\"true\" className=\"size-4\" />\n {labels.shippingLabel}\n </span>\n <span className=\"font-medium tabular-nums\">{format(totals.shipping)}</span>\n </div>\n ) : null}\n <Separator />\n <div className=\"flex items-center justify-between\">\n <span className=\"font-semibold\">{labels.totalLabel}</span>\n <span className=\"font-semibold tabular-nums\">{totalText}</span>\n </div>\n </div>\n )\n }\n\n return (\n <Card className=\"lg:sticky lg:top-8\">\n <CardContent className=\"flex flex-col gap-4 p-6\">\n <CardTitle>{labels.orderSummaryTitle}</CardTitle>\n\n <div className=\"flex flex-col gap-4\">\n {summary.items.map((item) => {\n const amount = lineAmount(item)\n return (\n <div key={String(item.id)} className=\"flex items-center gap-3\">\n <div className=\"relative\">\n {item.image ? (\n <img\n src={item.image}\n alt={item.name}\n width={64}\n height={64}\n className=\"bg-muted size-16 rounded-lg object-cover\"\n />\n ) : (\n <div aria-hidden=\"true\" className=\"bg-muted size-16 rounded-lg\" />\n )}\n <Badge\n variant=\"secondary\"\n className=\"absolute -right-2 -top-2 size-6 justify-center rounded-full p-0 text-xs\"\n >\n {item.quantity}\n </Badge>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium\">{item.name}</p>\n {item.variant ? (\n <p className=\"text-sm text-muted-foreground\">{item.variant}</p>\n ) : null}\n {item.quantity > 1 && isAvailableMoney(item.unitPrice) ? (\n <p className=\"text-muted-foreground text-xs\">\n {format(item.unitPrice)} {labels.eachLabel}\n </p>\n ) : null}\n </div>\n <p className=\"text-sm font-medium tabular-nums\">\n {amount ?? labels.amountUnavailableLabel}\n </p>\n </div>\n )\n })}\n </div>\n\n {onApplyPromo ? (\n <>\n <Separator />\n <Field className=\"gap-2\">\n <FieldLabel htmlFor={checkoutId('checkout-promo-code')}>{labels.promoCodeLabel}</FieldLabel>\n <div className=\"flex gap-2\">\n <Input\n id={checkoutId('checkout-promo-code')}\n placeholder={labels.promoPlaceholder}\n value={promoCode}\n onChange={(e) => onPromoCodeChange(e.target.value)}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={promoPending}\n onClick={() => onApplyPromo(promoCode)}\n >\n {labels.promoApplyLabel}\n </Button>\n </div>\n </Field>\n </>\n ) : null}\n\n {adjustmentPayments && adjustmentPayments.length > 0 ? (\n <div className=\"flex flex-col gap-2 text-sm\">\n {adjustmentPayments.map((adjustment) => (\n <div key={adjustment.id} className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">{adjustment.label}</span>\n <span className=\"font-medium tabular-nums\">\n {format(adjustment.amount)}\n </span>\n </div>\n ))}\n </div>\n ) : null}\n\n <Separator />\n\n {renderTotals()}\n\n {trustNotes && trustNotes.length > 0 ? (\n <div className=\"text-muted-foreground flex flex-col gap-2 text-sm\">\n {trustNotes.map((note, index) => (\n <span key={`${index}:${note}`} className=\"flex items-center gap-2\">\n <Shield aria-hidden=\"true\" className=\"size-4\" />\n {note}\n </span>\n ))}\n </div>\n ) : null}\n </CardContent>\n </Card>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2DQ;AAzDR,0BAA8B;AAC9B,mBAAsB;AACtB,oBAAuB;AACvB,kBAA6C;AAC7C,mBAAkC;AAClC,iCAA+B;AAC/B,mBAAsB;AACtB,uBAA0B;AAC1B,mBAA8C;AA4BvC,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AACF,GAAmC;AACjC,QAAM,iBAAa,2CAAe;AAClC,QAAM,SAAS,CAAC,cAAoC,0BAAY,OAAO,eAAe;AACtF,QAAM,aAAa,CAAC,aAClB,+BAAiB,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,IAAI;AAE9D,QAAM,eAAe,MAAM;AACzB,QAAI,gBAAgB,WAAW;AAC7B,aACE,4CAAC,OAAE,WAAU,iCAAgC,aAAU,UACpD,iBAAO,oBACV;AAAA,IAEJ;AACA,QAAI,gBAAgB,SAAS;AAC3B,aACE,6CAAC,SAAI,WAAU,uBAAsB,MAAK,SACxC;AAAA,oDAAC,OAAE,WAAU,4BAA4B,iBAAO,kBAAiB;AAAA,QAChE,gBACC,4CAAC,wBAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,WAAU,SAAQ,SAAS,eAC1E,iBAAO,YACV,IACE;AAAA,SACN;AAAA,IAEJ;AAEA,UAAM,SAAS,QAAQ;AACvB,QAAI,CAAC,QAAQ;AACX,aACE,6CAAC,SAAI,WAAU,uBAAsB,MAAK,UACxC;AAAA,oDAAC,OAAE,WAAU,iCAAiC,iBAAO,wBAAuB;AAAA,QAC3E,gBACC,4CAAC,wBAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,WAAU,SAAQ,SAAS,eAC1E,iBAAO,YACV,IACE;AAAA,SACN;AAAA,IAEJ;AAEA,UAAM,eAAe,OAAO,OAAO,QAAQ;AAC3C,UAAM,YAAY,OAAO,OAAO,KAAK;AAGrC,QAAI,iBAAiB,QAAQ,cAAc,MAAM;AAC/C,aACE,6CAAC,SAAI,WAAU,uBAAsB,MAAK,UACxC;AAAA,oDAAC,OAAE,WAAU,iCAAiC,iBAAO,wBAAuB;AAAA,QAC3E,gBACC,4CAAC,wBAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,WAAU,SAAQ,SAAS,eAC1E,iBAAO,YACV,IACE;AAAA,SACN;AAAA,IAEJ;AAEA,WACE,6CAAC,SAAI,WAAU,+BACb;AAAA,mDAAC,SAAI,WAAU,qCACb;AAAA,oDAAC,UAAK,WAAU,yBAAyB,iBAAO,eAAc;AAAA,QAC9D,4CAAC,UAAK,WAAU,4BAA4B,wBAAa;AAAA,SAC3D;AAAA,UACC,+BAAiB,OAAO,QAAQ,IAC/B,6CAAC,SAAI,WAAU,qCACb;AAAA,oDAAC,UAAK,WAAU,yBAAyB,iBAAO,eAAc;AAAA,QAC9D,4CAAC,UAAK,WAAU,4BAA4B,iBAAO,OAAO,QAAQ,GAAE;AAAA,SACtE,IACE;AAAA,UACH,+BAAiB,OAAO,GAAG,IAC1B,6CAAC,SAAI,WAAU,qCACb;AAAA,oDAAC,UAAK,WAAU,yBAAyB,iBAAO,UAAS;AAAA,QACzD,4CAAC,UAAK,WAAU,4BAA4B,iBAAO,OAAO,GAAG,GAAE;AAAA,SACjE,IACE;AAAA,UACH,+BAAiB,OAAO,QAAQ,IAC/B,6CAAC,SAAI,WAAU,qCACb;AAAA,qDAAC,UAAK,WAAU,mDACd;AAAA,sDAAC,6BAAM,eAAY,QAAO,WAAU,UAAS;AAAA,UAC5C,OAAO;AAAA,WACV;AAAA,QACA,4CAAC,UAAK,WAAU,4BAA4B,iBAAO,OAAO,QAAQ,GAAE;AAAA,SACtE,IACE;AAAA,MACJ,4CAAC,8BAAU;AAAA,MACX,6CAAC,SAAI,WAAU,qCACb;AAAA,oDAAC,UAAK,WAAU,iBAAiB,iBAAO,YAAW;AAAA,QACnD,4CAAC,UAAK,WAAU,8BAA8B,qBAAU;AAAA,SAC1D;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,4CAAC,oBAAK,WAAU,sBACd,uDAAC,2BAAY,WAAU,2BACrB;AAAA,gDAAC,yBAAW,iBAAO,mBAAkB;AAAA,IAErC,4CAAC,SAAI,WAAU,uBACZ,kBAAQ,MAAM,IAAI,CAAC,SAAS;AAC3B,YAAM,SAAS,WAAW,IAAI;AAC9B,aACE,6CAAC,SAA0B,WAAU,2BACnC;AAAA,qDAAC,SAAI,WAAU,YACZ;AAAA,eAAK,QACJ;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,KAAK;AAAA,cACV,KAAK,KAAK;AAAA,cACV,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,WAAU;AAAA;AAAA,UACZ,IAEA,4CAAC,SAAI,eAAY,QAAO,WAAU,+BAA8B;AAAA,UAElE;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAU;AAAA,cAET,eAAK;AAAA;AAAA,UACR;AAAA,WACF;AAAA,QACA,6CAAC,SAAI,WAAU,kBACb;AAAA,sDAAC,OAAE,WAAU,uBAAuB,eAAK,MAAK;AAAA,UAC7C,KAAK,UACJ,4CAAC,OAAE,WAAU,iCAAiC,eAAK,SAAQ,IACzD;AAAA,UACH,KAAK,WAAW,SAAK,+BAAiB,KAAK,SAAS,IACnD,6CAAC,OAAE,WAAU,iCACV;AAAA,mBAAO,KAAK,SAAS;AAAA,YAAE;AAAA,YAAE,OAAO;AAAA,aACnC,IACE;AAAA,WACN;AAAA,QACA,4CAAC,OAAE,WAAU,oCACV,oBAAU,OAAO,wBACpB;AAAA,WAjCQ,OAAO,KAAK,EAAE,CAkCxB;AAAA,IAEJ,CAAC,GACH;AAAA,IAEC,eACC,4EACE;AAAA,kDAAC,8BAAU;AAAA,MACX,6CAAC,sBAAM,WAAU,SACf;AAAA,oDAAC,2BAAW,SAAS,WAAW,qBAAqB,GAAI,iBAAO,gBAAe;AAAA,QAC/E,6CAAC,SAAI,WAAU,cACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,WAAW,qBAAqB;AAAA,cACpC,aAAa,OAAO;AAAA,cACpB,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,kBAAkB,EAAE,OAAO,KAAK;AAAA;AAAA,UACnD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,UAAU;AAAA,cACV,SAAS,MAAM,aAAa,SAAS;AAAA,cAEpC,iBAAO;AAAA;AAAA,UACV;AAAA,WACF;AAAA,SACF;AAAA,OACF,IACE;AAAA,IAEH,sBAAsB,mBAAmB,SAAS,IACjD,4CAAC,SAAI,WAAU,+BACZ,6BAAmB,IAAI,CAAC,eACvB,6CAAC,SAAwB,WAAU,qCACjC;AAAA,kDAAC,UAAK,WAAU,yBAAyB,qBAAW,OAAM;AAAA,MAC1D,4CAAC,UAAK,WAAU,4BACb,iBAAO,WAAW,MAAM,GAC3B;AAAA,SAJQ,WAAW,EAKrB,CACD,GACH,IACE;AAAA,IAEJ,4CAAC,8BAAU;AAAA,IAEV,aAAa;AAAA,IAEb,cAAc,WAAW,SAAS,IACjC,4CAAC,SAAI,WAAU,qDACZ,qBAAW,IAAI,CAAC,MAAM,UACrB,6CAAC,UAA8B,WAAU,2BACvC;AAAA,kDAAC,8BAAO,eAAY,QAAO,WAAU,UAAS;AAAA,MAC7C;AAAA,SAFQ,GAAG,KAAK,IAAI,IAAI,EAG3B,CACD,GACH,IACE;AAAA,KACN,GACF;AAEJ;","names":[]}
|
|
@@ -5,6 +5,7 @@ import { Badge } from "../../../ui/badge.mjs";
|
|
|
5
5
|
import { Button } from "../../../ui/button.mjs";
|
|
6
6
|
import { Card, CardContent, CardTitle } from "../../../ui/card.mjs";
|
|
7
7
|
import { Field, FieldLabel } from "../../../ui/field.mjs";
|
|
8
|
+
import { useCheckoutIds } from "./checkout-id-context.mjs";
|
|
8
9
|
import { Input } from "../../../ui/input.mjs";
|
|
9
10
|
import { Separator } from "../../../ui/separator.mjs";
|
|
10
11
|
import { formatMoney, isAvailableMoney } from "../../../lib/money.mjs";
|
|
@@ -18,8 +19,10 @@ function CheckoutOrderSummaryPanel({
|
|
|
18
19
|
onPromoCodeChange,
|
|
19
20
|
onApplyPromo,
|
|
20
21
|
promoPending = false,
|
|
22
|
+
adjustmentPayments,
|
|
21
23
|
trustNotes
|
|
22
24
|
}) {
|
|
25
|
+
const checkoutId = useCheckoutIds();
|
|
23
26
|
const format = (value) => formatMoney(value, formatMoneyProp);
|
|
24
27
|
const lineAmount = (item) => isAvailableMoney(item.lineTotal) ? format(item.lineTotal) : null;
|
|
25
28
|
const renderTotals = () => {
|
|
@@ -114,12 +117,12 @@ function CheckoutOrderSummaryPanel({
|
|
|
114
117
|
onApplyPromo ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
115
118
|
/* @__PURE__ */ jsx(Separator, {}),
|
|
116
119
|
/* @__PURE__ */ jsxs(Field, { className: "gap-2", children: [
|
|
117
|
-
/* @__PURE__ */ jsx(FieldLabel, { htmlFor: "checkout-promo-code", children: labels.promoCodeLabel }),
|
|
120
|
+
/* @__PURE__ */ jsx(FieldLabel, { htmlFor: checkoutId("checkout-promo-code"), children: labels.promoCodeLabel }),
|
|
118
121
|
/* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
119
122
|
/* @__PURE__ */ jsx(
|
|
120
123
|
Input,
|
|
121
124
|
{
|
|
122
|
-
id: "checkout-promo-code",
|
|
125
|
+
id: checkoutId("checkout-promo-code"),
|
|
123
126
|
placeholder: labels.promoPlaceholder,
|
|
124
127
|
value: promoCode,
|
|
125
128
|
onChange: (e) => onPromoCodeChange(e.target.value)
|
|
@@ -138,6 +141,10 @@ function CheckoutOrderSummaryPanel({
|
|
|
138
141
|
] })
|
|
139
142
|
] })
|
|
140
143
|
] }) : null,
|
|
144
|
+
adjustmentPayments && adjustmentPayments.length > 0 ? /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2 text-sm", children: adjustmentPayments.map((adjustment) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
145
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: adjustment.label }),
|
|
146
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium tabular-nums", children: format(adjustment.amount) })
|
|
147
|
+
] }, adjustment.id)) }) : null,
|
|
141
148
|
/* @__PURE__ */ jsx(Separator, {}),
|
|
142
149
|
renderTotals(),
|
|
143
150
|
trustNotes && trustNotes.length > 0 ? /* @__PURE__ */ jsx("div", { className: "text-muted-foreground flex flex-col gap-2 text-sm", children: trustNotes.map((note, index) => /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-order-summary.tsx"],"sourcesContent":["'use client'\n\nimport { Shield, Truck } from 'lucide-react'\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardTitle } from '../../../ui/card'\nimport { Field, FieldLabel } from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport { Separator } from '../../../ui/separator'\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport type { Money } from '@thorprovider/types'\nimport type {\n CheckoutLabels,\n CheckoutOrderSummary,\n CheckoutOrderLine,\n CheckoutTotalsState,\n} from './checkout'\n\nexport interface CheckoutOrderSummaryPanelProps {\n summary: CheckoutOrderSummary\n labels: CheckoutLabels\n formatMoney?: (money: Money) => string\n totalsState?: CheckoutTotalsState\n onRetryTotals?: () => void\n promoCode: string\n onPromoCodeChange: (value: string) => void\n onApplyPromo?: (code: string) => void\n promoPending?: boolean\n trustNotes?: string[]\n}\n\n/**\n * Internal projection of the checkout's own cart. It is not a public block: the\n * amount contract is `Money` only and every total is rendered verbatim.\n */\nexport function CheckoutOrderSummaryPanel({\n summary,\n labels,\n formatMoney: formatMoneyProp,\n totalsState = 'idle',\n onRetryTotals,\n promoCode,\n onPromoCodeChange,\n onApplyPromo,\n promoPending = false,\n trustNotes,\n}: CheckoutOrderSummaryPanelProps) {\n const format = (value: Money | null | undefined) => formatMoney(value, formatMoneyProp)\n const lineAmount = (item: CheckoutOrderLine): string | null =>\n isAvailableMoney(item.lineTotal) ? format(item.lineTotal) : null\n\n const renderTotals = () => {\n if (totalsState === 'pending') {\n return (\n <p className=\"text-muted-foreground text-sm\" aria-live=\"polite\">\n {labels.totalsPendingLabel}\n </p>\n )\n }\n if (totalsState === 'error') {\n return (\n <div className=\"flex flex-col gap-2\" role=\"alert\">\n <p className=\"text-destructive text-sm\">{labels.totalsErrorLabel}</p>\n {onRetryTotals ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryTotals}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n const totals = summary.totals\n if (!totals) {\n return (\n <div className=\"flex flex-col gap-2\" role=\"status\">\n <p className=\"text-muted-foreground text-sm\">{labels.totalsUnavailableLabel}</p>\n {onRetryTotals ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryTotals}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n const subtotalText = format(totals.subtotal)\n const totalText = format(totals.total)\n // Required totals: an absent/malformed amount is unavailable, never a\n // fabricated zero.\n if (subtotalText === null || totalText === null) {\n return (\n <div className=\"flex flex-col gap-2\" role=\"status\">\n <p className=\"text-muted-foreground text-sm\">{labels.totalsUnavailableLabel}</p>\n {onRetryTotals ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryTotals}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n return (\n <div className=\"flex flex-col gap-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">{labels.subtotalLabel}</span>\n <span className=\"font-medium tabular-nums\">{subtotalText}</span>\n </div>\n {isAvailableMoney(totals.discount) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">{labels.discountLabel}</span>\n <span className=\"font-medium tabular-nums\">{format(totals.discount)}</span>\n </div>\n ) : null}\n {isAvailableMoney(totals.tax) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">{labels.taxLabel}</span>\n <span className=\"font-medium tabular-nums\">{format(totals.tax)}</span>\n </div>\n ) : null}\n {isAvailableMoney(totals.shipping) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-1.5 text-muted-foreground\">\n <Truck aria-hidden=\"true\" className=\"size-4\" />\n {labels.shippingLabel}\n </span>\n <span className=\"font-medium tabular-nums\">{format(totals.shipping)}</span>\n </div>\n ) : null}\n <Separator />\n <div className=\"flex items-center justify-between\">\n <span className=\"font-semibold\">{labels.totalLabel}</span>\n <span className=\"font-semibold tabular-nums\">{totalText}</span>\n </div>\n </div>\n )\n }\n\n return (\n <Card className=\"lg:sticky lg:top-8\">\n <CardContent className=\"flex flex-col gap-4 p-6\">\n <CardTitle>{labels.orderSummaryTitle}</CardTitle>\n\n <div className=\"flex flex-col gap-4\">\n {summary.items.map((item) => {\n const amount = lineAmount(item)\n return (\n <div key={String(item.id)} className=\"flex items-center gap-3\">\n <div className=\"relative\">\n {item.image ? (\n <img\n src={item.image}\n alt={item.name}\n width={64}\n height={64}\n className=\"bg-muted size-16 rounded-lg object-cover\"\n />\n ) : (\n <div aria-hidden=\"true\" className=\"bg-muted size-16 rounded-lg\" />\n )}\n <Badge\n variant=\"secondary\"\n className=\"absolute -right-2 -top-2 size-6 justify-center rounded-full p-0 text-xs\"\n >\n {item.quantity}\n </Badge>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium\">{item.name}</p>\n {item.variant ? (\n <p className=\"text-sm text-muted-foreground\">{item.variant}</p>\n ) : null}\n {item.quantity > 1 && isAvailableMoney(item.unitPrice) ? (\n <p className=\"text-muted-foreground text-xs\">\n {format(item.unitPrice)} {labels.eachLabel}\n </p>\n ) : null}\n </div>\n <p className=\"text-sm font-medium tabular-nums\">\n {amount ?? labels.amountUnavailableLabel}\n </p>\n </div>\n )\n })}\n </div>\n\n {onApplyPromo ? (\n <>\n <Separator />\n <Field className=\"gap-2\">\n <FieldLabel htmlFor=\"checkout-promo-code\">{labels.promoCodeLabel}</FieldLabel>\n <div className=\"flex gap-2\">\n <Input\n id=\"checkout-promo-code\"\n placeholder={labels.promoPlaceholder}\n value={promoCode}\n onChange={(e) => onPromoCodeChange(e.target.value)}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={promoPending}\n onClick={() => onApplyPromo(promoCode)}\n >\n {labels.promoApplyLabel}\n </Button>\n </div>\n </Field>\n </>\n ) : null}\n\n <Separator />\n\n {renderTotals()}\n\n {trustNotes && trustNotes.length > 0 ? (\n <div className=\"text-muted-foreground flex flex-col gap-2 text-sm\">\n {trustNotes.map((note, index) => (\n <span key={`${index}:${note}`} className=\"flex items-center gap-2\">\n <Shield aria-hidden=\"true\" className=\"size-4\" />\n {note}\n </span>\n ))}\n </div>\n ) : null}\n </CardContent>\n </Card>\n )\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-order-summary.tsx"],"sourcesContent":["'use client'\n\nimport { Shield, Truck } from 'lucide-react'\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardTitle } from '../../../ui/card'\nimport { Field, FieldLabel } from '../../../ui/field'\nimport { useCheckoutIds } from './checkout-id-context'\nimport { Input } from '../../../ui/input'\nimport { Separator } from '../../../ui/separator'\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport type { Money } from '@thorprovider/types'\nimport type {\n CheckoutAdjustmentPayment,\n CheckoutLabels,\n CheckoutOrderSummary,\n CheckoutOrderLine,\n CheckoutTotalsState,\n} from './checkout'\n\nexport interface CheckoutOrderSummaryPanelProps {\n summary: CheckoutOrderSummary\n labels: CheckoutLabels\n formatMoney?: (money: Money) => string\n totalsState?: CheckoutTotalsState\n onRetryTotals?: () => void\n promoCode: string\n onPromoCodeChange: (value: string) => void\n onApplyPromo?: (code: string) => void\n promoPending?: boolean\n adjustmentPayments?: CheckoutAdjustmentPayment[]\n trustNotes?: string[]\n}\n\n/**\n * Internal projection of the checkout's own cart. It is not a public block: the\n * amount contract is `Money` only and every total is rendered verbatim.\n */\nexport function CheckoutOrderSummaryPanel({\n summary,\n labels,\n formatMoney: formatMoneyProp,\n totalsState = 'idle',\n onRetryTotals,\n promoCode,\n onPromoCodeChange,\n onApplyPromo,\n promoPending = false,\n adjustmentPayments,\n trustNotes,\n}: CheckoutOrderSummaryPanelProps) {\n const checkoutId = useCheckoutIds()\n const format = (value: Money | null | undefined) => formatMoney(value, formatMoneyProp)\n const lineAmount = (item: CheckoutOrderLine): string | null =>\n isAvailableMoney(item.lineTotal) ? format(item.lineTotal) : null\n\n const renderTotals = () => {\n if (totalsState === 'pending') {\n return (\n <p className=\"text-muted-foreground text-sm\" aria-live=\"polite\">\n {labels.totalsPendingLabel}\n </p>\n )\n }\n if (totalsState === 'error') {\n return (\n <div className=\"flex flex-col gap-2\" role=\"alert\">\n <p className=\"text-destructive text-sm\">{labels.totalsErrorLabel}</p>\n {onRetryTotals ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryTotals}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n const totals = summary.totals\n if (!totals) {\n return (\n <div className=\"flex flex-col gap-2\" role=\"status\">\n <p className=\"text-muted-foreground text-sm\">{labels.totalsUnavailableLabel}</p>\n {onRetryTotals ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryTotals}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n const subtotalText = format(totals.subtotal)\n const totalText = format(totals.total)\n // Required totals: an absent/malformed amount is unavailable, never a\n // fabricated zero.\n if (subtotalText === null || totalText === null) {\n return (\n <div className=\"flex flex-col gap-2\" role=\"status\">\n <p className=\"text-muted-foreground text-sm\">{labels.totalsUnavailableLabel}</p>\n {onRetryTotals ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryTotals}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n return (\n <div className=\"flex flex-col gap-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">{labels.subtotalLabel}</span>\n <span className=\"font-medium tabular-nums\">{subtotalText}</span>\n </div>\n {isAvailableMoney(totals.discount) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">{labels.discountLabel}</span>\n <span className=\"font-medium tabular-nums\">{format(totals.discount)}</span>\n </div>\n ) : null}\n {isAvailableMoney(totals.tax) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">{labels.taxLabel}</span>\n <span className=\"font-medium tabular-nums\">{format(totals.tax)}</span>\n </div>\n ) : null}\n {isAvailableMoney(totals.shipping) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-1.5 text-muted-foreground\">\n <Truck aria-hidden=\"true\" className=\"size-4\" />\n {labels.shippingLabel}\n </span>\n <span className=\"font-medium tabular-nums\">{format(totals.shipping)}</span>\n </div>\n ) : null}\n <Separator />\n <div className=\"flex items-center justify-between\">\n <span className=\"font-semibold\">{labels.totalLabel}</span>\n <span className=\"font-semibold tabular-nums\">{totalText}</span>\n </div>\n </div>\n )\n }\n\n return (\n <Card className=\"lg:sticky lg:top-8\">\n <CardContent className=\"flex flex-col gap-4 p-6\">\n <CardTitle>{labels.orderSummaryTitle}</CardTitle>\n\n <div className=\"flex flex-col gap-4\">\n {summary.items.map((item) => {\n const amount = lineAmount(item)\n return (\n <div key={String(item.id)} className=\"flex items-center gap-3\">\n <div className=\"relative\">\n {item.image ? (\n <img\n src={item.image}\n alt={item.name}\n width={64}\n height={64}\n className=\"bg-muted size-16 rounded-lg object-cover\"\n />\n ) : (\n <div aria-hidden=\"true\" className=\"bg-muted size-16 rounded-lg\" />\n )}\n <Badge\n variant=\"secondary\"\n className=\"absolute -right-2 -top-2 size-6 justify-center rounded-full p-0 text-xs\"\n >\n {item.quantity}\n </Badge>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium\">{item.name}</p>\n {item.variant ? (\n <p className=\"text-sm text-muted-foreground\">{item.variant}</p>\n ) : null}\n {item.quantity > 1 && isAvailableMoney(item.unitPrice) ? (\n <p className=\"text-muted-foreground text-xs\">\n {format(item.unitPrice)} {labels.eachLabel}\n </p>\n ) : null}\n </div>\n <p className=\"text-sm font-medium tabular-nums\">\n {amount ?? labels.amountUnavailableLabel}\n </p>\n </div>\n )\n })}\n </div>\n\n {onApplyPromo ? (\n <>\n <Separator />\n <Field className=\"gap-2\">\n <FieldLabel htmlFor={checkoutId('checkout-promo-code')}>{labels.promoCodeLabel}</FieldLabel>\n <div className=\"flex gap-2\">\n <Input\n id={checkoutId('checkout-promo-code')}\n placeholder={labels.promoPlaceholder}\n value={promoCode}\n onChange={(e) => onPromoCodeChange(e.target.value)}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={promoPending}\n onClick={() => onApplyPromo(promoCode)}\n >\n {labels.promoApplyLabel}\n </Button>\n </div>\n </Field>\n </>\n ) : null}\n\n {adjustmentPayments && adjustmentPayments.length > 0 ? (\n <div className=\"flex flex-col gap-2 text-sm\">\n {adjustmentPayments.map((adjustment) => (\n <div key={adjustment.id} className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">{adjustment.label}</span>\n <span className=\"font-medium tabular-nums\">\n {format(adjustment.amount)}\n </span>\n </div>\n ))}\n </div>\n ) : null}\n\n <Separator />\n\n {renderTotals()}\n\n {trustNotes && trustNotes.length > 0 ? (\n <div className=\"text-muted-foreground flex flex-col gap-2 text-sm\">\n {trustNotes.map((note, index) => (\n <span key={`${index}:${note}`} className=\"flex items-center gap-2\">\n <Shield aria-hidden=\"true\" className=\"size-4\" />\n {note}\n </span>\n ))}\n </div>\n ) : null}\n </CardContent>\n </Card>\n )\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,12 +1,27 @@
|
|
|
1
|
-
import type { PaymentMethod } from '@thorprovider/types';
|
|
2
|
-
import type {
|
|
1
|
+
import type { CheckoutAdjustmentPayment, Money, PaymentMethod } from '@thorprovider/types';
|
|
2
|
+
import type { CheckoutFieldError } from './checkout-form-types';
|
|
3
|
+
import type { CheckoutLabels } from './checkout';
|
|
3
4
|
export interface CheckoutPaymentStepProps {
|
|
4
|
-
values: CheckoutValues;
|
|
5
|
-
onChange: CheckoutChangeHandler;
|
|
6
|
-
labels: CheckoutLabels;
|
|
7
5
|
paymentMethods?: PaymentMethod[];
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
paymentState?: 'idle' | 'pending' | 'error' | 'unavailable';
|
|
7
|
+
paymentMethod: string;
|
|
8
|
+
onSelectPaymentMethod: (id: string) => void;
|
|
9
|
+
onRetryPayment?: () => void;
|
|
10
|
+
adjustmentPayments?: CheckoutAdjustmentPayment[];
|
|
11
|
+
onApplyGiftCard?: (code: string) => void;
|
|
12
|
+
giftCardState?: 'idle' | 'pending' | 'valid' | 'invalid';
|
|
13
|
+
giftCardMessage?: string;
|
|
14
|
+
onRemoveAdjustment?: (id: string) => void;
|
|
15
|
+
storeCredit?: {
|
|
16
|
+
available: Money;
|
|
17
|
+
applied?: Money;
|
|
18
|
+
onApply?: () => void;
|
|
19
|
+
onRemove?: () => void;
|
|
20
|
+
};
|
|
21
|
+
labels: CheckoutLabels;
|
|
22
|
+
formatMoney?: (money: Money) => string;
|
|
23
|
+
fieldErrors?: CheckoutFieldError[];
|
|
24
|
+
description?: string;
|
|
10
25
|
}
|
|
11
|
-
export declare function CheckoutPaymentStep({
|
|
26
|
+
export declare function CheckoutPaymentStep({ paymentMethods, paymentState, paymentMethod, onSelectPaymentMethod, onRetryPayment, adjustmentPayments, onApplyGiftCard, giftCardState, giftCardMessage, onRemoveAdjustment, storeCredit, labels, formatMoney: formatMoneyProp, fieldErrors, description, }: CheckoutPaymentStepProps): import("react").JSX.Element;
|
|
12
27
|
//# sourceMappingURL=checkout-payment-step.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout-payment-step.d.ts","sourceRoot":"","sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-payment-step.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"checkout-payment-step.d.ts","sourceRoot":"","sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-payment-step.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,yBAAyB,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAG1F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,MAAM,WAAW,wBAAwB;IACvC,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;IAChC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,CAAA;IAC3D,aAAa,EAAE,MAAM,CAAA;IACrB,qBAAqB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,kBAAkB,CAAC,EAAE,yBAAyB,EAAE,CAAA;IAChD,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;IACxD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,WAAW,CAAC,EAAE;QACZ,SAAS,EAAE,KAAK,CAAA;QAChB,OAAO,CAAC,EAAE,KAAK,CAAA;QACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;QACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;KACtB,CAAA;IACD,MAAM,EAAE,cAAc,CAAA;IACtB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAA;IACtC,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAClC,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,cAAmB,EACnB,YAAqB,EACrB,aAAa,EACb,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,aAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,MAAM,EACN,WAAW,EAAE,eAAe,EAC5B,WAAW,EACX,WAAW,GACZ,EAAE,wBAAwB,+BAuL1B"}
|
|
@@ -23,45 +23,75 @@ __export(checkout_payment_step_exports, {
|
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(checkout_payment_step_exports);
|
|
25
25
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
26
|
+
var import_react = require("react");
|
|
27
|
+
var import_button = require("../../../ui/button.js");
|
|
26
28
|
var import_field = require("../../../ui/field.js");
|
|
29
|
+
var import_input = require("../../../ui/input.js");
|
|
27
30
|
var import_radio_group = require("../../../ui/radio-group.js");
|
|
31
|
+
var import_money = require("../../../lib/money.js");
|
|
28
32
|
var import_checkout_field_feedback = require("./checkout-field-feedback.js");
|
|
33
|
+
var import_checkout_id_context = require("./checkout-id-context.js");
|
|
29
34
|
function CheckoutPaymentStep({
|
|
30
|
-
values,
|
|
31
|
-
onChange,
|
|
32
|
-
labels,
|
|
33
35
|
paymentMethods = [],
|
|
36
|
+
paymentState = "idle",
|
|
37
|
+
paymentMethod,
|
|
38
|
+
onSelectPaymentMethod,
|
|
39
|
+
onRetryPayment,
|
|
40
|
+
adjustmentPayments,
|
|
41
|
+
onApplyGiftCard,
|
|
42
|
+
giftCardState = "idle",
|
|
43
|
+
giftCardMessage,
|
|
44
|
+
onRemoveAdjustment,
|
|
45
|
+
storeCredit,
|
|
46
|
+
labels,
|
|
47
|
+
formatMoney: formatMoneyProp,
|
|
34
48
|
fieldErrors,
|
|
35
|
-
|
|
49
|
+
description
|
|
36
50
|
}) {
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
51
|
+
const checkoutId = (0, import_checkout_id_context.useCheckoutIds)();
|
|
52
|
+
const [giftCardCode, setGiftCardCode] = (0, import_react.useState)("");
|
|
53
|
+
const selectedMethod = paymentMethods.find((method) => method.id === paymentMethod);
|
|
54
|
+
const pending = paymentState === "pending";
|
|
55
|
+
const failed = paymentState === "error";
|
|
56
|
+
const unavailable = paymentState === "unavailable";
|
|
57
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.FieldSet, { className: "gap-3", children: [
|
|
58
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldLegend, { className: "mb-0", children: labels.paymentMethodLegend }),
|
|
59
|
+
pending ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground text-sm", role: "status", children: labels.paymentLoadingLabel }) : failed ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-2", role: "alert", children: [
|
|
60
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-destructive text-sm", children: labels.paymentErrorLabel }),
|
|
61
|
+
onRetryPayment ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { type: "button", variant: "outline", size: "sm", className: "w-fit", onClick: onRetryPayment, children: labels.retryLabel }) : null
|
|
62
|
+
] }) : unavailable ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground text-sm", role: "status", children: labels.paymentUnavailableLabel }) : paymentMethods.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground text-sm", children: labels.noPaymentMethodsLabel }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
41
63
|
import_radio_group.RadioGroup,
|
|
42
64
|
{
|
|
43
|
-
value:
|
|
44
|
-
onValueChange: (value) => value &&
|
|
65
|
+
value: paymentMethod,
|
|
66
|
+
onValueChange: (value) => value && onSelectPaymentMethod(String(value)),
|
|
45
67
|
className: "grid grid-cols-1 gap-3",
|
|
46
68
|
children: paymentMethods.map((method) => {
|
|
47
|
-
const
|
|
69
|
+
const disabled = method.isEnabled === false;
|
|
48
70
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
49
71
|
import_field.Field,
|
|
50
72
|
{
|
|
51
73
|
orientation: "horizontal",
|
|
52
74
|
className: "flex-wrap items-start justify-between gap-3 rounded-lg border p-4",
|
|
53
75
|
children: [
|
|
54
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldContent, { className: "min-w-0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
76
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldContent, { className: "min-w-0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
77
|
+
import_field.FieldLabel,
|
|
78
|
+
{
|
|
79
|
+
htmlFor: checkoutId(`payment-${method.id}`),
|
|
80
|
+
className: "flex flex-col items-start gap-0.5 text-left",
|
|
81
|
+
children: [
|
|
82
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: method.name }),
|
|
83
|
+
method.description ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground text-xs font-normal", children: method.description }) : null,
|
|
84
|
+
disabled ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground text-xs font-normal", children: labels.unavailableMethodLabel }) : null
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
) }),
|
|
59
88
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
60
89
|
import_radio_group.RadioGroupItem,
|
|
61
90
|
{
|
|
62
91
|
value: method.id,
|
|
63
|
-
id: `payment-${method.id}
|
|
64
|
-
|
|
92
|
+
id: checkoutId(`payment-${method.id}`),
|
|
93
|
+
"data-checkout-payment-method": method.id,
|
|
94
|
+
disabled
|
|
65
95
|
}
|
|
66
96
|
)
|
|
67
97
|
]
|
|
@@ -71,19 +101,94 @@ function CheckoutPaymentStep({
|
|
|
71
101
|
})
|
|
72
102
|
}
|
|
73
103
|
),
|
|
74
|
-
|
|
75
|
-
/* @__PURE__ */ (0, import_jsx_runtime.
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
104
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-6", children: [
|
|
105
|
+
selectedMethod ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "bg-muted/50 rounded-lg p-4 text-sm", children: [
|
|
106
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "font-medium", children: selectedMethod.name }),
|
|
107
|
+
selectedMethod.description ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground mt-1", children: selectedMethod.description }) : null,
|
|
108
|
+
selectedMethod.requiresSetup ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground mt-1 text-xs", children: labels.requiresSetupLabel }) : null
|
|
109
|
+
] }) : null,
|
|
110
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.Field, { "data-invalid": !!fieldErrors?.length, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
111
|
+
import_checkout_field_feedback.CheckoutFieldFeedback,
|
|
112
|
+
{
|
|
113
|
+
id: checkoutId("checkout-payment-method"),
|
|
114
|
+
errors: fieldErrors,
|
|
115
|
+
description
|
|
116
|
+
}
|
|
117
|
+
) }),
|
|
118
|
+
onApplyGiftCard ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-2 rounded-lg border p-4", children: [
|
|
119
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-medium", children: labels.giftCardLabel }),
|
|
120
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-wrap gap-2", children: [
|
|
121
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
122
|
+
import_input.Input,
|
|
123
|
+
{
|
|
124
|
+
id: checkoutId("checkout-gift-card"),
|
|
125
|
+
value: giftCardCode,
|
|
126
|
+
placeholder: labels.giftCardPlaceholder,
|
|
127
|
+
onChange: (e) => setGiftCardCode(e.target.value),
|
|
128
|
+
className: "min-w-0 flex-1"
|
|
129
|
+
}
|
|
130
|
+
),
|
|
131
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
132
|
+
import_button.Button,
|
|
133
|
+
{
|
|
134
|
+
type: "button",
|
|
135
|
+
variant: "outline",
|
|
136
|
+
disabled: giftCardState === "pending" || giftCardCode.trim() === "",
|
|
137
|
+
onClick: () => onApplyGiftCard(giftCardCode.trim()),
|
|
138
|
+
children: labels.applyLabel
|
|
139
|
+
}
|
|
140
|
+
)
|
|
141
|
+
] }),
|
|
142
|
+
giftCardMessage ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
143
|
+
"p",
|
|
144
|
+
{
|
|
145
|
+
className: giftCardState === "invalid" ? "text-destructive text-sm" : "text-muted-foreground text-sm",
|
|
146
|
+
role: giftCardState === "invalid" ? "alert" : "status",
|
|
147
|
+
children: giftCardMessage
|
|
148
|
+
}
|
|
149
|
+
) : null
|
|
150
|
+
] }) : null,
|
|
151
|
+
adjustmentPayments && adjustmentPayments.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex flex-col gap-2", children: adjustmentPayments.map((adjustment) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
152
|
+
"div",
|
|
153
|
+
{
|
|
154
|
+
className: "flex flex-wrap items-center justify-between gap-2 rounded-lg border px-4 py-3 text-sm",
|
|
155
|
+
children: [
|
|
156
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: adjustment.label }),
|
|
157
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "flex items-center gap-3", children: [
|
|
158
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "tabular-nums", children: (0, import_money.formatMoney)(adjustment.amount, formatMoneyProp) }),
|
|
159
|
+
onRemoveAdjustment ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
160
|
+
import_button.Button,
|
|
161
|
+
{
|
|
162
|
+
type: "button",
|
|
163
|
+
variant: "ghost",
|
|
164
|
+
size: "sm",
|
|
165
|
+
onClick: () => onRemoveAdjustment(adjustment.id),
|
|
166
|
+
children: labels.removeLabel
|
|
167
|
+
}
|
|
168
|
+
) : null
|
|
169
|
+
] })
|
|
170
|
+
]
|
|
171
|
+
},
|
|
172
|
+
adjustment.id
|
|
173
|
+
)) }) : null,
|
|
174
|
+
storeCredit ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-2 rounded-lg border p-4 text-sm", children: [
|
|
175
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "font-medium", children: labels.storeCreditLabel }),
|
|
176
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-muted-foreground", children: [
|
|
177
|
+
labels.availableCreditLabel,
|
|
178
|
+
": ",
|
|
179
|
+
(0, import_money.formatMoney)(storeCredit.available, formatMoneyProp)
|
|
180
|
+
] }),
|
|
181
|
+
(0, import_money.isAvailableMoney)(storeCredit.applied) ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { children: [
|
|
182
|
+
labels.applyLabel,
|
|
183
|
+
": ",
|
|
184
|
+
(0, import_money.formatMoney)(storeCredit.applied, formatMoneyProp)
|
|
185
|
+
] }) : null,
|
|
186
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-wrap gap-2", children: [
|
|
187
|
+
storeCredit.onApply ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { type: "button", variant: "outline", size: "sm", onClick: storeCredit.onApply, children: labels.applyLabel }) : null,
|
|
188
|
+
storeCredit.onRemove ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { type: "button", variant: "ghost", size: "sm", onClick: storeCredit.onRemove, children: labels.removeLabel }) : null
|
|
189
|
+
] })
|
|
190
|
+
] }) : null
|
|
191
|
+
] })
|
|
87
192
|
] });
|
|
88
193
|
}
|
|
89
194
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-payment-step.tsx"],"sourcesContent":["'use client'\n\nimport { Field, FieldContent, FieldLabel, FieldLegend, FieldSet } from '../../../ui/field'\nimport { RadioGroup, RadioGroupItem } from '../../../ui/radio-group'\nimport { CheckoutFieldFeedback, checkoutFieldAria } from './checkout-field-feedback'\nimport type { PaymentMethod } from '@thorprovider/types'\nimport type {\n CheckoutChangeHandler,\n CheckoutFieldDescriptions,\n CheckoutValuesFieldErrors,\n CheckoutLabels,\n CheckoutValues,\n} from './checkout'\n\nexport interface CheckoutPaymentStepProps {\n values: CheckoutValues\n onChange: CheckoutChangeHandler\n labels: CheckoutLabels\n paymentMethods?: PaymentMethod[]\n fieldErrors?: CheckoutValuesFieldErrors\n fieldDescriptions?: CheckoutFieldDescriptions\n}\n\nexport function CheckoutPaymentStep({\n values,\n onChange,\n labels,\n paymentMethods = [],\n fieldErrors,\n fieldDescriptions,\n}: CheckoutPaymentStepProps) {\n const selectedMethod = paymentMethods.find((method) => method.id === values.paymentMethod)\n\n return (\n <FieldSet>\n <FieldLegend>{labels.paymentMethodLegend}</FieldLegend>\n {paymentMethods.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">{labels.noPaymentMethodsLabel}</p>\n ) : (\n <RadioGroup\n value={values.paymentMethod}\n onValueChange={(value) => value && onChange('paymentMethod', String(value))}\n className=\"grid grid-cols-1 gap-3\"\n >\n {paymentMethods.map((method) => {\n const unavailable = method.isEnabled === false\n return (\n <Field\n key={method.id}\n orientation=\"horizontal\"\n className=\"flex-wrap items-start justify-between gap-3 rounded-lg border p-4\"\n >\n <FieldContent className=\"min-w-0\">\n <FieldLabel htmlFor={`payment-${method.id}`} className=\"flex flex-col gap-0.5\">\n <span>{method.name}</span>\n {method.description ? (\n <span className=\"text-muted-foreground text-xs font-normal\">\n {method.description}\n </span>\n ) : null}\n {unavailable ? (\n <span className=\"text-muted-foreground text-xs font-normal\">\n {labels.unavailableMethodLabel}\n </span>\n ) : null}\n </FieldLabel>\n </FieldContent>\n <RadioGroupItem\n value={method.id}\n id={`payment-${method.id}`}\n disabled={unavailable}\n />\n </Field>\n )\n })}\n </RadioGroup>\n )}\n\n {selectedMethod ? (\n <div className=\"bg-muted/50 rounded-lg p-4 text-sm\">\n <p className=\"font-medium\">{selectedMethod.name}</p>\n {selectedMethod.description ? (\n <p className=\"text-muted-foreground mt-1\">{selectedMethod.description}</p>\n ) : null}\n {selectedMethod.requiresSetup ? (\n <p className=\"text-muted-foreground mt-1 text-xs\">{labels.requiresSetupLabel}</p>\n ) : null}\n </div>\n ) : null}\n\n <Field data-invalid={!!fieldErrors?.paymentMethod?.length}>\n <CheckoutFieldFeedback\n id=\"checkout-payment-method\"\n errors={fieldErrors?.paymentMethod}\n description={fieldDescriptions?.paymentMethod}\n />\n </Field>\n </FieldSet>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmCM;AAjCN,mBAAuE;AACvE,yBAA2C;AAC3C,qCAAyD;AAmBlD,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB,CAAC;AAAA,EAClB;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,iBAAiB,eAAe,KAAK,CAAC,WAAW,OAAO,OAAO,OAAO,aAAa;AAEzF,SACE,6CAAC,yBACC;AAAA,gDAAC,4BAAa,iBAAO,qBAAoB;AAAA,IACxC,eAAe,WAAW,IACzB,4CAAC,OAAE,WAAU,iCAAiC,iBAAO,uBAAsB,IAE3E;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,OAAO;AAAA,QACd,eAAe,CAAC,UAAU,SAAS,SAAS,iBAAiB,OAAO,KAAK,CAAC;AAAA,QAC1E,WAAU;AAAA,QAET,yBAAe,IAAI,CAAC,WAAW;AAC9B,gBAAM,cAAc,OAAO,cAAc;AACzC,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,aAAY;AAAA,cACZ,WAAU;AAAA,cAEV;AAAA,4DAAC,6BAAa,WAAU,WACtB,uDAAC,2BAAW,SAAS,WAAW,OAAO,EAAE,IAAI,WAAU,yBACrD;AAAA,8DAAC,UAAM,iBAAO,MAAK;AAAA,kBAClB,OAAO,cACN,4CAAC,UAAK,WAAU,6CACb,iBAAO,aACV,IACE;AAAA,kBACH,cACC,4CAAC,UAAK,WAAU,6CACb,iBAAO,wBACV,IACE;AAAA,mBACN,GACF;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,OAAO;AAAA,oBACd,IAAI,WAAW,OAAO,EAAE;AAAA,oBACxB,UAAU;AAAA;AAAA,gBACZ;AAAA;AAAA;AAAA,YAvBK,OAAO;AAAA,UAwBd;AAAA,QAEJ,CAAC;AAAA;AAAA,IACH;AAAA,IAGD,iBACC,6CAAC,SAAI,WAAU,sCACb;AAAA,kDAAC,OAAE,WAAU,eAAe,yBAAe,MAAK;AAAA,MAC/C,eAAe,cACd,4CAAC,OAAE,WAAU,8BAA8B,yBAAe,aAAY,IACpE;AAAA,MACH,eAAe,gBACd,4CAAC,OAAE,WAAU,sCAAsC,iBAAO,oBAAmB,IAC3E;AAAA,OACN,IACE;AAAA,IAEJ,4CAAC,sBAAM,gBAAc,CAAC,CAAC,aAAa,eAAe,QACjD;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,QAAQ,aAAa;AAAA,QACrB,aAAa,mBAAmB;AAAA;AAAA,IAClC,GACF;AAAA,KACF;AAEJ;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-payment-step.tsx"],"sourcesContent":["'use client'\n\nimport { useState } from 'react'\nimport { Button } from '../../../ui/button'\nimport {\n Field,\n FieldContent,\n FieldLabel,\n FieldLegend,\n FieldSet,\n} from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport { RadioGroup, RadioGroupItem } from '../../../ui/radio-group'\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport type { CheckoutAdjustmentPayment, Money, PaymentMethod } from '@thorprovider/types'\nimport { CheckoutFieldFeedback } from './checkout-field-feedback'\nimport { useCheckoutIds } from './checkout-id-context'\nimport type { CheckoutFieldError } from './checkout-form-types'\nimport type { CheckoutLabels } from './checkout'\n\nexport interface CheckoutPaymentStepProps {\n paymentMethods?: PaymentMethod[]\n paymentState?: 'idle' | 'pending' | 'error' | 'unavailable'\n paymentMethod: string\n onSelectPaymentMethod: (id: string) => void\n onRetryPayment?: () => void\n adjustmentPayments?: CheckoutAdjustmentPayment[]\n onApplyGiftCard?: (code: string) => void\n giftCardState?: 'idle' | 'pending' | 'valid' | 'invalid'\n giftCardMessage?: string\n onRemoveAdjustment?: (id: string) => void\n storeCredit?: {\n available: Money\n applied?: Money\n onApply?: () => void\n onRemove?: () => void\n }\n labels: CheckoutLabels\n formatMoney?: (money: Money) => string\n fieldErrors?: CheckoutFieldError[]\n description?: string\n}\n\nexport function CheckoutPaymentStep({\n paymentMethods = [],\n paymentState = 'idle',\n paymentMethod,\n onSelectPaymentMethod,\n onRetryPayment,\n adjustmentPayments,\n onApplyGiftCard,\n giftCardState = 'idle',\n giftCardMessage,\n onRemoveAdjustment,\n storeCredit,\n labels,\n formatMoney: formatMoneyProp,\n fieldErrors,\n description,\n}: CheckoutPaymentStepProps) {\n const checkoutId = useCheckoutIds()\n const [giftCardCode, setGiftCardCode] = useState('')\n const selectedMethod = paymentMethods.find((method) => method.id === paymentMethod)\n const pending = paymentState === 'pending'\n const failed = paymentState === 'error'\n const unavailable = paymentState === 'unavailable'\n\n return (\n <FieldSet className=\"gap-3\">\n <FieldLegend className=\"mb-0\">{labels.paymentMethodLegend}</FieldLegend>\n\n {pending ? (\n <p className=\"text-muted-foreground text-sm\" role=\"status\">\n {labels.paymentLoadingLabel}\n </p>\n ) : failed ? (\n <div className=\"flex flex-col gap-2\" role=\"alert\">\n <p className=\"text-destructive text-sm\">{labels.paymentErrorLabel}</p>\n {onRetryPayment ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryPayment}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n ) : unavailable ? (\n <p className=\"text-muted-foreground text-sm\" role=\"status\">\n {labels.paymentUnavailableLabel}\n </p>\n ) : paymentMethods.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">{labels.noPaymentMethodsLabel}</p>\n ) : (\n <RadioGroup\n value={paymentMethod}\n onValueChange={(value) => value && onSelectPaymentMethod(String(value))}\n className=\"grid grid-cols-1 gap-3\"\n >\n {paymentMethods.map((method) => {\n const disabled = method.isEnabled === false\n return (\n <Field\n key={method.id}\n orientation=\"horizontal\"\n className=\"flex-wrap items-start justify-between gap-3 rounded-lg border p-4\"\n >\n <FieldContent className=\"min-w-0\">\n <FieldLabel\n htmlFor={checkoutId(`payment-${method.id}`)}\n className=\"flex flex-col items-start gap-0.5 text-left\"\n >\n <span>{method.name}</span>\n {method.description ? (\n <span className=\"text-muted-foreground text-xs font-normal\">\n {method.description}\n </span>\n ) : null}\n {disabled ? (\n <span className=\"text-muted-foreground text-xs font-normal\">\n {labels.unavailableMethodLabel}\n </span>\n ) : null}\n </FieldLabel>\n </FieldContent>\n <RadioGroupItem\n value={method.id}\n id={checkoutId(`payment-${method.id}`)}\n data-checkout-payment-method={method.id}\n disabled={disabled}\n />\n </Field>\n )\n })}\n </RadioGroup>\n )}\n\n <div className=\"flex flex-col gap-6\">\n {selectedMethod ? (\n <div className=\"bg-muted/50 rounded-lg p-4 text-sm\">\n <p className=\"font-medium\">{selectedMethod.name}</p>\n {selectedMethod.description ? (\n <p className=\"text-muted-foreground mt-1\">{selectedMethod.description}</p>\n ) : null}\n {selectedMethod.requiresSetup ? (\n <p className=\"text-muted-foreground mt-1 text-xs\">{labels.requiresSetupLabel}</p>\n ) : null}\n </div>\n ) : null}\n\n <Field data-invalid={!!fieldErrors?.length}>\n <CheckoutFieldFeedback\n id={checkoutId('checkout-payment-method')}\n errors={fieldErrors}\n description={description}\n />\n </Field>\n\n {onApplyGiftCard ? (\n <div className=\"flex flex-col gap-2 rounded-lg border p-4\">\n <p className=\"text-sm font-medium\">{labels.giftCardLabel}</p>\n <div className=\"flex flex-wrap gap-2\">\n <Input\n id={checkoutId('checkout-gift-card')}\n value={giftCardCode}\n placeholder={labels.giftCardPlaceholder}\n onChange={(e) => setGiftCardCode(e.target.value)}\n className=\"min-w-0 flex-1\"\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={giftCardState === 'pending' || giftCardCode.trim() === ''}\n onClick={() => onApplyGiftCard(giftCardCode.trim())}\n >\n {labels.applyLabel}\n </Button>\n </div>\n {giftCardMessage ? (\n <p\n className={giftCardState === 'invalid' ? 'text-destructive text-sm' : 'text-muted-foreground text-sm'}\n role={giftCardState === 'invalid' ? 'alert' : 'status'}\n >\n {giftCardMessage}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {adjustmentPayments && adjustmentPayments.length > 0 ? (\n <div className=\"flex flex-col gap-2\">\n {adjustmentPayments.map((adjustment) => (\n <div\n key={adjustment.id}\n className=\"flex flex-wrap items-center justify-between gap-2 rounded-lg border px-4 py-3 text-sm\"\n >\n <span>{adjustment.label}</span>\n <span className=\"flex items-center gap-3\">\n <span className=\"tabular-nums\">\n {formatMoney(adjustment.amount, formatMoneyProp)}\n </span>\n {onRemoveAdjustment ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onRemoveAdjustment(adjustment.id)}\n >\n {labels.removeLabel}\n </Button>\n ) : null}\n </span>\n </div>\n ))}\n </div>\n ) : null}\n\n {storeCredit ? (\n <div className=\"flex flex-col gap-2 rounded-lg border p-4 text-sm\">\n <p className=\"font-medium\">{labels.storeCreditLabel}</p>\n <p className=\"text-muted-foreground\">\n {labels.availableCreditLabel}: {formatMoney(storeCredit.available, formatMoneyProp)}\n </p>\n {isAvailableMoney(storeCredit.applied) ? (\n <p>\n {labels.applyLabel}: {formatMoney(storeCredit.applied, formatMoneyProp)}\n </p>\n ) : null}\n <div className=\"flex flex-wrap gap-2\">\n {storeCredit.onApply ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={storeCredit.onApply}>\n {labels.applyLabel}\n </Button>\n ) : null}\n {storeCredit.onRemove ? (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={storeCredit.onRemove}>\n {labels.removeLabel}\n </Button>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n </FieldSet>\n )\n}\n"],"mappings":"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","names":[]}
|