@thorprovider/blocks 3.0.2 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/README.md +61 -21
  2. package/dist/blocks/designs/checkout-commerce-v1/block.d.ts +49 -0
  3. package/dist/blocks/designs/checkout-commerce-v1/block.d.ts.map +1 -0
  4. package/dist/blocks/designs/checkout-commerce-v1/block.js +2487 -0
  5. package/dist/blocks/designs/checkout-commerce-v1/block.js.map +1 -0
  6. package/dist/blocks/designs/checkout-commerce-v1/block.mjs +2467 -0
  7. package/dist/blocks/designs/checkout-commerce-v1/block.mjs.map +1 -0
  8. package/dist/blocks/designs/checkout-commerce-v1/data-context.d.ts +8 -0
  9. package/dist/blocks/designs/checkout-commerce-v1/data-context.d.ts.map +1 -0
  10. package/dist/blocks/designs/checkout-commerce-v1/data-context.js +44 -0
  11. package/dist/blocks/designs/checkout-commerce-v1/data-context.js.map +1 -0
  12. package/dist/blocks/designs/checkout-commerce-v1/data-context.mjs +19 -0
  13. package/dist/blocks/designs/checkout-commerce-v1/data-context.mjs.map +1 -0
  14. package/dist/blocks/designs/checkout-commerce-v1/index.d.ts +3 -0
  15. package/dist/blocks/designs/checkout-commerce-v1/index.d.ts.map +1 -0
  16. package/dist/blocks/designs/checkout-commerce-v1/index.js +36 -0
  17. package/dist/blocks/designs/checkout-commerce-v1/index.js.map +1 -0
  18. package/dist/blocks/designs/checkout-commerce-v1/index.mjs +6 -0
  19. package/dist/blocks/designs/checkout-commerce-v1/index.mjs.map +1 -0
  20. package/dist/blocks/designs/marketplace-product-card/block.d.ts +12 -0
  21. package/dist/blocks/designs/marketplace-product-card/block.d.ts.map +1 -0
  22. package/dist/blocks/designs/marketplace-product-card/block.js +243 -0
  23. package/dist/blocks/designs/marketplace-product-card/block.js.map +1 -0
  24. package/dist/blocks/designs/marketplace-product-card/block.mjs +233 -0
  25. package/dist/blocks/designs/marketplace-product-card/block.mjs.map +1 -0
  26. package/dist/blocks/designs/marketplace-product-card/index.d.ts +3 -0
  27. package/dist/blocks/designs/marketplace-product-card/index.d.ts.map +1 -0
  28. package/dist/blocks/designs/marketplace-product-card/index.js +36 -0
  29. package/dist/blocks/designs/marketplace-product-card/index.js.map +1 -0
  30. package/dist/blocks/designs/marketplace-product-card/index.mjs +6 -0
  31. package/dist/blocks/designs/marketplace-product-card/index.mjs.map +1 -0
  32. package/dist/blocks/designs/marketplace-product-card/normalize.d.ts +13 -0
  33. package/dist/blocks/designs/marketplace-product-card/normalize.d.ts.map +1 -0
  34. package/dist/blocks/designs/marketplace-product-card/normalize.js +36 -0
  35. package/dist/blocks/designs/marketplace-product-card/normalize.js.map +1 -0
  36. package/dist/blocks/designs/marketplace-product-card/normalize.mjs +12 -0
  37. package/dist/blocks/designs/marketplace-product-card/normalize.mjs.map +1 -0
  38. package/dist/blocks/designs/marketplace-product-card/variants.d.ts +72 -0
  39. package/dist/blocks/designs/marketplace-product-card/variants.d.ts.map +1 -0
  40. package/dist/blocks/designs/marketplace-product-card/variants.js +123 -0
  41. package/dist/blocks/designs/marketplace-product-card/variants.js.map +1 -0
  42. package/dist/blocks/designs/marketplace-product-card/variants.mjs +89 -0
  43. package/dist/blocks/designs/marketplace-product-card/variants.mjs.map +1 -0
  44. package/dist/blocks/e-commerce/account/account-frame.d.ts +38 -0
  45. package/dist/blocks/e-commerce/account/account-frame.d.ts.map +1 -0
  46. package/dist/blocks/e-commerce/account/account-frame.js +102 -0
  47. package/dist/blocks/e-commerce/account/account-frame.js.map +1 -0
  48. package/dist/blocks/e-commerce/account/account-frame.mjs +78 -0
  49. package/dist/blocks/e-commerce/account/account-frame.mjs.map +1 -0
  50. package/dist/blocks/e-commerce/account/address-book.d.ts +79 -0
  51. package/dist/blocks/e-commerce/account/address-book.d.ts.map +1 -0
  52. package/dist/blocks/e-commerce/account/address-book.js +250 -0
  53. package/dist/blocks/e-commerce/account/address-book.js.map +1 -0
  54. package/dist/blocks/e-commerce/account/address-book.mjs +225 -0
  55. package/dist/blocks/e-commerce/account/address-book.mjs.map +1 -0
  56. package/dist/blocks/e-commerce/account/profile-form.d.ts +35 -0
  57. package/dist/blocks/e-commerce/account/profile-form.d.ts.map +1 -0
  58. package/dist/blocks/e-commerce/account/profile-form.js +100 -0
  59. package/dist/blocks/e-commerce/account/profile-form.js.map +1 -0
  60. package/dist/blocks/e-commerce/account/profile-form.mjs +76 -0
  61. package/dist/blocks/e-commerce/account/profile-form.mjs.map +1 -0
  62. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.js +1 -1
  63. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.js.map +1 -1
  64. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.mjs +1 -1
  65. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.mjs.map +1 -1
  66. package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.d.ts +11 -0
  67. package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.d.ts.map +1 -0
  68. package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.js +46 -0
  69. package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.js.map +1 -0
  70. package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.mjs +22 -0
  71. package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.mjs.map +1 -0
  72. package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.d.ts +28 -0
  73. package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.d.ts.map +1 -0
  74. package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.js +278 -0
  75. package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.js.map +1 -0
  76. package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.mjs +260 -0
  77. package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.mjs.map +1 -0
  78. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.d.ts +12 -9
  79. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.d.ts.map +1 -1
  80. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.js +49 -71
  81. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.js.map +1 -1
  82. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.mjs +50 -72
  83. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.mjs.map +1 -1
  84. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.d.ts.map +1 -1
  85. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.js +6 -3
  86. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.js.map +1 -1
  87. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.mjs +6 -3
  88. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.mjs.map +1 -1
  89. package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.d.ts +7 -0
  90. package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.d.ts.map +1 -0
  91. package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.js +41 -0
  92. package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.js.map +1 -0
  93. package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.mjs +16 -0
  94. package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.mjs.map +1 -0
  95. package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.d.ts +24 -0
  96. package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.d.ts.map +1 -0
  97. package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.js +75 -0
  98. package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.js.map +1 -0
  99. package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.mjs +58 -0
  100. package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.mjs.map +1 -0
  101. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.d.ts +3 -2
  102. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.d.ts.map +1 -1
  103. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.js +9 -2
  104. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.js.map +1 -1
  105. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.mjs +9 -2
  106. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.mjs.map +1 -1
  107. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.d.ts +23 -8
  108. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.d.ts.map +1 -1
  109. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.js +136 -31
  110. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.js.map +1 -1
  111. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.mjs +143 -32
  112. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.mjs.map +1 -1
  113. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.d.ts +13 -7
  114. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.d.ts.map +1 -1
  115. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.js +179 -28
  116. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.js.map +1 -1
  117. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.mjs +180 -29
  118. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.mjs.map +1 -1
  119. package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.d.ts +20 -0
  120. package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.d.ts.map +1 -0
  121. package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.js +199 -0
  122. package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.js.map +1 -0
  123. package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.mjs +175 -0
  124. package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.mjs.map +1 -0
  125. package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.d.ts +14 -0
  126. package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.d.ts.map +1 -0
  127. package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.js +136 -0
  128. package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.js.map +1 -0
  129. package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.mjs +109 -0
  130. package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.mjs.map +1 -0
  131. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.d.ts +32 -10
  132. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.d.ts.map +1 -1
  133. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.js +265 -147
  134. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.js.map +1 -1
  135. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.mjs +272 -148
  136. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.mjs.map +1 -1
  137. package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.d.ts +13 -0
  138. package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.d.ts.map +1 -0
  139. package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.js +74 -0
  140. package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.js.map +1 -0
  141. package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.mjs +50 -0
  142. package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.mjs.map +1 -0
  143. package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.d.ts +7 -0
  144. package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.d.ts.map +1 -0
  145. package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.js +91 -0
  146. package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.js.map +1 -0
  147. package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.mjs +65 -0
  148. package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.mjs.map +1 -0
  149. package/dist/blocks/e-commerce/checkout-forms/checkout.d.ts +174 -44
  150. package/dist/blocks/e-commerce/checkout-forms/checkout.d.ts.map +1 -1
  151. package/dist/blocks/e-commerce/checkout-forms/checkout.js +532 -108
  152. package/dist/blocks/e-commerce/checkout-forms/checkout.js.map +1 -1
  153. package/dist/blocks/e-commerce/checkout-forms/checkout.mjs +542 -109
  154. package/dist/blocks/e-commerce/checkout-forms/checkout.mjs.map +1 -1
  155. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.d.ts.map +1 -1
  156. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.js +44 -20
  157. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.js.map +1 -1
  158. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.mjs +44 -20
  159. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.mjs.map +1 -1
  160. package/dist/blocks/e-commerce/navigation/storefront-navbar.d.ts.map +1 -1
  161. package/dist/blocks/e-commerce/navigation/storefront-navbar.js +21 -10
  162. package/dist/blocks/e-commerce/navigation/storefront-navbar.js.map +1 -1
  163. package/dist/blocks/e-commerce/navigation/storefront-navbar.mjs +21 -10
  164. package/dist/blocks/e-commerce/navigation/storefront-navbar.mjs.map +1 -1
  165. package/dist/blocks/e-commerce/product-list/product-card.d.ts.map +1 -1
  166. package/dist/blocks/e-commerce/product-list/product-card.js +36 -9
  167. package/dist/blocks/e-commerce/product-list/product-card.js.map +1 -1
  168. package/dist/blocks/e-commerce/product-list/product-card.mjs +36 -9
  169. package/dist/blocks/e-commerce/product-list/product-card.mjs.map +1 -1
  170. package/dist/blocks/e-commerce/product-list/product-showcase-1.d.ts.map +1 -1
  171. package/dist/blocks/e-commerce/product-list/product-showcase-1.js +7 -2
  172. package/dist/blocks/e-commerce/product-list/product-showcase-1.js.map +1 -1
  173. package/dist/blocks/e-commerce/product-list/product-showcase-1.mjs +7 -2
  174. package/dist/blocks/e-commerce/product-list/product-showcase-1.mjs.map +1 -1
  175. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.d.ts.map +1 -1
  176. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.js +5 -1
  177. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.js.map +1 -1
  178. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.mjs +5 -1
  179. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.mjs.map +1 -1
  180. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.d.ts.map +1 -1
  181. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.js +71 -51
  182. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.js.map +1 -1
  183. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.mjs +71 -51
  184. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.mjs.map +1 -1
  185. package/dist/blocks/marketing/banners/banner-1.d.ts.map +1 -1
  186. package/dist/blocks/marketing/banners/banner-1.js +15 -27
  187. package/dist/blocks/marketing/banners/banner-1.js.map +1 -1
  188. package/dist/blocks/marketing/banners/banner-1.mjs +16 -28
  189. package/dist/blocks/marketing/banners/banner-1.mjs.map +1 -1
  190. package/dist/index.d.ts +16 -4
  191. package/dist/index.d.ts.map +1 -1
  192. package/dist/index.js +19 -0
  193. package/dist/index.js.map +1 -1
  194. package/dist/index.mjs +13 -0
  195. package/dist/index.mjs.map +1 -1
  196. package/dist/lib/contracts/checkout-commerce-v1.d.ts +2350 -0
  197. package/dist/lib/contracts/checkout-commerce-v1.d.ts.map +1 -0
  198. package/dist/lib/contracts/checkout-commerce-v1.js +417 -0
  199. package/dist/lib/contracts/checkout-commerce-v1.js.map +1 -0
  200. package/dist/lib/contracts/checkout-commerce-v1.mjs +392 -0
  201. package/dist/lib/contracts/checkout-commerce-v1.mjs.map +1 -0
  202. package/dist/lib/contracts/marketplace-product-card.d.ts +324 -0
  203. package/dist/lib/contracts/marketplace-product-card.d.ts.map +1 -0
  204. package/dist/lib/contracts/marketplace-product-card.js +85 -0
  205. package/dist/lib/contracts/marketplace-product-card.js.map +1 -0
  206. package/dist/lib/contracts/marketplace-product-card.mjs +61 -0
  207. package/dist/lib/contracts/marketplace-product-card.mjs.map +1 -0
  208. package/dist/lib/contracts.d.ts +2289 -178
  209. package/dist/lib/contracts.d.ts.map +1 -1
  210. package/dist/lib/contracts.js +332 -25
  211. package/dist/lib/contracts.js.map +1 -1
  212. package/dist/lib/contracts.mjs +278 -5
  213. package/dist/lib/contracts.mjs.map +1 -1
  214. package/dist/lib/money-schema.d.ts +19 -0
  215. package/dist/lib/money-schema.d.ts.map +1 -0
  216. package/dist/lib/money-schema.js +33 -0
  217. package/dist/lib/money-schema.js.map +1 -0
  218. package/dist/lib/money-schema.mjs +9 -0
  219. package/dist/lib/money-schema.mjs.map +1 -0
  220. package/dist/lib/motion.d.ts +29 -0
  221. package/dist/lib/motion.d.ts.map +1 -0
  222. package/dist/lib/motion.js +65 -0
  223. package/dist/lib/motion.js.map +1 -0
  224. package/dist/lib/motion.mjs +41 -0
  225. package/dist/lib/motion.mjs.map +1 -0
  226. package/dist/ui/accordion.d.ts +3 -1
  227. package/dist/ui/accordion.d.ts.map +1 -1
  228. package/dist/ui/accordion.js +21 -5
  229. package/dist/ui/accordion.js.map +1 -1
  230. package/dist/ui/accordion.mjs +21 -5
  231. package/dist/ui/accordion.mjs.map +1 -1
  232. package/dist/ui/input-group.d.ts +1 -1
  233. package/package.json +18 -3
  234. package/dist/.tsbuildinfo +0 -1
