@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
@@ -1,37 +1,188 @@
1
1
  "use client";
2
- import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { formatMoney, isAvailableMoney } from "../../../lib/money.mjs";
4
+ function resolveGroupMembership(groups, lines) {
5
+ if (!lines?.length || groups.some((group) => !group.items?.length)) return null;
6
+ const linesById = new Map(lines.map((line) => [String(line.id), line]));
7
+ const assigned = /* @__PURE__ */ new Map();
8
+ const itemsByGroup = /* @__PURE__ */ new Map();
9
+ for (const group of groups) {
10
+ const groupItems = [];
11
+ for (const item of group.items ?? []) {
12
+ const line = linesById.get(item.lineId);
13
+ if (!line) return null;
14
+ const quantity = item.quantity ?? line.quantity;
15
+ if (!Number.isInteger(quantity) || quantity <= 0 || quantity > line.quantity) {
16
+ return null;
17
+ }
18
+ assigned.set(item.lineId, (assigned.get(item.lineId) ?? 0) + quantity);
19
+ groupItems.push({
20
+ line,
21
+ quantity,
22
+ showLineTotal: quantity === line.quantity
23
+ });
24
+ }
25
+ itemsByGroup.set(group.id, groupItems);
26
+ }
27
+ for (const line of lines) {
28
+ if ((assigned.get(String(line.id)) ?? 0) !== line.quantity) return null;
29
+ }
30
+ return itemsByGroup;
31
+ }
32
+ function formatAddress(address) {
33
+ return [
34
+ [address.firstName, address.lastName].filter(Boolean).join(" "),
35
+ address.company,
36
+ address.address1,
37
+ address.address2,
38
+ [address.city, address.province, address.postalCode].filter(Boolean).join(" "),
39
+ address.countryCode,
40
+ address.phone
41
+ ].filter(Boolean).join(", ");
42
+ }
43
+ function groupHeading(labels, group, index, total) {
44
+ const sequence = labels.reviewGroupLabel.replace("{n}", String(index + 1)).replace("{total}", String(total));
45
+ return group.label ? `${sequence} \xB7 ${group.label}` : sequence;
46
+ }
47
+ function deliveryText(group, labels, formatMoneyProp) {
48
+ const selected = group.options.find((option) => option.id === group.selectedOptionId);
49
+ if (!selected) return "";
50
+ const details = [selected.name];
51
+ if (selected.estimatedDays) details.push(selected.estimatedDays);
52
+ if (isAvailableMoney(selected.price)) {
53
+ const price = formatMoney(selected.price, formatMoneyProp);
54
+ if (price) details.push(price);
55
+ }
56
+ return group.label ? `${group.label}: ${details.join(" \xB7 ")}` : details.join(" \xB7 ");
57
+ }
3
58
  function CheckoutReviewStep({
4
- values,
59
+ contact,
60
+ shippingAddress,
61
+ billingAddress,
62
+ sameAsShipping,
63
+ shippingGroups,
64
+ paymentMethod,
65
+ paymentMethods,
66
+ adjustmentPayments,
67
+ orderSummary,
5
68
  labels,
6
- selectedShippingOptionId,
7
- shippingOptions,
8
- paymentMethods
69
+ formatMoney: formatMoneyProp
9
70
  }) {
10
- const shippingName = shippingOptions?.find(
11
- (method) => method.id === selectedShippingOptionId
12
- )?.name;
13
- const paymentName = paymentMethods?.find((method) => method.id === values.paymentMethod)?.name;
14
- const shipTo = [
15
- [values.firstName, values.lastName].filter(Boolean).join(" "),
16
- values.address,
17
- [values.city, values.state, values.zipCode].filter(Boolean).join(" "),
18
- values.country
19
- ].filter(Boolean).join(", ");
20
- const rows = [
21
- { label: labels.reviewContactLabel, value: values.email },
22
- { label: labels.reviewShipToLabel, value: shipTo },
23
- { label: labels.reviewPaymentLabel, value: paymentName ?? "" },
24
- { label: labels.reviewShippingLabel, value: shippingName ?? "" }
71
+ const groups = shippingGroups ?? [];
72
+ const multiGroup = groups.length > 1;
73
+ const membership = multiGroup ? resolveGroupMembership(groups, orderSummary?.items) : null;
74
+ const showFlatLines = !multiGroup || !membership;
75
+ const paymentName = paymentMethods?.find((method) => method.id === paymentMethod)?.name;
76
+ const contactName = [contact.firstName, contact.lastName].filter(Boolean).join(" ");
77
+ const singleDelivery = !multiGroup && groups[0] ? deliveryText(groups[0], labels, formatMoneyProp) : "";
78
+ const identityRows = [
79
+ {
80
+ label: labels.reviewContactLabel,
81
+ value: [contactName, contact.email, contact.phone].filter(Boolean).join(", ")
82
+ },
83
+ { label: labels.reviewShipToLabel, value: formatAddress(shippingAddress) },
84
+ {
85
+ label: labels.reviewBillingLabel,
86
+ value: sameAsShipping ? labels.reviewSameAsShippingLabel : billingAddress ? formatAddress(billingAddress) : ""
87
+ }
25
88
  ].filter((row) => row.value.trim() !== "");
26
- return /* @__PURE__ */ jsxs("div", { className: "bg-muted/50 rounded-lg p-6", children: [
27
- /* @__PURE__ */ jsx("h3", { className: "mb-4 font-medium", children: labels.reviewHeading }),
28
- rows.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: labels.reviewEmptyLabel }) : /* @__PURE__ */ jsx("dl", { className: "flex flex-col gap-4 text-sm", children: rows.map((row) => /* @__PURE__ */ jsxs("div", { children: [
29
- /* @__PURE__ */ jsxs("dt", { className: "inline font-medium", children: [
30
- row.label,
31
- ": "
32
- ] }),
33
- /* @__PURE__ */ jsx("dd", { className: "inline", children: row.value })
34
- ] }, row.label)) })
89
+ const paymentRows = [{ label: labels.reviewPaymentLabel, value: paymentName ?? "" }].filter(
90
+ (row) => row.value.trim() !== ""
91
+ );
92
+ const adjustments = (adjustmentPayments ?? []).filter(
93
+ (adjustment) => isAvailableMoney(adjustment.amount)
94
+ );
95
+ const hasSummary = identityRows.length > 0 || paymentRows.length > 0 || Boolean(singleDelivery) || multiGroup;
96
+ return /* @__PURE__ */ jsxs("div", { className: "bg-muted/50 flex flex-col gap-6 rounded-lg p-6", children: [
97
+ /* @__PURE__ */ jsx("div", { children: !hasSummary ? /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mt-2 text-sm", children: labels.reviewEmptyLabel }) : /* @__PURE__ */ jsxs(Fragment, { children: [
98
+ identityRows.length > 0 ? /* @__PURE__ */ jsx("dl", { className: "mt-4 flex flex-col gap-4 text-sm", children: identityRows.map((row) => /* @__PURE__ */ jsxs("div", { children: [
99
+ /* @__PURE__ */ jsxs("dt", { className: "inline font-medium", children: [
100
+ row.label,
101
+ ": "
102
+ ] }),
103
+ /* @__PURE__ */ jsx("dd", { className: "inline", children: row.value })
104
+ ] }, row.label)) }) : null,
105
+ multiGroup ? /* @__PURE__ */ jsxs("div", { className: "mt-4", children: [
106
+ /* @__PURE__ */ jsx("h3", { className: "font-medium", children: labels.reviewDeliveryGroupsLabel }),
107
+ /* @__PURE__ */ jsx("ol", { className: "mt-3 flex flex-col gap-3", children: groups.map((group, index) => {
108
+ const selected = group.options.find(
109
+ (option) => option.id === group.selectedOptionId
110
+ );
111
+ const groupItems = membership?.get(group.id) ?? [];
112
+ return /* @__PURE__ */ jsxs(
113
+ "li",
114
+ {
115
+ className: "bg-background/60 rounded-md border p-4 text-sm",
116
+ "data-checkout-review-group": group.id,
117
+ children: [
118
+ /* @__PURE__ */ jsx("h4", { className: "font-medium", children: groupHeading(labels, group, index, groups.length) }),
119
+ selected ? /* @__PURE__ */ jsxs("div", { className: "mt-2 flex flex-wrap items-baseline justify-between gap-2", children: [
120
+ /* @__PURE__ */ jsx("span", { children: selected.name }),
121
+ selected.estimatedDays ? /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-xs", children: selected.estimatedDays }) : null,
122
+ isAvailableMoney(selected.price) ? /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: formatMoney(selected.price, formatMoneyProp) }) : null
123
+ ] }) : /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mt-2 text-sm", children: group.unavailableReason ?? labels.groupUnavailableLabel }),
124
+ membership && groupItems.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "mt-3", children: [
125
+ /* @__PURE__ */ jsx("h5", { className: "text-muted-foreground text-xs font-medium", children: labels.reviewGroupItemsLabel }),
126
+ /* @__PURE__ */ jsx("ul", { className: "mt-1 flex flex-col gap-1", children: groupItems.map(({ line, quantity, showLineTotal }, itemIndex) => /* @__PURE__ */ jsxs(
127
+ "li",
128
+ {
129
+ className: "flex items-center justify-between gap-3",
130
+ children: [
131
+ /* @__PURE__ */ jsxs("span", { children: [
132
+ line.name,
133
+ " \xD7 ",
134
+ quantity
135
+ ] }),
136
+ showLineTotal && isAvailableMoney(line.lineTotal) ? /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: formatMoney(line.lineTotal, formatMoneyProp) }) : null
137
+ ]
138
+ },
139
+ `${group.id}-${String(line.id)}-${itemIndex}`
140
+ )) })
141
+ ] }) : null
142
+ ]
143
+ },
144
+ group.id
145
+ );
146
+ }) })
147
+ ] }) : singleDelivery ? /* @__PURE__ */ jsx("dl", { className: "mt-4 flex flex-col gap-4 text-sm", children: /* @__PURE__ */ jsxs("div", { children: [
148
+ /* @__PURE__ */ jsxs("dt", { className: "inline font-medium", children: [
149
+ labels.reviewShippingLabel,
150
+ ": "
151
+ ] }),
152
+ /* @__PURE__ */ jsx("dd", { className: "inline", children: singleDelivery })
153
+ ] }) }) : null,
154
+ paymentRows.length > 0 ? /* @__PURE__ */ jsx("dl", { className: "mt-4 flex flex-col gap-4 text-sm", children: paymentRows.map((row) => /* @__PURE__ */ jsxs("div", { children: [
155
+ /* @__PURE__ */ jsxs("dt", { className: "inline font-medium", children: [
156
+ row.label,
157
+ ": "
158
+ ] }),
159
+ /* @__PURE__ */ jsx("dd", { className: "inline", children: row.value })
160
+ ] }, row.label)) }) : null
161
+ ] }) }),
162
+ adjustments.length > 0 ? /* @__PURE__ */ jsxs("div", { children: [
163
+ /* @__PURE__ */ jsx("h3", { className: "font-medium", children: labels.reviewAdjustmentsLabel }),
164
+ /* @__PURE__ */ jsx("dl", { className: "mt-2 flex flex-col gap-2 text-sm", children: adjustments.map((adjustment) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
165
+ /* @__PURE__ */ jsx("dt", { children: adjustment.label }),
166
+ /* @__PURE__ */ jsx("dd", { className: "tabular-nums", children: formatMoney(adjustment.amount, formatMoneyProp) })
167
+ ] }, adjustment.id)) })
168
+ ] }) : null,
169
+ orderSummary?.items.length ? /* @__PURE__ */ jsxs("div", { children: [
170
+ showFlatLines ? /* @__PURE__ */ jsxs(Fragment, { children: [
171
+ /* @__PURE__ */ jsx("h3", { className: "font-medium", children: labels.reviewLinesLabel }),
172
+ /* @__PURE__ */ jsx("dl", { className: "mt-2 flex flex-col gap-2 text-sm", children: orderSummary.items.map((item) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
173
+ /* @__PURE__ */ jsxs("dt", { children: [
174
+ item.name,
175
+ " \xD7 ",
176
+ item.quantity
177
+ ] }),
178
+ /* @__PURE__ */ jsx("dd", { className: "tabular-nums", children: isAvailableMoney(item.lineTotal) ? formatMoney(item.lineTotal, formatMoneyProp) : labels.amountUnavailableLabel })
179
+ ] }, String(item.id))) })
180
+ ] }) : null,
181
+ isAvailableMoney(orderSummary.totals?.total) ? /* @__PURE__ */ jsxs("dl", { className: "mt-2 flex items-center justify-between gap-3 border-t pt-2 text-sm font-medium", children: [
182
+ /* @__PURE__ */ jsx("dt", { children: labels.totalLabel }),
183
+ /* @__PURE__ */ jsx("dd", { className: "tabular-nums", children: formatMoney(orderSummary.totals.total, formatMoneyProp) })
184
+ ] }) : null
185
+ ] }) : null
35
186
  ] });