@@ -23,175 +23,293 @@ __export(checkout_shipping_step_exports, {
23
23
  });
24
24
  module.exports = __toCommonJS(checkout_shipping_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");
27
- var import_input = require("../../../ui/input.js");
28
29
  var import_radio_group = require("../../../ui/radio-group.js");
29
30
  var import_money = require("../../../lib/money.js");
30
- var import_checkout_field_feedback = require("./checkout-field-feedback.js");
31
- var import_checkout_country_field = require("./checkout-country-field.js");
31
+ var import_checkbox_check = require("./checkbox-check.js");
32
+ var import_checkout_address_fields = require("./checkout-address-fields.js");
33
+ var import_checkout_id_context = require("./checkout-id-context.js");
34
+ var import_checkout_address_equality = require("./checkout-address-equality.js");
35
+ var import_checkout_saved_addresses = require("./checkout-saved-addresses.js");
32
36
  function CheckoutShippingStep({
33
- values,
34
- onChange,
35
- labels,
36
- countries,
37
- shippingOptions,
38
- selectedShippingOptionId,
37
+ shippingAddress,
38
+ billingAddress,
39
+ sameAsShipping,
40
+ onShippingAddressChange,
41
+ onBillingAddressChange,
42
+ onSameAsShippingChange,
43
+ shippingLocations,
44
+ billingLocations,
45
+ onRetryLocations,
46
+ savedAddresses,
47
+ onSelectSavedAddress,
48
+ onCreateSavedAddress,
49
+ onUpdateSavedAddress,
50
+ onDeleteSavedAddress,
51
+ onStartNewAddress,
52
+ onCancelNewAddress,
53
+ savedAddressState,
54
+ shippingGroups,
55
+ shippingState = "idle",
39
56
  onSelectShippingOption,
57
+ onRetryShipping,
58
+ labels,
40
59
  formatMoney: formatMoneyProp,
41
60
  fieldErrors,
42
- fieldDescriptions
61
+ fieldDescriptions,
62
+ requireShippingPhone = false
43
63
  }) {
44
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.FieldGroup, { className: "grid grid-cols-1 gap-4", children: [
45
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.Field, { "data-invalid": !!fieldErrors?.address?.length, children: [
46
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldLabel, { htmlFor: "checkout-address", children: labels.addressLabel }),
64
+ const checkoutId = (0, import_checkout_id_context.useCheckoutIds)();
65
+ const showSavedAddresses = !!onSelectSavedAddress;
66
+ const showAddAddress = !!(onCreateSavedAddress && onStartNewAddress && onCancelNewAddress);
67
+ const isMutating = !!savedAddressState?.pendingId;
68
+ const saveError = savedAddressState?.error && !savedAddressState.error.id ? savedAddressState.error : void 0;
69
+ const [creating, setCreating] = (0, import_react.useState)(false);
70
+ const [lastMatchedId, setLastMatchedId] = (0, import_react.useState)(
71
+ () => savedAddresses?.find((entry) => (0, import_checkout_address_equality.addressesEqual)(entry.address, shippingAddress))?.id
72
+ );
73
+ const lastMatchedBeforeNew = (0, import_react.useRef)(void 0);
74
+ const matchedId = savedAddresses?.find(
75
+ (entry) => (0, import_checkout_address_equality.addressesEqual)(entry.address, shippingAddress)
76
+ )?.id;
77
+ const activeLastMatchedId = lastMatchedId && savedAddresses?.some((entry) => entry.id === lastMatchedId) ? lastMatchedId : void 0;
78
+ (0, import_react.useEffect)(() => {
79
+ if (creating && matchedId) setCreating(false);
80
+ }, [creating, matchedId]);
81
+ (0, import_react.useEffect)(() => {
82
+ if (matchedId) setLastMatchedId(matchedId);
83
+ }, [matchedId]);
84
+ const handleSelect = (id) => {
85
+ setLastMatchedId(id);
86
+ setCreating(false);
87
+ onSelectSavedAddress?.(id);
88
+ };
89
+ const handleStartNew = () => {
90
+ lastMatchedBeforeNew.current = activeLastMatchedId;
91
+ setLastMatchedId(void 0);
92
+ setCreating(true);
93
+ onStartNewAddress?.();
94
+ };
95
+ const handleCancelNew = () => {
96
+ setCreating(false);
97
+ setLastMatchedId(lastMatchedBeforeNew.current);
98
+ onCancelNewAddress?.();
99
+ };
100
+ const countryLabel = (countryCode) => shippingLocations?.countries.find((country) => country.value === countryCode)?.label ?? countryCode;
101
+ const showSaveRow = !matchedId && (!!onCreateSavedAddress || !!activeLastMatchedId && !!onUpdateSavedAddress);
102
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-6", children: [
103
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "sr-only", role: "status", "aria-live": "polite", children: savedAddressState?.lastSavedId ? savedAddressState.lastAction === "deleted" ? labels.addressDeletedLabel : labels.addressSavedLabel : "" }),
104
+ showSavedAddresses ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
105
+ import_checkout_saved_addresses.CheckoutSavedAddresses,
106
+ {
107
+ savedAddresses: savedAddresses ?? [],
108
+ selectedId: matchedId,
109
+ state: savedAddressState,
110
+ labels,
111
+ countryLabel,
112
+ onSelect: handleSelect,
113
+ onDelete: onDeleteSavedAddress
114
+ }
115
+ ) : null,
116
+ showAddAddress ? creating ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-wrap items-center justify-between gap-2 rounded-lg border border-dashed p-3", children: [
117
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-medium", children: labels.newAddressLabel }),
47
118
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
48
- import_input.Input,
119
+ import_button.Button,
49
120
  {
50
- id: "checkout-address",
51
- autoComplete: "street-address",
52
- value: values.address,
53
- onChange: (e) => onChange("address", e.target.value),
54
- ...(0, import_checkout_field_feedback.checkoutFieldAria)("checkout-address", fieldErrors?.address)
121
+ type: "button",
122
+ variant: "outline",
123
+ size: "sm",
124
+ disabled: isMutating,
125
+ onClick: handleCancelNew,
126
+ children: labels.cancelAddressLabel
55
127
  }
56
- ),
128
+ )
129
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
130
+ import_button.Button,
131
+ {
132
+ id: checkoutId("checkout-add-address"),
133
+ type: "button",
134
+ variant: "outline",
135
+ size: "sm",
136
+ className: "w-fit",
137
+ disabled: isMutating,
138
+ onClick: handleStartNew,
139
+ children: labels.addAddressLabel
140
+ }
141
+ ) : null,
142
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
143
+ import_checkout_address_fields.CheckoutAddressFields,
144
+ {
145
+ prefix: "shipping",
146
+ values: shippingAddress,
147
+ onChange: onShippingAddressChange,
148
+ locations: shippingLocations,
149
+ onRetryLocation: onRetryLocations ? (level) => onRetryLocations("shipping", level) : void 0,
150
+ labels,
151
+ errors: fieldErrors?.shippingAddress,
152
+ descriptions: fieldDescriptions?.shippingAddress,
153
+ heading: labels.recipientHeading,
154
+ description: labels.recipientDescription,
155
+ requiredPhone: requireShippingPhone
156
+ }
157
+ ),
158
+ showSaveRow ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
159
+ "div",
160
+ {
161
+ className: "flex flex-col gap-2 rounded-lg border p-4",
162
+ "aria-busy": isMutating || void 0,
163
+ children: [
164
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-wrap gap-2", children: [
165
+ activeLastMatchedId && onUpdateSavedAddress ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
166
+ import_button.Button,
167
+ {
168
+ type: "button",
169
+ variant: "outline",
170
+ size: "sm",
171
+ disabled: isMutating,
172
+ onClick: () => onUpdateSavedAddress(activeLastMatchedId, shippingAddress),
173
+ children: isMutating ? labels.savingAddressLabel : labels.updateSavedAddressLabel
174
+ }
175
+ ) : null,
176
+ onCreateSavedAddress ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
177
+ import_button.Button,
178
+ {
179
+ type: "button",
180
+ size: "sm",
181
+ disabled: isMutating,
182
+ onClick: () => onCreateSavedAddress(shippingAddress),
183
+ children: isMutating ? labels.savingAddressLabel : activeLastMatchedId ? labels.saveAsNewAddressLabel : labels.saveAddressLabel
184
+ }
185
+ ) : null
186
+ ] }),
187
+ saveError ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-destructive text-sm", role: "alert", children: saveError.message || labels.addressSaveErrorLabel }) : null
188
+ ]
189
+ }
190
+ ) : null,
191
+ saveError && !showSaveRow ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-destructive text-sm", role: "alert", children: saveError.message || labels.addressSaveErrorLabel }) : null,
192
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.Field, { orientation: "horizontal", className: "gap-2", children: [
57
193
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
58
- import_checkout_field_feedback.CheckoutFieldFeedback,
194
+ import_checkbox_check.CheckboxCheck,
59
195
  {
60
- id: "checkout-address",
61
- errors: fieldErrors?.address,
62
- description: fieldDescriptions?.address
196
+ id: checkoutId("checkout-billing-same-as-shipping"),
197
+ checked: sameAsShipping,
198
+ onCheckedChange: (checked) => onSameAsShippingChange(checked === true)
63
199
  }
64
- )
65
- ] }),
66
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [
67
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.Field, { "data-invalid": !!fieldErrors?.city?.length, children: [
68
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldLabel, { htmlFor: "checkout-city", children: labels.cityLabel }),
69
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
70
- import_input.Input,
71
- {
72
- id: "checkout-city",
73
- autoComplete: "address-level2",
74
- value: values.city,
75
- onChange: (e) => onChange("city", e.target.value),
76
- ...(0, import_checkout_field_feedback.checkoutFieldAria)("checkout-city", fieldErrors?.city)
77
- }
78
- ),
79
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
80
- import_checkout_field_feedback.CheckoutFieldFeedback,
81
- {
82
- id: "checkout-city",
83
- errors: fieldErrors?.city,
84
- description: fieldDescriptions?.city
85
- }
86
- )
87
- ] }),
88
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.Field, { "data-invalid": !!fieldErrors?.state?.length, children: [
89
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldLabel, { htmlFor: "checkout-state", children: labels.stateLabel }),
90
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
91
- import_input.Input,
92
- {
93
- id: "checkout-state",
94
- autoComplete: "address-level1",
95
- value: values.state,
96
- onChange: (e) => onChange("state", e.target.value),
97
- ...(0, import_checkout_field_feedback.checkoutFieldAria)("checkout-state", fieldErrors?.state)
98
- }
99
- ),
100
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
101
- import_checkout_field_feedback.CheckoutFieldFeedback,
102
- {
103
- id: "checkout-state",
104
- errors: fieldErrors?.state,
105
- description: fieldDescriptions?.state
106
- }
107
- )
108
- ] })
200
+ ),
201
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldLabel, { htmlFor: checkoutId("checkout-billing-same-as-shipping"), className: "text-sm font-normal", children: labels.billingSameAsShippingLabel })
109
202
  ] }),
110
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [
111
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.Field, { "data-invalid": !!fieldErrors?.zipCode?.length, children: [
112
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldLabel, { htmlFor: "checkout-zip", children: labels.zipCodeLabel }),
113
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
114
- import_input.Input,
115
- {
116
- id: "checkout-zip",
117
- autoComplete: "postal-code",
118
- value: values.zipCode,
119
- onChange: (e) => onChange("zipCode", e.target.value),
120
- ...(0, import_checkout_field_feedback.checkoutFieldAria)("checkout-zip", fieldErrors?.zipCode)
121
- }
122
- ),
123
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
124
- import_checkout_field_feedback.CheckoutFieldFeedback,
125
- {
126
- id: "checkout-zip",
127
- errors: fieldErrors?.zipCode,
128
- description: fieldDescriptions?.zipCode
129
- }
130
- )
203
+ !sameAsShipping && billingAddress ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "flex flex-col gap-4 rounded-lg border p-4", children: [
204
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
205
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-base font-semibold", children: labels.billingHeading }),
206
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground", children: labels.billingDescription })
131
207
  ] }),
132
- countries && countries.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
133
- import_checkout_country_field.CheckoutCountryField,
134
- {
135
- labels,
136
- countries,
137
- value: values.country,
138
- onValueChange: (value) => onChange("country", value),
139
- errors: fieldErrors?.country,
140
- description: fieldDescriptions?.country
141
- }
142
- ) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.Field, { "data-invalid": !!fieldErrors?.country?.length, children: [
143
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldLabel, { htmlFor: "checkout-country-input", children: labels.countryLabel }),
144
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
145
- import_input.Input,
146
- {
147
- id: "checkout-country-input",
148
- autoComplete: "country-name",
149
- value: values.country,
150
- onChange: (e) => onChange("country", e.target.value),
151
- ...(0, import_checkout_field_feedback.checkoutFieldAria)("checkout-country-input", fieldErrors?.country)
152
- }
153
- ),
154
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
155
- import_checkout_field_feedback.CheckoutFieldFeedback,
156
- {
157
- id: "checkout-country-input",
158
- errors: fieldErrors?.country,
159
- description: fieldDescriptions?.country
160
- }
161
- )
162
- ] })
163
- ] }),
164
- shippingOptions && shippingOptions.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.FieldSet, { children: [
165
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldLegend, { children: labels.shippingMethodLegend }),
166
208
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
167
- import_radio_group.RadioGroup,
209
+ import_checkout_address_fields.CheckoutAddressFields,
168
210
  {
169
- value: selectedShippingOptionId ?? "",
170
- onValueChange: (value) => value && onSelectShippingOption?.(String(value)),
171
- className: "grid grid-cols-1 gap-3",
172
- children: shippingOptions.map((option) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
173
- import_field.Field,
174
- {
175
- orientation: "horizontal",
176
- className: "flex-wrap items-start justify-between gap-3 rounded-lg border p-4",
177
- children: [
178
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldContent, { className: "min-w-0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.FieldLabel, { htmlFor: `shipping-${option.id}`, className: "flex flex-col gap-0.5", children: [
179
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: option.name }),
180
- option.description ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground text-xs font-normal", children: option.description }) : null
181
- ] }) }),
182
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-3", children: [
183
- (0, import_money.isAvailableMoney)(option.price) ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-sm tabular-nums", children: (0, import_money.formatMoney)(option.price, formatMoneyProp) }) : null,
184
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radio_group.RadioGroupItem, { value: option.id, id: `shipping-${option.id}` })
185
- ] })
186
- ]
187
- },
188
- option.id
189
- ))
211
+ prefix: "billing",
212
+ values: billingAddress,
213
+ onChange: onBillingAddressChange ?? (() => {
214
+ }),
215
+ locations: billingLocations,
216
+ onRetryLocation: onRetryLocations ? (level) => onRetryLocations("billing", level) : void 0,
217
+ labels,
218
+ errors: fieldErrors?.billingAddress,
219
+ descriptions: fieldDescriptions?.billingAddress
190
220
  }