36
187
  }
37
188
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-review-step.tsx"],"sourcesContent":["'use client'\n\nimport type { PaymentMethod } from '@thorprovider/types'\nimport type { CheckoutLabels, CheckoutShippingOption, CheckoutValues } from './checkout'\n\nexport interface CheckoutReviewStepProps {\n values: CheckoutValues\n labels: CheckoutLabels\n selectedShippingOptionId?: string\n shippingOptions?: CheckoutShippingOption[]\n paymentMethods?: PaymentMethod[]\n}\n\nexport function CheckoutReviewStep({\n values,\n labels,\n selectedShippingOptionId,\n shippingOptions,\n paymentMethods,\n}: CheckoutReviewStepProps) {\n const shippingName = shippingOptions?.find(\n (method) => method.id === selectedShippingOptionId,\n )?.name\n const paymentName = paymentMethods?.find((method) => method.id === values.paymentMethod)?.name\n\n const shipTo = [\n [values.firstName, values.lastName].filter(Boolean).join(' '),\n values.address,\n [values.city, values.state, values.zipCode].filter(Boolean).join(' '),\n values.country,\n ]\n .filter(Boolean)\n .join(', ')\n\n const rows = [\n { label: labels.reviewContactLabel, value: values.email },\n { label: labels.reviewShipToLabel, value: shipTo },\n { label: labels.reviewPaymentLabel, value: paymentName ?? '' },\n { label: labels.reviewShippingLabel, value: shippingName ?? '' },\n ].filter((row) => row.value.trim() !== '')\n\n return (\n <div className=\"bg-muted/50 rounded-lg p-6\">\n <h3 className=\"mb-4 font-medium\">{labels.reviewHeading}</h3>\n {rows.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">{labels.reviewEmptyLabel}</p>\n ) : (\n <dl className=\"flex flex-col gap-4 text-sm\">\n {rows.map((row) => (\n <div key={row.label}>\n <dt className=\"inline font-medium\">{row.label}: </dt>\n <dd className=\"inline\">{row.value}</dd>\n </div>\n ))}\n </dl>\n )}\n </div>\n )\n}\n"],"mappings":";AA2CM,cAOQ,YAPR;AA9BC,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,eAAe,iBAAiB;AAAA,IACpC,CAAC,WAAW,OAAO,OAAO;AAAA,EAC5B,GAAG;AACH,QAAM,cAAc,gBAAgB,KAAK,CAAC,WAAW,OAAO,OAAO,OAAO,aAAa,GAAG;AAE1F,QAAM,SAAS;AAAA,IACb,CAAC,OAAO,WAAW,OAAO,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC5D,OAAO;AAAA,IACP,CAAC,OAAO,MAAM,OAAO,OAAO,OAAO,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IACpE,OAAO;AAAA,EACT,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAEZ,QAAM,OAAO;AAAA,IACX,EAAE,OAAO,OAAO,oBAAoB,OAAO,OAAO,MAAM;AAAA,IACxD,EAAE,OAAO,OAAO,mBAAmB,OAAO,OAAO;AAAA,IACjD,EAAE,OAAO,OAAO,oBAAoB,OAAO,eAAe,GAAG;AAAA,IAC7D,EAAE,OAAO,OAAO,qBAAqB,OAAO,gBAAgB,GAAG;AAAA,EACjE,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM,KAAK,MAAM,EAAE;AAEzC,SACE,qBAAC,SAAI,WAAU,8BACb;AAAA,wBAAC,QAAG,WAAU,oBAAoB,iBAAO,eAAc;AAAA,IACtD,KAAK,WAAW,IACf,oBAAC,OAAE,WAAU,iCAAiC,iBAAO,kBAAiB,IAEtE,oBAAC,QAAG,WAAU,+BACX,eAAK,IAAI,CAAC,QACT,qBAAC,SACC;AAAA,2BAAC,QAAG,WAAU,sBAAsB;AAAA,YAAI;AAAA,QAAM;AAAA,SAAE;AAAA,MAChD,oBAAC,QAAG,WAAU,UAAU,cAAI,OAAM;AAAA,SAF1B,IAAI,KAGd,CACD,GACH;AAAA,KAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-review-step.tsx"],"sourcesContent":["'use client'\n\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport type {\n CheckoutAddressValues,\n CheckoutAdjustmentPayment,\n CheckoutContactValues,\n CheckoutShippingGroup,\n Money,\n PaymentMethod,\n} from '@thorprovider/types'\nimport type {\n CheckoutLabels,\n CheckoutOrderLine,\n CheckoutOrderSummary,\n} from './checkout'\n\nexport interface CheckoutReviewStepProps {\n contact: CheckoutContactValues\n shippingAddress: CheckoutAddressValues\n billingAddress?: CheckoutAddressValues\n sameAsShipping: boolean\n shippingGroups?: CheckoutShippingGroup[]\n paymentMethod: string\n paymentMethods?: PaymentMethod[]\n adjustmentPayments?: CheckoutAdjustmentPayment[]\n orderSummary?: CheckoutOrderSummary\n labels: CheckoutLabels\n formatMoney?: (money: Money) => string\n}\n\ninterface ResolvedGroupItem {\n line: CheckoutOrderLine\n quantity: number\n showLineTotal: boolean\n}\n\nfunction resolveGroupMembership(\n groups: CheckoutShippingGroup[],\n lines: CheckoutOrderLine[] | undefined,\n): Map<string, ResolvedGroupItem[]> | null {\n if (!lines?.length || groups.some((group) => !group.items?.length)) return null\n\n\n const linesById = new Map(lines.map((line) => [String(line.id), line]))\n const assigned = new Map<string, number>()\n const itemsByGroup = new Map<string, ResolvedGroupItem[]>()\n\n for (const group of groups) {\n const groupItems: ResolvedGroupItem[] = []\n for (const item of group.items ?? []) {\n const line = linesById.get(item.lineId)\n if (!line) return null\n\n const quantity = item.quantity ?? line.quantity\n if (!Number.isInteger(quantity) || quantity <= 0 || quantity > line.quantity) {\n return null\n }\n\n assigned.set(item.lineId, (assigned.get(item.lineId) ?? 0) + quantity)\n groupItems.push({\n line,\n quantity,\n showLineTotal: quantity === line.quantity,\n })\n }\n itemsByGroup.set(group.id, groupItems)\n }\n\n for (const line of lines) {\n if ((assigned.get(String(line.id)) ?? 0) !== line.quantity) return null\n }\n\n return itemsByGroup\n}\n\nfunction formatAddress(address: CheckoutAddressValues): string {\n return [\n [address.firstName, address.lastName].filter(Boolean).join(' '),\n address.company,\n address.address1,\n address.address2,\n [address.city, address.province, address.postalCode].filter(Boolean).join(' '),\n address.countryCode,\n address.phone,\n ]\n .filter(Boolean)\n .join(', ')\n}\n\nfunction groupHeading(\n labels: CheckoutLabels,\n group: CheckoutShippingGroup,\n index: number,\n total: number,\n): string {\n const sequence = labels.reviewGroupLabel\n .replace('{n}', String(index + 1))\n .replace('{total}', String(total))\n\n return group.label ? `${sequence} · ${group.label}` : sequence\n}\n\nfunction deliveryText(\n group: CheckoutShippingGroup,\n labels: CheckoutLabels,\n formatMoneyProp?: (money: Money) => string,\n): string {\n const selected = group.options.find((option) => option.id === group.selectedOptionId)\n if (!selected) return ''\n\n const details = [selected.name]\n if (selected.estimatedDays) details.push(selected.estimatedDays)\n if (isAvailableMoney(selected.price)) {\n const price = formatMoney(selected.price, formatMoneyProp)\n if (price) details.push(price)\n }\n\n return group.label ? `${group.label}: ${details.join(' · ')}` : details.join(' · ')\n}\n\nexport function CheckoutReviewStep({\n contact,\n shippingAddress,\n billingAddress,\n sameAsShipping,\n shippingGroups,\n paymentMethod,\n paymentMethods,\n adjustmentPayments,\n orderSummary,\n labels,\n formatMoney: formatMoneyProp,\n}: CheckoutReviewStepProps) {\n const groups = shippingGroups ?? []\n const multiGroup = groups.length > 1\n const membership = multiGroup ? resolveGroupMembership(groups, orderSummary?.items) : null\n const showFlatLines = !multiGroup || !membership\n const paymentName = paymentMethods?.find((method) => method.id === paymentMethod)?.name\n const contactName = [contact.firstName, contact.lastName].filter(Boolean).join(' ')\n const singleDelivery = !multiGroup && groups[0]\n ? deliveryText(groups[0], labels, formatMoneyProp)\n : ''\n\n const identityRows = [\n {\n label: labels.reviewContactLabel,\n value: [contactName, contact.email, contact.phone].filter(Boolean).join(', '),\n },\n { label: labels.reviewShipToLabel, value: formatAddress(shippingAddress) },\n {\n label: labels.reviewBillingLabel,\n value: sameAsShipping\n ? labels.reviewSameAsShippingLabel\n : billingAddress\n ? formatAddress(billingAddress)\n : '',\n },\n ].filter((row) => row.value.trim() !== '')\n\n const paymentRows = [{ label: labels.reviewPaymentLabel, value: paymentName ?? '' }].filter(\n (row) => row.value.trim() !== '',\n )\n\n const adjustments = (adjustmentPayments ?? []).filter((adjustment) =>\n isAvailableMoney(adjustment.amount),\n )\n\n const hasSummary =\n identityRows.length > 0 || paymentRows.length > 0 || Boolean(singleDelivery) || multiGroup\n\n return (\n <div className=\"bg-muted/50 flex flex-col gap-6 rounded-lg p-6\">\n <div>\n {!hasSummary ? (\n <p className=\"text-muted-foreground mt-2 text-sm\">{labels.reviewEmptyLabel}</p>\n ) : (\n <>\n {identityRows.length > 0 ? (\n <dl className=\"mt-4 flex flex-col gap-4 text-sm\">\n {identityRows.map((row) => (\n <div key={row.label}>\n <dt className=\"inline font-medium\">{row.label}: </dt>\n <dd className=\"inline\">{row.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n\n {multiGroup ? (\n <div className=\"mt-4\">\n <h3 className=\"font-medium\">{labels.reviewDeliveryGroupsLabel}</h3>\n <ol className=\"mt-3 flex flex-col gap-3\">\n {groups.map((group, index) => {\n const selected = group.options.find(\n (option) => option.id === group.selectedOptionId,\n )\n const groupItems = membership?.get(group.id) ?? []\n\n return (\n <li\n key={group.id}\n className=\"bg-background/60 rounded-md border p-4 text-sm\"\n data-checkout-review-group={group.id}\n >\n <h4 className=\"font-medium\">\n {groupHeading(labels, group, index, groups.length)}\n </h4>\n\n {selected ? (\n <div className=\"mt-2 flex flex-wrap items-baseline justify-between gap-2\">\n <span>{selected.name}</span>\n {selected.estimatedDays ? (\n <span className=\"text-muted-foreground text-xs\">\n {selected.estimatedDays}\n </span>\n ) : null}\n {isAvailableMoney(selected.price) ? (\n <span className=\"tabular-nums\">\n {formatMoney(selected.price, formatMoneyProp)}\n </span>\n ) : null}\n </div>\n ) : (\n <p className=\"text-muted-foreground mt-2 text-sm\">\n {group.unavailableReason ?? labels.groupUnavailableLabel}\n </p>\n )}\n\n {membership && groupItems.length > 0 ? (\n <div className=\"mt-3\">\n <h5 className=\"text-muted-foreground text-xs font-medium\">\n {labels.reviewGroupItemsLabel}\n </h5>\n <ul className=\"mt-1 flex flex-col gap-1\">\n {groupItems.map(({ line, quantity, showLineTotal }, itemIndex) => (\n <li\n key={`${group.id}-${String(line.id)}-${itemIndex}`}\n className=\"flex items-center justify-between gap-3\"\n >\n <span>\n {line.name} × {quantity}\n </span>\n {showLineTotal && isAvailableMoney(line.lineTotal) ? (\n <span className=\"tabular-nums\">\n {formatMoney(line.lineTotal, formatMoneyProp)}\n </span>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </li>\n )\n })}\n </ol>\n </div>\n ) : singleDelivery ? (\n <dl className=\"mt-4 flex flex-col gap-4 text-sm\">\n <div>\n <dt className=\"inline font-medium\">{labels.reviewShippingLabel}: </dt>\n <dd className=\"inline\">{singleDelivery}</dd>\n </div>\n </dl>\n ) : null}\n\n {paymentRows.length > 0 ? (\n <dl className=\"mt-4 flex flex-col gap-4 text-sm\">\n {paymentRows.map((row) => (\n <div key={row.label}>\n <dt className=\"inline font-medium\">{row.label}: </dt>\n <dd className=\"inline\">{row.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n </>\n )}\n </div>\n\n {adjustments.length > 0 ? (\n <div>\n <h3 className=\"font-medium\">{labels.reviewAdjustmentsLabel}</h3>\n <dl className=\"mt-2 flex flex-col gap-2 text-sm\">\n {adjustments.map((adjustment) => (\n <div key={adjustment.id} className=\"flex items-center justify-between gap-3\">\n <dt>{adjustment.label}</dt>\n <dd className=\"tabular-nums\">\n {formatMoney(adjustment.amount, formatMoneyProp)}\n </dd>\n </div>\n ))}\n </dl>\n </div>\n ) : null}\n\n {orderSummary?.items.length ? (\n <div>\n {showFlatLines ? (\n <>\n <h3 className=\"font-medium\">{labels.reviewLinesLabel}</h3>\n <dl className=\"mt-2 flex flex-col gap-2 text-sm\">\n {orderSummary.items.map((item) => (\n <div key={String(item.id)} className=\"flex items-center justify-between gap-3\">\n <dt>\n {item.name} × {item.quantity}\n </dt>\n <dd className=\"tabular-nums\">\n {isAvailableMoney(item.lineTotal)\n ? formatMoney(item.lineTotal, formatMoneyProp)\n : labels.amountUnavailableLabel}\n </dd>\n </div>\n ))}\n </dl>\n </>\n ) : null}\n {isAvailableMoney(orderSummary.totals?.total) ? (\n <dl className=\"mt-2 flex items-center justify-between gap-3 border-t pt-2 text-sm font-medium\">\n <dt>{labels.totalLabel}</dt>\n <dd className=\"tabular-nums\">\n {formatMoney(orderSummary.totals.total, formatMoneyProp)}\n </dd>\n </dl>\n ) : null}\n </div>\n ) : null}\n </div>\n )\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,20 @@
1
+ import type { CheckoutSavedAddress } from '@thorprovider/types';
2
+ import type { CheckoutLabels, CheckoutSavedAddressState } from './checkout';
3
+ export interface CheckoutSavedAddressesProps {
4
+ savedAddresses: CheckoutSavedAddress[];
5
+ selectedId?: string;
6
+ state?: CheckoutSavedAddressState;
7
+ labels: CheckoutLabels;
8
+ countryLabel: (countryCode: string) => string;
9
+ onSelect: (id: string) => void;
10
+ onDelete?: (id: string) => void;
11
+ }
12
+ /**
13
+ * The saved-address book as selectable cards. The radio and the two actions are
14
+ * siblings: the label contains only the address summary, so activating Use or
15
+ * Delete never selects the address as a side effect. Delete is a two-step
16
+ * inline confirmation; the host owns the mutation and the refreshed list, so
17
+ * the card is never removed optimistically.
18
+ */
19
+ export declare function CheckoutSavedAddresses({ savedAddresses, selectedId, state, labels, countryLabel, onSelect, onDelete, }: CheckoutSavedAddressesProps): import("react").JSX.Element | null;
20
+ //# sourceMappingURL=checkout-saved-addresses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout-saved-addresses.d.ts","sourceRoot":"","sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-saved-addresses.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAyB,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAE3E,MAAM,WAAW,2BAA2B;IAC1C,cAAc,EAAE,oBAAoB,EAAE,CAAA;IACtC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,yBAAyB,CAAA;IACjC,MAAM,EAAE,cAAc,CAAA;IACtB,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAA;IAC7C,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC;AAcD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,cAAc,EACd,UAAU,EACV,KAAK,EACL,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,QAAQ,GACT,EAAE,2BAA2B,sCAsK7B"}
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var checkout_saved_addresses_exports = {};
21
+ __export(checkout_saved_addresses_exports, {
22
+ CheckoutSavedAddresses: () => CheckoutSavedAddresses
23
+ });
24
+ module.exports = __toCommonJS(checkout_saved_addresses_exports);
25
+ var import_jsx_runtime = require("react/jsx-runtime");
26
+ var import_react = require("react");
27
+ var import_badge = require("../../../ui/badge.js");
28
+ var import_button = require("../../../ui/button.js");
29
+ var import_field = require("../../../ui/field.js");
30
+ var import_radio_group = require("../../../ui/radio-group.js");
31
+ var import_checkout_id_context = require("./checkout-id-context.js");
32
+ function recipientName(address) {
33
+ return [address.firstName, address.lastName].filter(Boolean).join(" ");
34
+ }
35
+ function addressLocality(address) {
36
+ return [address.city, address.province, address.postalCode].filter(Boolean).join(", ");
37
+ }
38
+ function focusEntry(id) {
39
+ document.getElementById(id)?.focus();
40
+ }
41
+ function CheckoutSavedAddresses({
42
+ savedAddresses,
43
+ selectedId,
44
+ state,
45
+ labels,
46
+ countryLabel,
47
+ onSelect,
48
+ onDelete
49
+ }) {
50
+ const checkoutId = (0, import_checkout_id_context.useCheckoutIds)();
51
+ const [confirmingId, setConfirmingId] = (0, import_react.useState)(null);
52
+ const pendingDelete = (0, import_react.useRef)(null);
53
+ (0, import_react.useEffect)(() => {
54
+ const pending = pendingDelete.current;
55
+ if (!pending) return;
56
+ const stillPresent = savedAddresses.some((entry) => entry.id === pending.deletedId);
57
+ if (stillPresent) {
58
+ if (state?.error?.id === pending.deletedId) {
59
+ focusEntry(checkoutId(`checkout-saved-address-${pending.deletedId}`));
60
+ pendingDelete.current = null;
61
+ }
62
+ return;
63
+ }
64
+ if (pending.nextId) {
65
+ focusEntry(checkoutId(`checkout-saved-address-${pending.nextId}`));
66
+ } else {
67
+ document.getElementById(checkoutId("checkout-add-address"))?.focus();
68
+ }
69
+ pendingDelete.current = null;
70
+ }, [checkoutId, savedAddresses, state?.error?.id]);
71
+ if (savedAddresses.length === 0) return null;
72
+ const confirmDelete = (id) => {
73
+ const index = savedAddresses.findIndex((entry) => entry.id === id);
74
+ const next = savedAddresses[index + 1] ?? savedAddresses[index - 1];
75
+ pendingDelete.current = { deletedId: id, nextId: next?.id };
76
+ setConfirmingId(null);
77
+ onDelete?.(id);
78
+ };
79
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.FieldSet, { "aria-labelledby": checkoutId("checkout-saved-addresses-heading"), children: [
80
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldLegend, { id: checkoutId("checkout-saved-addresses-heading"), children: labels.savedAddressesLabel }),
81
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
82
+ import_radio_group.RadioGroup,
83
+ {
84
+ value: selectedId ?? "",
85
+ onValueChange: (value) => value && onSelect(String(value)),
86
+ className: "grid grid-cols-1 gap-3",
87
+ children: savedAddresses.map((saved) => {
88
+ const inputId = checkoutId(`checkout-saved-address-${saved.id}`);
89
+ const pending = state?.pendingId === saved.id;
90
+ const error = state?.error?.id === saved.id ? state.error : void 0;
91
+ const confirming = confirmingId === saved.id;
92
+ const name = recipientName(saved.address);
93
+ const locality = addressLocality(saved.address);
94
+ const title = saved.label?.trim() || name || saved.address.address1 || labels.savedAddressesLabel;
95
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
96
+ "div",
97
+ {
98
+ className: "flex flex-col gap-2",
99
+ "data-checkout-saved-address": saved.id,
100
+ "aria-busy": pending || void 0,
101
+ children: [
102
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-3 rounded-lg border p-4 sm:flex-row sm:items-start sm:justify-between", children: [
103
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
104
+ "label",
105
+ {
106
+ htmlFor: inputId,
107
+ className: "flex min-w-0 flex-1 flex-col gap-0.5 text-left text-sm font-medium",
108
+ children: [
109
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "flex flex-wrap items-center gap-2", children: [
110
+ title,
111
+ saved.label && name ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground text-xs font-normal", children: name }) : null,
112
+ saved.isDefaultShipping ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_badge.Badge, { variant: "secondary", className: "text-xs", children: labels.defaultAddressLabel }) : null
113
+ ] }),
114
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground text-sm font-normal", children: saved.address.address1 }),
115
+ saved.address.address2 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground text-sm font-normal", children: saved.address.address2 }) : null,
116
+ locality ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground text-sm font-normal", children: locality }) : null,
117
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground text-sm font-normal", children: countryLabel(saved.address.countryCode) })
118
+ ]
119
+ }
120
+ ),
121
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-wrap items-center gap-2 sm:shrink-0", children: [
122
+ selectedId !== saved.id ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
123
+ import_button.Button,
124
+ {
125
+ type: "button",
126
+ variant: "outline",
127
+ size: "sm",
128
+ disabled: pending,
129
+ "aria-label": `${labels.useAddressLabel}: ${title}`,
130
+ onClick: () => onSelect(saved.id),
131
+ children: labels.useAddressLabel
132
+ }
133
+ ) : null,
134
+ onDelete ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
135
+ import_button.Button,
136
+ {
137
+ type: "button",
138
+ variant: "ghost",
139
+ size: "sm",
140
+ disabled: pending,
141
+ "aria-label": `${labels.deleteAddressLabel}: ${title}`,
142
+ onClick: () => setConfirmingId(saved.id),
143
+ children: pending ? labels.deletingAddressLabel : labels.deleteAddressLabel
144
+ }
145
+ ) : null,
146
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radio_group.RadioGroupItem, { value: saved.id, id: inputId, disabled: pending })
147
+ ] })
148
+ ] }),
149
+ confirming ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
150
+ "div",
151
+ {
152
+ className: "flex flex-col gap-2 rounded-md border border-destructive/40 p-3",
153
+ role: "group",
154
+ "aria-label": labels.deleteAddressConfirmLabel,
155
+ children: [
156
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-medium", children: labels.deleteAddressConfirmLabel }),
157
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground text-xs", children: labels.deleteAddressHintLabel }),
158
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-wrap gap-2", children: [
159
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
160
+ import_button.Button,
161
+ {
162
+ type: "button",
163
+ variant: "destructive",
164
+ size: "sm",
165
+ disabled: pending,
166
+ onClick: () => confirmDelete(saved.id),
167
+ children: pending ? labels.deletingAddressLabel : labels.deleteAddressLabel
168
+ }
169
+ ),
170
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
171
+ import_button.Button,
172
+ {
173
+ type: "button",
174
+ variant: "outline",
175
+ size: "sm",
176
+ disabled: pending,
177
+ onClick: () => setConfirmingId(null),
178
+ children: labels.cancelAddressLabel
179
+ }
180
+ )
181
+ ] })
182
+ ]
183
+ }
184
+ ) : null,
185
+ error ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-destructive text-sm", role: "alert", children: error.message || labels.addressDeleteErrorLabel }) : null
186
+ ]
187
+ },
188
+ saved.id
189
+ );
190
+ })
191
+ }
192
+ )
193
+ ] });
194
+ }
195
+ // Annotate the CommonJS export names for ESM import in node:
196
+ 0 && (module.exports = {
197
+ CheckoutSavedAddresses
198
+ });
199
+ //# sourceMappingURL=checkout-saved-addresses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-saved-addresses.tsx"],"sourcesContent":["'use client'\n\nimport { useEffect, useRef, useState } from 'react'\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { FieldLegend, FieldSet } from '../../../ui/field'\nimport { RadioGroup, RadioGroupItem } from '../../../ui/radio-group'\nimport { useCheckoutIds } from './checkout-id-context'\nimport type { CheckoutAddressValues, CheckoutSavedAddress } from '@thorprovider/types'\nimport type { CheckoutLabels, CheckoutSavedAddressState } from './checkout'\n\nexport interface CheckoutSavedAddressesProps {\n savedAddresses: CheckoutSavedAddress[]\n selectedId?: string\n state?: CheckoutSavedAddressState\n labels: CheckoutLabels\n countryLabel: (countryCode: string) => string\n onSelect: (id: string) => void\n onDelete?: (id: string) => void\n}\n\nfunction recipientName(address: CheckoutAddressValues): string {\n return [address.firstName, address.lastName].filter(Boolean).join(' ')\n}\n\nfunction addressLocality(address: CheckoutAddressValues): string {\n return [address.city, address.province, address.postalCode].filter(Boolean).join(', ')\n}\n\nfunction focusEntry(id: string): void {\n document.getElementById(id)?.focus()\n}\n\n/**\n * The saved-address book as selectable cards. The radio and the two actions are\n * siblings: the label contains only the address summary, so activating Use or\n * Delete never selects the address as a side effect. Delete is a two-step\n * inline confirmation; the host owns the mutation and the refreshed list, so\n * the card is never removed optimistically.\n */\nexport function CheckoutSavedAddresses({\n savedAddresses,\n selectedId,\n state,\n labels,\n countryLabel,\n onSelect,\n onDelete,\n}: CheckoutSavedAddressesProps) {\n const checkoutId = useCheckoutIds()\n const [confirmingId, setConfirmingId] = useState<string | null>(null)\n const pendingDelete = useRef<{ deletedId: string; nextId?: string } | null>(null)\n\n useEffect(() => {\n const pending = pendingDelete.current\n if (!pending) return\n\n const stillPresent = savedAddresses.some((entry) => entry.id === pending.deletedId)\n if (stillPresent) {\n if (state?.error?.id === pending.deletedId) {\n focusEntry(checkoutId(`checkout-saved-address-${pending.deletedId}`))\n pendingDelete.current = null\n }\n return\n }\n\n if (pending.nextId) {\n focusEntry(checkoutId(`checkout-saved-address-${pending.nextId}`))\n } else {\n document.getElementById(checkoutId('checkout-add-address'))?.focus()\n }\n pendingDelete.current = null\n }, [checkoutId, savedAddresses, state?.error?.id])\n\n if (savedAddresses.length === 0) return null\n\n const confirmDelete = (id: string) => {\n const index = savedAddresses.findIndex((entry) => entry.id === id)\n const next = savedAddresses[index + 1] ?? savedAddresses[index - 1]\n pendingDelete.current = { deletedId: id, nextId: next?.id }\n setConfirmingId(null)\n onDelete?.(id)\n }\n\n return (\n <FieldSet aria-labelledby={checkoutId('checkout-saved-addresses-heading')}>\n <FieldLegend id={checkoutId('checkout-saved-addresses-heading')}>\n {labels.savedAddressesLabel}\n </FieldLegend>\n <RadioGroup\n value={selectedId ?? ''}\n onValueChange={(value) => value && onSelect(String(value))}\n className=\"grid grid-cols-1 gap-3\"\n >\n {savedAddresses.map((saved) => {\n const inputId = checkoutId(`checkout-saved-address-${saved.id}`)\n const pending = state?.pendingId === saved.id\n const error = state?.error?.id === saved.id ? state.error : undefined\n const confirming = confirmingId === saved.id\n const name = recipientName(saved.address)\n const locality = addressLocality(saved.address)\n const title =\n saved.label?.trim() || name || saved.address.address1 || labels.savedAddressesLabel\n\n return (\n <div\n key={saved.id}\n className=\"flex flex-col gap-2\"\n data-checkout-saved-address={saved.id}\n aria-busy={pending || undefined}\n >\n <div className=\"flex flex-col gap-3 rounded-lg border p-4 sm:flex-row sm:items-start sm:justify-between\">\n <label\n htmlFor={inputId}\n className=\"flex min-w-0 flex-1 flex-col gap-0.5 text-left text-sm font-medium\"\n >\n <span className=\"flex flex-wrap items-center gap-2\">\n {title}\n {saved.label && name ? (\n <span className=\"text-muted-foreground text-xs font-normal\">{name}</span>\n ) : null}\n {saved.isDefaultShipping ? (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {labels.defaultAddressLabel}\n </Badge>\n ) : null}\n </span>\n <span className=\"text-muted-foreground text-sm font-normal\">\n {saved.address.address1}\n </span>\n {saved.address.address2 ? (\n <span className=\"text-muted-foreground text-sm font-normal\">\n {saved.address.address2}\n </span>\n ) : null}\n {locality ? (\n <span className=\"text-muted-foreground text-sm font-normal\">{locality}</span>\n ) : null}\n <span className=\"text-muted-foreground text-sm font-normal\">\n {countryLabel(saved.address.countryCode)}\n </span>\n </label>\n\n <div className=\"flex flex-wrap items-center gap-2 sm:shrink-0\">\n {selectedId !== saved.id ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={pending}\n aria-label={`${labels.useAddressLabel}: ${title}`}\n onClick={() => onSelect(saved.id)}\n >\n {labels.useAddressLabel}\n </Button>\n ) : null}\n {onDelete ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={pending}\n aria-label={`${labels.deleteAddressLabel}: ${title}`}\n onClick={() => setConfirmingId(saved.id)}\n >\n {pending ? labels.deletingAddressLabel : labels.deleteAddressLabel}\n </Button>\n ) : null}\n <RadioGroupItem value={saved.id} id={inputId} disabled={pending} />\n </div>\n </div>\n\n {confirming ? (\n <div\n className=\"flex flex-col gap-2 rounded-md border border-destructive/40 p-3\"\n role=\"group\"\n aria-label={labels.deleteAddressConfirmLabel}\n >\n <p className=\"text-sm font-medium\">{labels.deleteAddressConfirmLabel}</p>\n <p className=\"text-muted-foreground text-xs\">{labels.deleteAddressHintLabel}</p>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"sm\"\n disabled={pending}\n onClick={() => confirmDelete(saved.id)}\n >\n {pending ? labels.deletingAddressLabel : labels.deleteAddressLabel}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={pending}\n onClick={() => setConfirmingId(null)}\n >\n {labels.cancelAddressLabel}\n </Button>\n </div>\n </div>\n ) : null}\n\n {error ? (\n <p className=\"text-destructive text-sm\" role=\"alert\">\n {error.message || labels.addressDeleteErrorLabel}\n </p>\n ) : null}\n </div>\n )\n })}\n </RadioGroup>\n </FieldSet>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAsFM;AApFN,mBAA4C;AAC5C,mBAAsB;AACtB,oBAAuB;AACvB,mBAAsC;AACtC,yBAA2C;AAC3C,iCAA+B;AAc/B,SAAS,cAAc,SAAwC;AAC7D,SAAO,CAAC,QAAQ,WAAW,QAAQ,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACvE;AAEA,SAAS,gBAAgB,SAAwC;AAC/D,SAAO,CAAC,QAAQ,MAAM,QAAQ,UAAU,QAAQ,UAAU,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AACvF;AAEA,SAAS,WAAW,IAAkB;AACpC,WAAS,eAAe,EAAE,GAAG,MAAM;AACrC;AASO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgC;AAC9B,QAAM,iBAAa,2CAAe;AAClC,QAAM,CAAC,cAAc,eAAe,QAAI,uBAAwB,IAAI;AACpE,QAAM,oBAAgB,qBAAsD,IAAI;AAEhF,8BAAU,MAAM;AACd,UAAM,UAAU,cAAc;AAC9B,QAAI,CAAC,QAAS;AAEd,UAAM,eAAe,eAAe,KAAK,CAAC,UAAU,MAAM,OAAO,QAAQ,SAAS;AAClF,QAAI,cAAc;AAChB,UAAI,OAAO,OAAO,OAAO,QAAQ,WAAW;AAC1C,mBAAW,WAAW,0BAA0B,QAAQ,SAAS,EAAE,CAAC;AACpE,sBAAc,UAAU;AAAA,MAC1B;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,QAAQ;AAClB,iBAAW,WAAW,0BAA0B,QAAQ,MAAM,EAAE,CAAC;AAAA,IACnE,OAAO;AACL,eAAS,eAAe,WAAW,sBAAsB,CAAC,GAAG,MAAM;AAAA,IACrE;AACA,kBAAc,UAAU;AAAA,EAC1B,GAAG,CAAC,YAAY,gBAAgB,OAAO,OAAO,EAAE,CAAC;AAEjD,MAAI,eAAe,WAAW,EAAG,QAAO;AAExC,QAAM,gBAAgB,CAAC,OAAe;AACpC,UAAM,QAAQ,eAAe,UAAU,CAAC,UAAU,MAAM,OAAO,EAAE;AACjE,UAAM,OAAO,eAAe,QAAQ,CAAC,KAAK,eAAe,QAAQ,CAAC;AAClE,kBAAc,UAAU,EAAE,WAAW,IAAI,QAAQ,MAAM,GAAG;AAC1D,oBAAgB,IAAI;AACpB,eAAW,EAAE;AAAA,EACf;AAEA,SACE,6CAAC,yBAAS,mBAAiB,WAAW,kCAAkC,GACtE;AAAA,gDAAC,4BAAY,IAAI,WAAW,kCAAkC,GAC3D,iBAAO,qBACV;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,cAAc;AAAA,QACrB,eAAe,CAAC,UAAU,SAAS,SAAS,OAAO,KAAK,CAAC;AAAA,QACzD,WAAU;AAAA,QAET,yBAAe,IAAI,CAAC,UAAU;AAC7B,gBAAM,UAAU,WAAW,0BAA0B,MAAM,EAAE,EAAE;AAC/D,gBAAM,UAAU,OAAO,cAAc,MAAM;AAC3C,gBAAM,QAAQ,OAAO,OAAO,OAAO,MAAM,KAAK,MAAM,QAAQ;AAC5D,gBAAM,aAAa,iBAAiB,MAAM;AAC1C,gBAAM,OAAO,cAAc,MAAM,OAAO;AACxC,gBAAM,WAAW,gBAAgB,MAAM,OAAO;AAC9C,gBAAM,QACJ,MAAM,OAAO,KAAK,KAAK,QAAQ,MAAM,QAAQ,YAAY,OAAO;AAElE,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA,cACV,+BAA6B,MAAM;AAAA,cACnC,aAAW,WAAW;AAAA,cAEtB;AAAA,6DAAC,SAAI,WAAU,2FACb;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAS;AAAA,sBACT,WAAU;AAAA,sBAEV;AAAA,qEAAC,UAAK,WAAU,qCACb;AAAA;AAAA,0BACA,MAAM,SAAS,OACd,4CAAC,UAAK,WAAU,6CAA6C,gBAAK,IAChE;AAAA,0BACH,MAAM,oBACL,4CAAC,sBAAM,SAAQ,aAAY,WAAU,WAClC,iBAAO,qBACV,IACE;AAAA,2BACN;AAAA,wBACA,4CAAC,UAAK,WAAU,6CACb,gBAAM,QAAQ,UACjB;AAAA,wBACC,MAAM,QAAQ,WACb,4CAAC,UAAK,WAAU,6CACb,gBAAM,QAAQ,UACjB,IACE;AAAA,wBACH,WACC,4CAAC,UAAK,WAAU,6CAA6C,oBAAS,IACpE;AAAA,wBACJ,4CAAC,UAAK,WAAU,6CACb,uBAAa,MAAM,QAAQ,WAAW,GACzC;AAAA;AAAA;AAAA,kBACF;AAAA,kBAEA,6CAAC,SAAI,WAAU,iDACZ;AAAA,mCAAe,MAAM,KACpB;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAQ;AAAA,wBACR,MAAK;AAAA,wBACL,UAAU;AAAA,wBACV,cAAY,GAAG,OAAO,eAAe,KAAK,KAAK;AAAA,wBAC/C,SAAS,MAAM,SAAS,MAAM,EAAE;AAAA,wBAE/B,iBAAO;AAAA;AAAA,oBACV,IACE;AAAA,oBACH,WACC;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAQ;AAAA,wBACR,MAAK;AAAA,wBACL,UAAU;AAAA,wBACV,cAAY,GAAG,OAAO,kBAAkB,KAAK,KAAK;AAAA,wBAClD,SAAS,MAAM,gBAAgB,MAAM,EAAE;AAAA,wBAEtC,oBAAU,OAAO,uBAAuB,OAAO;AAAA;AAAA,oBAClD,IACE;AAAA,oBACJ,4CAAC,qCAAe,OAAO,MAAM,IAAI,IAAI,SAAS,UAAU,SAAS;AAAA,qBACnE;AAAA,mBACF;AAAA,gBAEC,aACC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,MAAK;AAAA,oBACL,cAAY,OAAO;AAAA,oBAEnB;AAAA,kEAAC,OAAE,WAAU,uBAAuB,iBAAO,2BAA0B;AAAA,sBACrE,4CAAC,OAAE,WAAU,iCAAiC,iBAAO,wBAAuB;AAAA,sBAC5E,6CAAC,SAAI,WAAU,wBACb;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAK;AAAA,4BACL,SAAQ;AAAA,4BACR,MAAK;AAAA,4BACL,UAAU;AAAA,4BACV,SAAS,MAAM,cAAc,MAAM,EAAE;AAAA,4BAEpC,oBAAU,OAAO,uBAAuB,OAAO;AAAA;AAAA,wBAClD;AAAA,wBACA;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAK;AAAA,4BACL,SAAQ;AAAA,4BACR,MAAK;AAAA,4BACL,UAAU;AAAA,4BACV,SAAS,MAAM,gBAAgB,IAAI;AAAA,4BAElC,iBAAO;AAAA;AAAA,wBACV;AAAA,yBACF;AAAA;AAAA;AAAA,gBACF,IACE;AAAA,gBAEH,QACC,4CAAC,OAAE,WAAU,4BAA2B,MAAK,SAC1C,gBAAM,WAAW,OAAO,yBAC3B,IACE;AAAA;AAAA;AAAA,YArGC,MAAM;AAAA,UAsGb;AAAA,QAEJ,CAAC;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;","names":[]}