191
221
  )
192
- ] }) : null
222
+ ] }) : null,
223
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
224
+ DeliveryGroups,
225
+ {
226
+ groups: shippingGroups,
227
+ state: shippingState,
228
+ onSelectShippingOption,
229
+ onRetry: onRetryShipping,
230
+ labels,
231
+ formatMoney: formatMoneyProp
232
+ }
233
+ )
193
234
  ] });
194
235
  }
236
+ function DeliveryGroups({
237
+ groups,
238
+ state,
239
+ onSelectShippingOption,
240
+ onRetry,
241
+ labels,
242
+ formatMoney: formatMoneyProp
243
+ }) {
244
+ const checkoutId = (0, import_checkout_id_context.useCheckoutIds)();
245
+ if (state === "pending") {
246
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground text-sm", role: "status", children: labels.deliveryLoadingLabel });
247
+ }
248
+ if (state === "error") {
249
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-2", role: "alert", children: [
250
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-destructive text-sm", children: labels.deliveryErrorLabel }),
251
+ onRetry ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { type: "button", variant: "outline", size: "sm", className: "w-fit", onClick: onRetry, children: labels.retryLabel }) : null
252
+ ] });
253
+ }
254
+ if (state === "unavailable") {
255
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground text-sm", role: "status", children: labels.deliveryUnavailableLabel });
256
+ }
257
+ if (!groups) return null;
258
+ if (groups.length === 0) {
259
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground text-sm", role: "status", children: labels.noShippingOptionsLabel });
260
+ }
261
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex flex-col gap-6", children: groups.map((group) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.FieldSet, { className: "gap-3", children: [
262
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.FieldLegend, { className: "mb-0", children: [
263
+ group.label ?? labels.shippingMethodLegend,
264
+ typeof group.itemCount === "number" ? ` (${group.itemCount})` : ""
265
+ ] }),
266
+ group.unavailableReason || group.options.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground text-sm", role: "status", children: group.unavailableReason ?? labels.groupUnavailableLabel }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
267
+ import_radio_group.RadioGroup,
268
+ {
269
+ value: group.selectedOptionId ?? "",
270
+ onValueChange: (value) => value && onSelectShippingOption?.(group.id, String(value)),
271
+ className: "grid grid-cols-1 gap-3",
272
+ children: group.options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
273
+ import_field.Field,
274
+ {
275
+ orientation: "horizontal",
276
+ className: "flex-wrap items-start justify-between gap-3 rounded-lg border p-4",
277
+ "data-disabled": option.disabled || void 0,
278
+ children: [
279
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldContent, { className: "min-w-0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
280
+ import_field.FieldLabel,
281
+ {
282
+ htmlFor: checkoutId(`shipping-${group.id}-${option.id}`),
283
+ className: "flex flex-col items-start gap-0.5 text-left",
284
+ children: [
285
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: option.name }),
286
+ option.description ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground text-xs font-normal", children: option.description }) : null,
287
+ option.estimatedDays ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground text-xs font-normal", children: option.estimatedDays }) : null,
288
+ option.locationName ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground text-xs font-normal", children: option.locationName }) : null,
289
+ option.disabled && option.disabledReason ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground text-xs font-normal", children: option.disabledReason }) : null
290
+ ]
291
+ }
292
+ ) }),
293
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex shrink-0 items-center gap-3", children: [
294
+ (0, import_money.isAvailableMoney)(option.price) ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-sm tabular-nums", children: (0, import_money.formatMoney)(option.price, formatMoneyProp) }) : null,
295
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
296
+ import_radio_group.RadioGroupItem,
297
+ {
298
+ value: option.id,
299
+ id: checkoutId(`shipping-${group.id}-${option.id}`),
300
+ "data-checkout-shipping-option": option.id,
301
+ disabled: option.disabled
302
+ }
303
+ )
304
+ ] })
305
+ ]
306
+ },
307
+ option.id
308
+ ))
309
+ }
310
+ )
311
+ ] }, group.id)) });
312
+ }
195
313
  // Annotate the CommonJS export names for ESM import in node:
196
314
  0 && (module.exports = {
197
315
  CheckoutShippingStep
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-shipping-step.tsx"],"sourcesContent":["'use client'\n\nimport { Field, FieldContent, FieldGroup, FieldLabel, FieldLegend, FieldSet } from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport { RadioGroup, RadioGroupItem } from '../../../ui/radio-group'\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport type { Money } from '@thorprovider/types'\nimport { CheckoutFieldFeedback, checkoutFieldAria } from './checkout-field-feedback'\nimport { CheckoutCountryField } from './checkout-country-field'\nimport type {\n CheckoutChangeHandler,\n CheckoutCountryOption,\n CheckoutFieldDescriptions,\n CheckoutValuesFieldErrors,\n CheckoutLabels,\n CheckoutShippingOption,\n CheckoutValues,\n} from './checkout'\n\nexport interface CheckoutShippingStepProps {\n values: CheckoutValues\n onChange: CheckoutChangeHandler\n labels: CheckoutLabels\n countries?: CheckoutCountryOption[]\n shippingOptions?: CheckoutShippingOption[]\n selectedShippingOptionId?: string\n onSelectShippingOption?: (id: string) => void\n /** Override money formatting (locale, currency). Defaults to `Money.currencyCode`. */\n formatMoney?: (money: Money) => string\n fieldErrors?: CheckoutValuesFieldErrors\n fieldDescriptions?: CheckoutFieldDescriptions\n}\n\nexport function CheckoutShippingStep({\n values,\n onChange,\n labels,\n countries,\n shippingOptions,\n selectedShippingOptionId,\n onSelectShippingOption,\n formatMoney: formatMoneyProp,\n fieldErrors,\n fieldDescriptions,\n}: CheckoutShippingStepProps) {\n return (\n <FieldGroup className=\"grid grid-cols-1 gap-4\">\n <Field data-invalid={!!fieldErrors?.address?.length}>\n <FieldLabel htmlFor=\"checkout-address\">{labels.addressLabel}</FieldLabel>\n <Input\n id=\"checkout-address\"\n autoComplete=\"street-address\"\n value={values.address}\n onChange={(e) => onChange('address', e.target.value)}\n {...checkoutFieldAria('checkout-address', fieldErrors?.address)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-address\"\n errors={fieldErrors?.address}\n description={fieldDescriptions?.address}\n />\n </Field>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <Field data-invalid={!!fieldErrors?.city?.length}>\n <FieldLabel htmlFor=\"checkout-city\">{labels.cityLabel}</FieldLabel>\n <Input\n id=\"checkout-city\"\n autoComplete=\"address-level2\"\n value={values.city}\n onChange={(e) => onChange('city', e.target.value)}\n {...checkoutFieldAria('checkout-city', fieldErrors?.city)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-city\"\n errors={fieldErrors?.city}\n description={fieldDescriptions?.city}\n />\n </Field>\n <Field data-invalid={!!fieldErrors?.state?.length}>\n <FieldLabel htmlFor=\"checkout-state\">{labels.stateLabel}</FieldLabel>\n <Input\n id=\"checkout-state\"\n autoComplete=\"address-level1\"\n value={values.state}\n onChange={(e) => onChange('state', e.target.value)}\n {...checkoutFieldAria('checkout-state', fieldErrors?.state)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-state\"\n errors={fieldErrors?.state}\n description={fieldDescriptions?.state}\n />\n </Field>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <Field data-invalid={!!fieldErrors?.zipCode?.length}>\n <FieldLabel htmlFor=\"checkout-zip\">{labels.zipCodeLabel}</FieldLabel>\n <Input\n id=\"checkout-zip\"\n autoComplete=\"postal-code\"\n value={values.zipCode}\n onChange={(e) => onChange('zipCode', e.target.value)}\n {...checkoutFieldAria('checkout-zip', fieldErrors?.zipCode)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-zip\"\n errors={fieldErrors?.zipCode}\n description={fieldDescriptions?.zipCode}\n />\n </Field>\n {countries && countries.length > 0 ? (\n <CheckoutCountryField\n labels={labels}\n countries={countries}\n value={values.country}\n onValueChange={(value) => onChange('country', value)}\n errors={fieldErrors?.country}\n description={fieldDescriptions?.country}\n />\n ) : (\n <Field data-invalid={!!fieldErrors?.country?.length}>\n <FieldLabel htmlFor=\"checkout-country-input\">{labels.countryLabel}</FieldLabel>\n <Input\n id=\"checkout-country-input\"\n autoComplete=\"country-name\"\n value={values.country}\n onChange={(e) => onChange('country', e.target.value)}\n {...checkoutFieldAria('checkout-country-input', fieldErrors?.country)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-country-input\"\n errors={fieldErrors?.country}\n description={fieldDescriptions?.country}\n />\n </Field>\n )}\n </div>\n\n {shippingOptions && shippingOptions.length > 0 ? (\n <FieldSet>\n <FieldLegend>{labels.shippingMethodLegend}</FieldLegend>\n <RadioGroup\n value={selectedShippingOptionId ?? ''}\n onValueChange={(value) => value && onSelectShippingOption?.(String(value))}\n className=\"grid grid-cols-1 gap-3\"\n >\n {shippingOptions.map((option) => (\n <Field\n key={option.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={`shipping-${option.id}`} className=\"flex flex-col gap-0.5\">\n <span>{option.name}</span>\n {option.description ? (\n <span className=\"text-muted-foreground text-xs font-normal\">\n {option.description}\n </span>\n ) : null}\n </FieldLabel>\n </FieldContent>\n <div className=\"flex items-center gap-3\">\n {isAvailableMoney(option.price) ? (\n <span className=\"text-sm tabular-nums\">\n {formatMoney(option.price, formatMoneyProp)}\n </span>\n ) : null}\n <RadioGroupItem value={option.id} id={`shipping-${option.id}`} />\n </div>\n </Field>\n ))}\n </RadioGroup>\n </FieldSet>\n ) : null}\n </FieldGroup>\n )\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-shipping-step.tsx"],"sourcesContent":["'use client'\n\nimport { useEffect, useRef, useState } from 'react'\nimport { Button } from '../../../ui/button'\nimport {\n Field,\n FieldContent,\n FieldLabel,\n FieldLegend,\n FieldSet,\n} from '../../../ui/field'\nimport { RadioGroup, RadioGroupItem } from '../../../ui/radio-group'\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport type {\n CheckoutAddressLevel,\n CheckoutAddressValues,\n CheckoutLocationOptions,\n CheckoutSavedAddress,\n CheckoutShippingGroup,\n Money,\n} from '@thorprovider/types'\nimport { CheckboxCheck } from './checkbox-check'\nimport { CheckoutAddressFields } from './checkout-address-fields'\nimport { useCheckoutIds } from './checkout-id-context'\nimport { addressesEqual } from './checkout-address-equality'\nimport { CheckoutSavedAddresses } from './checkout-saved-addresses'\nimport type {\n CheckoutAddressChangeHandler,\n CheckoutFieldDescriptions,\n CheckoutFieldErrors,\n CheckoutLabels,\n CheckoutSavedAddressState,\n} from './checkout'\n\nexport interface CheckoutShippingStepProps {\n shippingAddress: CheckoutAddressValues\n billingAddress?: CheckoutAddressValues\n sameAsShipping: boolean\n onShippingAddressChange: CheckoutAddressChangeHandler\n onBillingAddressChange?: CheckoutAddressChangeHandler\n onSameAsShippingChange: (same: boolean) => void\n shippingLocations?: CheckoutLocationOptions\n billingLocations?: CheckoutLocationOptions\n onRetryLocations?: (kind: 'shipping' | 'billing', level: CheckoutAddressLevel) => void\n savedAddresses?: CheckoutSavedAddress[]\n onSelectSavedAddress?: (id: string) => void\n onCreateSavedAddress?: (address: CheckoutAddressValues) => void\n onUpdateSavedAddress?: (id: string, address: CheckoutAddressValues) => void\n onDeleteSavedAddress?: (id: string) => void\n onStartNewAddress?: () => void\n onCancelNewAddress?: () => void\n savedAddressState?: CheckoutSavedAddressState\n shippingGroups?: CheckoutShippingGroup[]\n shippingState?: 'idle' | 'pending' | 'error' | 'unavailable'\n onSelectShippingOption?: (groupId: string, optionId: string) => void\n onRetryShipping?: () => void\n labels: CheckoutLabels\n /** Override money formatting (locale, currency). Defaults to `Money.currencyCode`. */\n formatMoney?: (money: Money) => string\n fieldErrors?: CheckoutFieldErrors\n fieldDescriptions?: CheckoutFieldDescriptions\n requireShippingPhone?: boolean\n}\n\n/**\n * Shipping and billing addresses, the saved-address book, and the contextual\n * save/update/create actions. The block is controlled: it reports intentions\n * and renders the host's refreshed list and mutation state; it never mutates\n * the address book itself.\n */\nexport function CheckoutShippingStep({\n shippingAddress,\n billingAddress,\n sameAsShipping,\n onShippingAddressChange,\n onBillingAddressChange,\n onSameAsShippingChange,\n shippingLocations,\n billingLocations,\n onRetryLocations,\n savedAddresses,\n onSelectSavedAddress,\n onCreateSavedAddress,\n onUpdateSavedAddress,\n onDeleteSavedAddress,\n onStartNewAddress,\n onCancelNewAddress,\n savedAddressState,\n shippingGroups,\n shippingState = 'idle',\n onSelectShippingOption,\n onRetryShipping,\n labels,\n formatMoney: formatMoneyProp,\n fieldErrors,\n fieldDescriptions,\n requireShippingPhone = false,\n}: CheckoutShippingStepProps) {\n const checkoutId = useCheckoutIds()\n const showSavedAddresses = !!onSelectSavedAddress\n const showAddAddress = !!(\n onCreateSavedAddress &&\n onStartNewAddress &&\n onCancelNewAddress\n )\n const isMutating = !!savedAddressState?.pendingId\n const saveError =\n savedAddressState?.error && !savedAddressState.error.id\n ? savedAddressState.error\n : undefined\n\n const [creating, setCreating] = useState(false)\n const [lastMatchedId, setLastMatchedId] = useState<string | undefined>(() =>\n savedAddresses?.find((entry) => addressesEqual(entry.address, shippingAddress))?.id,\n )\n const lastMatchedBeforeNew = useRef<string | undefined>(undefined)\n\n const matchedId = savedAddresses?.find((entry) =>\n addressesEqual(entry.address, shippingAddress),\n )?.id\n const activeLastMatchedId =\n lastMatchedId && savedAddresses?.some((entry) => entry.id === lastMatchedId)\n ? lastMatchedId\n : undefined\n\n useEffect(() => {\n if (creating && matchedId) setCreating(false)\n }, [creating, matchedId])\n\n useEffect(() => {\n if (matchedId) setLastMatchedId(matchedId)\n }, [matchedId])\n\n const handleSelect = (id: string) => {\n setLastMatchedId(id)\n setCreating(false)\n onSelectSavedAddress?.(id)\n }\n\n const handleStartNew = () => {\n lastMatchedBeforeNew.current = activeLastMatchedId\n setLastMatchedId(undefined)\n setCreating(true)\n onStartNewAddress?.()\n }\n\n const handleCancelNew = () => {\n setCreating(false)\n setLastMatchedId(lastMatchedBeforeNew.current)\n onCancelNewAddress?.()\n }\n\n const countryLabel = (countryCode: string) =>\n shippingLocations?.countries.find((country) => country.value === countryCode)?.label ??\n countryCode\n\n const showSaveRow =\n !matchedId && (!!onCreateSavedAddress || (!!activeLastMatchedId && !!onUpdateSavedAddress))\n\n return (\n <div className=\"flex flex-col gap-6\">\n <p className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {savedAddressState?.lastSavedId\n ? savedAddressState.lastAction === 'deleted'\n ? labels.addressDeletedLabel\n : labels.addressSavedLabel\n : ''}\n </p>\n\n {showSavedAddresses ? (\n <CheckoutSavedAddresses\n savedAddresses={savedAddresses ?? []}\n selectedId={matchedId}\n state={savedAddressState}\n labels={labels}\n countryLabel={countryLabel}\n onSelect={handleSelect}\n onDelete={onDeleteSavedAddress}\n />\n ) : null}\n\n {showAddAddress ? (\n creating ? (\n <div className=\"flex flex-wrap items-center justify-between gap-2 rounded-lg border border-dashed p-3\">\n <p className=\"text-sm font-medium\">{labels.newAddressLabel}</p>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isMutating}\n onClick={handleCancelNew}\n >\n {labels.cancelAddressLabel}\n </Button>\n </div>\n ) : (\n <Button\n id={checkoutId('checkout-add-address')}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"w-fit\"\n disabled={isMutating}\n onClick={handleStartNew}\n >\n {labels.addAddressLabel}\n </Button>\n )\n ) : null}\n\n <CheckoutAddressFields\n prefix=\"shipping\"\n values={shippingAddress}\n onChange={onShippingAddressChange}\n locations={shippingLocations}\n onRetryLocation={\n onRetryLocations ? (level) => onRetryLocations('shipping', level) : undefined\n }\n labels={labels}\n errors={fieldErrors?.shippingAddress}\n descriptions={fieldDescriptions?.shippingAddress}\n heading={labels.recipientHeading}\n description={labels.recipientDescription}\n requiredPhone={requireShippingPhone}\n />\n\n {showSaveRow ? (\n <div\n className=\"flex flex-col gap-2 rounded-lg border p-4\"\n aria-busy={isMutating || undefined}\n >\n <div className=\"flex flex-wrap gap-2\">\n {activeLastMatchedId && onUpdateSavedAddress ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isMutating}\n onClick={() => onUpdateSavedAddress(activeLastMatchedId, shippingAddress)}\n >\n {isMutating\n ? labels.savingAddressLabel\n : labels.updateSavedAddressLabel}\n </Button>\n ) : null}\n {onCreateSavedAddress ? (\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={isMutating}\n onClick={() => onCreateSavedAddress(shippingAddress)}\n >\n {isMutating\n ? labels.savingAddressLabel\n : activeLastMatchedId\n ? labels.saveAsNewAddressLabel\n : labels.saveAddressLabel}\n </Button>\n ) : null}\n </div>\n {saveError ? (\n <p className=\"text-destructive text-sm\" role=\"alert\">\n {saveError.message || labels.addressSaveErrorLabel}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {saveError && !showSaveRow ? (\n <p className=\"text-destructive text-sm\" role=\"alert\">\n {saveError.message || labels.addressSaveErrorLabel}\n </p>\n ) : null}\n\n <Field orientation=\"horizontal\" className=\"gap-2\">\n <CheckboxCheck\n id={checkoutId('checkout-billing-same-as-shipping')}\n checked={sameAsShipping}\n onCheckedChange={(checked) => onSameAsShippingChange(checked === true)}\n />\n <FieldLabel htmlFor={checkoutId('checkout-billing-same-as-shipping')} className=\"text-sm font-normal\">\n {labels.billingSameAsShippingLabel}\n </FieldLabel>\n </Field>\n\n {!sameAsShipping && billingAddress ? (\n <section className=\"flex flex-col gap-4 rounded-lg border p-4\">\n <div>\n <h3 className=\"text-base font-semibold\">{labels.billingHeading}</h3>\n <p className=\"text-sm text-muted-foreground\">{labels.billingDescription}</p>\n </div>\n <CheckoutAddressFields\n prefix=\"billing\"\n values={billingAddress}\n onChange={onBillingAddressChange ?? (() => {})}\n locations={billingLocations}\n onRetryLocation={\n onRetryLocations ? (level) => onRetryLocations('billing', level) : undefined\n }\n labels={labels}\n errors={fieldErrors?.billingAddress}\n descriptions={fieldDescriptions?.billingAddress}\n />\n </section>\n ) : null}\n\n <DeliveryGroups\n groups={shippingGroups}\n state={shippingState}\n onSelectShippingOption={onSelectShippingOption}\n onRetry={onRetryShipping}\n labels={labels}\n formatMoney={formatMoneyProp}\n />\n </div>\n )\n}\n\nfunction DeliveryGroups({\n groups,\n state,\n onSelectShippingOption,\n onRetry,\n labels,\n formatMoney: formatMoneyProp,\n}: {\n groups?: CheckoutShippingGroup[]\n state: 'idle' | 'pending' | 'error' | 'unavailable'\n onSelectShippingOption?: (groupId: string, optionId: string) => void\n onRetry?: () => void\n labels: CheckoutLabels\n formatMoney?: (money: Money) => string\n}) {\n const checkoutId = useCheckoutIds()\n if (state === 'pending') {\n return (\n <p className=\"text-muted-foreground text-sm\" role=\"status\">\n {labels.deliveryLoadingLabel}\n </p>\n )\n }\n\n if (state === 'error') {\n return (\n <div className=\"flex flex-col gap-2\" role=\"alert\">\n <p className=\"text-destructive text-sm\">{labels.deliveryErrorLabel}</p>\n {onRetry ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetry}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n if (state === 'unavailable') {\n return (\n <p className=\"text-muted-foreground text-sm\" role=\"status\">\n {labels.deliveryUnavailableLabel}\n </p>\n )\n }\n\n if (!groups) return null\n\n if (groups.length === 0) {\n return (\n <p className=\"text-muted-foreground text-sm\" role=\"status\">\n {labels.noShippingOptionsLabel}\n </p>\n )\n }\n\n return (\n <div className=\"flex flex-col gap-6\">\n {groups.map((group) => (\n <FieldSet key={group.id} className=\"gap-3\">\n <FieldLegend className=\"mb-0\">\n {group.label ?? labels.shippingMethodLegend}\n {typeof group.itemCount === 'number' ? ` (${group.itemCount})` : ''}\n </FieldLegend>\n {group.unavailableReason || group.options.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\" role=\"status\">\n {group.unavailableReason ?? labels.groupUnavailableLabel}\n </p>\n ) : (\n <RadioGroup\n value={group.selectedOptionId ?? ''}\n onValueChange={(value) =>\n value && onSelectShippingOption?.(group.id, String(value))\n }\n className=\"grid grid-cols-1 gap-3\"\n >\n {group.options.map((option) => (\n <Field\n key={option.id}\n orientation=\"horizontal\"\n className=\"flex-wrap items-start justify-between gap-3 rounded-lg border p-4\"\n data-disabled={option.disabled || undefined}\n >\n <FieldContent className=\"min-w-0\">\n <FieldLabel\n htmlFor={checkoutId(`shipping-${group.id}-${option.id}`)}\n className=\"flex flex-col items-start gap-0.5 text-left\"\n >\n <span>{option.name}</span>\n {option.description ? (\n <span className=\"text-muted-foreground text-xs font-normal\">\n {option.description}\n </span>\n ) : null}\n {option.estimatedDays ? (\n <span className=\"text-muted-foreground text-xs font-normal\">\n {option.estimatedDays}\n </span>\n ) : null}\n {option.locationName ? (\n <span className=\"text-muted-foreground text-xs font-normal\">\n {option.locationName}\n </span>\n ) : null}\n {option.disabled && option.disabledReason ? (\n <span className=\"text-muted-foreground text-xs font-normal\">\n {option.disabledReason}\n </span>\n ) : null}\n </FieldLabel>\n </FieldContent>\n <div className=\"flex shrink-0 items-center gap-3\">\n {isAvailableMoney(option.price) ? (\n <span className=\"text-sm tabular-nums\">\n {formatMoney(option.price, formatMoneyProp)}\n </span>\n ) : null}\n <RadioGroupItem\n value={option.id}\n id={checkoutId(`shipping-${group.id}-${option.id}`)}\n data-checkout-shipping-option={option.id}\n disabled={option.disabled}\n />\n </div>\n </Field>\n ))}\n </RadioGroup>\n )}\n </FieldSet>\n ))}\n </div>\n )\n}\n"],"mappings":"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","names":[]}