@aglyn/plugins-commerce 1.0.0-beta.231 → 1.0.0-beta.233

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 (266) hide show
  1. package/package.json +13 -13
  2. package/src/lib/components/cart-extras.d.ts +6 -0
  3. package/src/lib/components/cart-extras.js +4 -1
  4. package/src/lib/components/cart-extras.js.map +1 -1
  5. package/src/lib/components/cart-fulfillment.d.ts +117 -0
  6. package/src/lib/components/cart-fulfillment.js +367 -0
  7. package/src/lib/components/cart-fulfillment.js.map +1 -0
  8. package/src/lib/components/cart.js +52 -10
  9. package/src/lib/components/cart.js.map +1 -1
  10. package/src/lib/components/commerce-console-page.js +42 -1
  11. package/src/lib/components/commerce-console-page.js.map +1 -1
  12. package/src/lib/components/console/catalog-organization-card.component.js +1 -0
  13. package/src/lib/components/console/catalog-organization-card.component.js.map +1 -1
  14. package/src/lib/components/console/host-orders-card.component.js +42 -11
  15. package/src/lib/components/console/host-orders-card.component.js.map +1 -1
  16. package/src/lib/components/console/local-delivery-settings-card.component.d.ts +37 -0
  17. package/src/lib/components/console/local-delivery-settings-card.component.js +542 -0
  18. package/src/lib/components/console/local-delivery-settings-card.component.js.map +1 -0
  19. package/src/lib/components/console/locations-card.component.js +177 -3
  20. package/src/lib/components/console/locations-card.component.js.map +1 -1
  21. package/src/lib/components/console/order-detail-dialog.component.js +10 -0
  22. package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
  23. package/src/lib/components/console/order-local-fulfillment-panel.component.d.ts +44 -0
  24. package/src/lib/components/console/order-local-fulfillment-panel.component.js +265 -0
  25. package/src/lib/components/console/order-local-fulfillment-panel.component.js.map +1 -0
  26. package/src/lib/components/console/order-offline-notice.component.d.ts +12 -0
  27. package/src/lib/components/console/order-offline-notice.component.js +53 -0
  28. package/src/lib/components/console/order-offline-notice.component.js.map +1 -0
  29. package/src/lib/components/console/pickup-delivery-queue-card.component.d.ts +35 -0
  30. package/src/lib/components/console/pickup-delivery-queue-card.component.js +222 -0
  31. package/src/lib/components/console/pickup-delivery-queue-card.component.js.map +1 -0
  32. package/src/lib/components/console/pos/pos-api.d.ts +24 -1
  33. package/src/lib/components/console/pos/pos-api.js +13 -0
  34. package/src/lib/components/console/pos/pos-api.js.map +1 -1
  35. package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +12 -0
  36. package/src/lib/components/console/pos/pos-item-dialog.component.js +10 -8
  37. package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -1
  38. package/src/lib/components/console/pos/pos-kiosk-queue.component.d.ts +22 -0
  39. package/src/lib/components/console/pos/pos-kiosk-queue.component.js +168 -0
  40. package/src/lib/components/console/pos/pos-kiosk-queue.component.js.map +1 -0
  41. package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +18 -0
  42. package/src/lib/components/console/pos/pos-tender-dialogs.component.js +116 -1
  43. package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -1
  44. package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +8 -0
  45. package/src/lib/components/console/pos/pos-tender-panel.component.js +77 -18
  46. package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -1
  47. package/src/lib/components/console/pos/use-pos-display.d.ts +5 -2
  48. package/src/lib/components/console/pos/use-pos-display.js +3 -2
  49. package/src/lib/components/console/pos/use-pos-display.js.map +1 -1
  50. package/src/lib/components/console/pos-devices-card.component.js +2 -2
  51. package/src/lib/components/console/pos-devices-card.component.js.map +1 -1
  52. package/src/lib/components/console/pos-display/pairing-screen.d.ts +5 -2
  53. package/src/lib/components/console/pos-display/pairing-screen.js +7 -5
  54. package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -1
  55. package/src/lib/components/console/pos-display/pos-display-api.d.ts +7 -1
  56. package/src/lib/components/console/pos-display/pos-display-api.js +7 -2
  57. package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -1
  58. package/src/lib/components/console/pos-kiosk/kiosk-checkout.d.ts +41 -0
  59. package/src/lib/components/console/pos-kiosk/kiosk-checkout.js +275 -0
  60. package/src/lib/components/console/pos-kiosk/kiosk-checkout.js.map +1 -0
  61. package/src/lib/components/console/pos-kiosk/kiosk-menu.d.ts +32 -0
  62. package/src/lib/components/console/pos-kiosk/kiosk-menu.js +344 -0
  63. package/src/lib/components/console/pos-kiosk/kiosk-menu.js.map +1 -0
  64. package/src/lib/components/console/pos-kiosk/kiosk-staff.d.ts +12 -0
  65. package/src/lib/components/console/pos-kiosk/kiosk-staff.js +257 -0
  66. package/src/lib/components/console/pos-kiosk/kiosk-staff.js.map +1 -0
  67. package/src/lib/components/console/pos-kiosk/pos-kiosk-api.d.ts +114 -0
  68. package/src/lib/components/console/pos-kiosk/pos-kiosk-api.js +189 -0
  69. package/src/lib/components/console/pos-kiosk/pos-kiosk-api.js.map +1 -0
  70. package/src/lib/components/console/pos-kiosk/use-kiosk-idle.d.ts +16 -0
  71. package/src/lib/components/console/pos-kiosk/use-kiosk-idle.js +80 -0
  72. package/src/lib/components/console/pos-kiosk/use-kiosk-idle.js.map +1 -0
  73. package/src/lib/components/console/pos-kiosk-page.component.d.ts +28 -0
  74. package/src/lib/components/console/pos-kiosk-page.component.js +791 -0
  75. package/src/lib/components/console/pos-kiosk-page.component.js.map +1 -0
  76. package/src/lib/components/console/pos-offline/pos-offline-api.d.ts +44 -0
  77. package/src/lib/components/console/pos-offline/pos-offline-api.js +69 -0
  78. package/src/lib/components/console/pos-offline/pos-offline-api.js.map +1 -0
  79. package/src/lib/components/console/pos-offline/pos-offline-banner.component.d.ts +7 -0
  80. package/src/lib/components/console/pos-offline/pos-offline-banner.component.js +135 -0
  81. package/src/lib/components/console/pos-offline/pos-offline-banner.component.js.map +1 -0
  82. package/src/lib/components/console/pos-offline/pos-offline-checkout.component.d.ts +32 -0
  83. package/src/lib/components/console/pos-offline/pos-offline-checkout.component.js +287 -0
  84. package/src/lib/components/console/pos-offline/pos-offline-checkout.component.js.map +1 -0
  85. package/src/lib/components/console/pos-offline/pos-offline-store.d.ts +63 -0
  86. package/src/lib/components/console/pos-offline/pos-offline-store.js +145 -0
  87. package/src/lib/components/console/pos-offline/pos-offline-store.js.map +1 -0
  88. package/src/lib/components/console/pos-offline/register-offline.d.ts +24 -0
  89. package/src/lib/components/console/pos-offline/register-offline.js +24 -0
  90. package/src/lib/components/console/pos-offline/register-offline.js.map +1 -0
  91. package/src/lib/components/console/pos-offline/use-pos-offline.d.ts +85 -0
  92. package/src/lib/components/console/pos-offline/use-pos-offline.js +542 -0
  93. package/src/lib/components/console/pos-offline/use-pos-offline.js.map +1 -0
  94. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +72 -17
  95. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -1
  96. package/src/lib/components/console/pos-page.component.js +228 -51
  97. package/src/lib/components/console/pos-page.component.js.map +1 -1
  98. package/src/lib/components/console/pos-zones.d.ts +23 -0
  99. package/src/lib/components/console/pos-zones.js +31 -0
  100. package/src/lib/components/console/pos-zones.js.map +1 -0
  101. package/src/lib/components/console/product-editor-dialog.component.js +10 -64
  102. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  103. package/src/lib/components/console/products-hub-card.component.js +46 -30
  104. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  105. package/src/lib/components/console/shipping-settings-card.component.js +1 -1
  106. package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
  107. package/src/lib/components/console/stock-movements-card.component.js +48 -16
  108. package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
  109. package/src/lib/components/console/store-zones.d.ts +8 -1
  110. package/src/lib/components/console/store-zones.js +11 -1
  111. package/src/lib/components/console/store-zones.js.map +1 -1
  112. package/src/lib/components/console/storefront-tax-summary-card.component.js +1 -0
  113. package/src/lib/components/console/storefront-tax-summary-card.component.js.map +1 -1
  114. package/src/lib/components/order-status.js +66 -0
  115. package/src/lib/components/order-status.js.map +1 -1
  116. package/src/lib/components/product-detail.js +42 -15
  117. package/src/lib/components/product-detail.js.map +1 -1
  118. package/src/lib/constants/local-fulfillment-list-query.d.ts +48 -0
  119. package/src/lib/constants/local-fulfillment-list-query.js +84 -0
  120. package/src/lib/constants/local-fulfillment-list-query.js.map +1 -0
  121. package/src/lib/constants/orders-list-query.d.ts +7 -2
  122. package/src/lib/constants/orders-list-query.js +89 -8
  123. package/src/lib/constants/orders-list-query.js.map +1 -1
  124. package/src/lib/constants/pos-shift-list-query.d.ts +22 -0
  125. package/src/lib/constants/pos-shift-list-query.js +115 -0
  126. package/src/lib/constants/pos-shift-list-query.js.map +1 -0
  127. package/src/lib/constants/product-list-query.d.ts +6 -1
  128. package/src/lib/constants/product-list-query.js +77 -8
  129. package/src/lib/constants/product-list-query.js.map +1 -1
  130. package/src/lib/constants/stock-movement-query.d.ts +3 -2
  131. package/src/lib/constants/stock-movement-query.js +52 -8
  132. package/src/lib/constants/stock-movement-query.js.map +1 -1
  133. package/src/lib/declarations.server.js +21 -0
  134. package/src/lib/declarations.server.js.map +1 -1
  135. package/src/lib/model/buyer-notifications.d.ts +5 -3
  136. package/src/lib/model/buyer-notifications.js +25 -4
  137. package/src/lib/model/buyer-notifications.js.map +1 -1
  138. package/src/lib/model/commerce-orders.d.ts +103 -1
  139. package/src/lib/model/commerce-orders.js +2 -1
  140. package/src/lib/model/commerce-orders.js.map +1 -1
  141. package/src/lib/model/commerce-pos-kiosk.d.ts +175 -0
  142. package/src/lib/model/commerce-pos-kiosk.js +147 -0
  143. package/src/lib/model/commerce-pos-kiosk.js.map +1 -0
  144. package/src/lib/model/commerce-pos-offline.d.ts +234 -0
  145. package/src/lib/model/commerce-pos-offline.js +301 -0
  146. package/src/lib/model/commerce-pos-offline.js.map +1 -0
  147. package/src/lib/model/commerce-pos-ops.d.ts +16 -6
  148. package/src/lib/model/commerce-pos-ops.js +12 -4
  149. package/src/lib/model/commerce-pos-ops.js.map +1 -1
  150. package/src/lib/model/commerce-pos.d.ts +13 -1
  151. package/src/lib/model/commerce-pos.js +5 -4
  152. package/src/lib/model/commerce-pos.js.map +1 -1
  153. package/src/lib/model/commerce-stock-holds.d.ts +24 -3
  154. package/src/lib/model/commerce-stock-holds.js +26 -8
  155. package/src/lib/model/commerce-stock-holds.js.map +1 -1
  156. package/src/lib/model/commerce.d.ts +7 -1
  157. package/src/lib/model/commerce.js.map +1 -1
  158. package/src/lib/model/index.d.ts +5 -0
  159. package/src/lib/model/index.js +5 -0
  160. package/src/lib/model/index.js.map +1 -1
  161. package/src/lib/model/local-fulfillment-settings.d.ts +178 -0
  162. package/src/lib/model/local-fulfillment-settings.js +361 -0
  163. package/src/lib/model/local-fulfillment-settings.js.map +1 -0
  164. package/src/lib/model/order-list-fields.d.ts +10 -1
  165. package/src/lib/model/order-list-fields.js +1 -0
  166. package/src/lib/model/order-list-fields.js.map +1 -1
  167. package/src/lib/model/order-local-fulfillment.d.ts +131 -0
  168. package/src/lib/model/order-local-fulfillment.js +125 -0
  169. package/src/lib/model/order-local-fulfillment.js.map +1 -0
  170. package/src/lib/model/order-shipping-export.js +4 -0
  171. package/src/lib/model/order-shipping-export.js.map +1 -1
  172. package/src/lib/model/order-status-view.d.ts +20 -1
  173. package/src/lib/model/order-status-view.js +60 -6
  174. package/src/lib/model/order-status-view.js.map +1 -1
  175. package/src/lib/model/product-write.d.ts +186 -0
  176. package/src/lib/model/product-write.js +116 -0
  177. package/src/lib/model/product-write.js.map +1 -0
  178. package/src/lib/plugin-config.js +6 -2
  179. package/src/lib/plugin-config.js.map +1 -1
  180. package/src/lib/plugin.js +11 -0
  181. package/src/lib/plugin.js.map +1 -1
  182. package/src/lib/pos-kiosk-config.d.ts +26 -0
  183. package/src/lib/pos-kiosk-config.js +59 -0
  184. package/src/lib/pos-kiosk-config.js.map +1 -0
  185. package/src/lib/server/api-v1/openapi.js +8 -0
  186. package/src/lib/server/api-v1/openapi.js.map +1 -1
  187. package/src/lib/server/api-v1/order-view.d.ts +19 -0
  188. package/src/lib/server/api-v1/order-view.js +35 -0
  189. package/src/lib/server/api-v1/order-view.js.map +1 -1
  190. package/src/lib/server/billing-webhook.js +238 -87
  191. package/src/lib/server/billing-webhook.js.map +1 -1
  192. package/src/lib/server/cart-checkout.d.ts +2 -0
  193. package/src/lib/server/cart-checkout.js +173 -13
  194. package/src/lib/server/cart-checkout.js.map +1 -1
  195. package/src/lib/server/channel-order-updates.d.ts +50 -0
  196. package/src/lib/server/channel-order-updates.js +290 -0
  197. package/src/lib/server/channel-order-updates.js.map +1 -0
  198. package/src/lib/server/channel-orders.d.ts +85 -0
  199. package/src/lib/server/channel-orders.js +543 -0
  200. package/src/lib/server/channel-orders.js.map +1 -0
  201. package/src/lib/server/checkout-extras.js +18 -4
  202. package/src/lib/server/checkout-extras.js.map +1 -1
  203. package/src/lib/server/checkout.js +71 -14
  204. package/src/lib/server/checkout.js.map +1 -1
  205. package/src/lib/server/local-fulfillment-status.d.ts +86 -0
  206. package/src/lib/server/local-fulfillment-status.js +379 -0
  207. package/src/lib/server/local-fulfillment-status.js.map +1 -0
  208. package/src/lib/server/local-fulfillment.d.ts +190 -0
  209. package/src/lib/server/local-fulfillment.js +580 -0
  210. package/src/lib/server/local-fulfillment.js.map +1 -0
  211. package/src/lib/server/membership-register.js +3 -1
  212. package/src/lib/server/membership-register.js.map +1 -1
  213. package/src/lib/server/order-notifications.js +61 -0
  214. package/src/lib/server/order-notifications.js.map +1 -1
  215. package/src/lib/server/pos-display.d.ts +27 -1
  216. package/src/lib/server/pos-display.js +50 -9
  217. package/src/lib/server/pos-display.js.map +1 -1
  218. package/src/lib/server/pos-kiosk-principal.d.ts +29 -0
  219. package/src/lib/server/pos-kiosk-principal.js +42 -0
  220. package/src/lib/server/pos-kiosk-principal.js.map +1 -0
  221. package/src/lib/server/pos-kiosk.d.ts +54 -0
  222. package/src/lib/server/pos-kiosk.js +972 -0
  223. package/src/lib/server/pos-kiosk.js.map +1 -0
  224. package/src/lib/server/pos-offline-sync.d.ts +85 -0
  225. package/src/lib/server/pos-offline-sync.js +765 -0
  226. package/src/lib/server/pos-offline-sync.js.map +1 -0
  227. package/src/lib/server/pos-order.js +22 -4
  228. package/src/lib/server/pos-order.js.map +1 -1
  229. package/src/lib/server/pos-payment.d.ts +6 -0
  230. package/src/lib/server/pos-payment.js +225 -6
  231. package/src/lib/server/pos-payment.js.map +1 -1
  232. package/src/lib/server/pos-print.js +5 -0
  233. package/src/lib/server/pos-print.js.map +1 -1
  234. package/src/lib/server/pos-return.js +27 -0
  235. package/src/lib/server/pos-return.js.map +1 -1
  236. package/src/lib/server/pos-sale.d.ts +6 -0
  237. package/src/lib/server/pos-sale.js +2 -0
  238. package/src/lib/server/pos-sale.js.map +1 -1
  239. package/src/lib/server/pos-shift.js +8 -1
  240. package/src/lib/server/pos-shift.js.map +1 -1
  241. package/src/lib/server/product-catalog.js +5 -1
  242. package/src/lib/server/product-catalog.js.map +1 -1
  243. package/src/lib/server/product-drafts.d.ts +5 -1
  244. package/src/lib/server/product-drafts.js +3 -3
  245. package/src/lib/server/product-drafts.js.map +1 -1
  246. package/src/lib/server/product-writer.d.ts +19 -0
  247. package/src/lib/server/product-writer.js +261 -0
  248. package/src/lib/server/product-writer.js.map +1 -0
  249. package/src/lib/server/products-write.d.ts +61 -0
  250. package/src/lib/server/products-write.js +375 -0
  251. package/src/lib/server/products-write.js.map +1 -0
  252. package/src/lib/server/refund.js +3 -0
  253. package/src/lib/server/refund.js.map +1 -1
  254. package/src/lib/server/stock-hold.d.ts +9 -1
  255. package/src/lib/server/stock-hold.js +15 -7
  256. package/src/lib/server/stock-hold.js.map +1 -1
  257. package/src/lib/server.js +21 -0
  258. package/src/lib/server.js.map +1 -1
  259. package/src/lib/tenant-emails.js +161 -0
  260. package/src/lib/tenant-emails.js.map +1 -1
  261. package/src/lib/testing/memory-firestore.d.ts +16 -3
  262. package/src/lib/testing/memory-firestore.js +11 -3
  263. package/src/lib/testing/memory-firestore.js.map +1 -1
  264. package/src/lib/transfer/products.server.d.ts +5 -0
  265. package/src/lib/transfer/products.server.js +2 -2
  266. package/src/lib/transfer/products.server.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/storefront-tax-summary-card.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use client'\n\nimport { PLATFORM_BRAND_NAME } from '@aglyn/aglyn/app-utils/platform-brand'\n\nimport { pluginDocsHelp } from '@aglyn/aglyn'\nimport { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport { ScrollTable } from '@aglyn/shared-ui-jsx/components/scroll-table.component'\nimport {\n Alert,\n Box,\n Button,\n Divider,\n MenuItem,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Typography,\n} from '@mui/material'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useUser } from '@aglyn/tenant-feature-instance'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\n\nexport interface StorefrontTaxSummaryCardProps {\n hostId: string\n}\n\nconst usd = (cents: number) => `$${(cents / 100).toFixed(2)}`\n\ninterface Jurisdiction {\n transactionCount: number\n totalSalesCents: number\n taxableSalesCents: number\n taxCollectedCents: number\n}\n\ninterface Bucket {\n transactionCount: number\n grossCents: number\n taxableSalesCents: number\n taxCollectedCents: number\n byJurisdiction: Record<string, Jurisdiction>\n}\n\ninterface Summary {\n periodStart: string\n periodEnd: string\n transactionCount: number\n aglynLiable: Bucket\n merchantManual: Bucket\n connectedAccountLiable: Bucket\n attention: {\n rowsMissingTaxableBase: number\n rowsMissingAddress: number\n nonUsdRows: number\n rowsMissingPaidAt: number\n rowsUnclassified: number\n }\n}\n\ninterface Payload {\n summary: Summary\n truncated: boolean\n undatedRows: number\n caveats: { refundsNotReflected: boolean }\n}\n\n/** The last twelve calendar months, newest first, as UTC month bounds. */\nfunction monthOptions(): Array<{ value: string; label: string; from: string; to: string }> {\n const now = new Date()\n return Array.from({ length: 12 }, (_item, index) => {\n const start = new Date(\n Date.UTC(now.getUTCFullYear(), now.getUTCMonth() - index, 1),\n )\n const end = new Date(\n Date.UTC(now.getUTCFullYear(), now.getUTCMonth() - index + 1, 1),\n )\n return {\n value: start.toISOString(),\n label: start.toLocaleDateString(undefined, {\n month: 'long',\n year: 'numeric',\n timeZone: 'UTC',\n }),\n from: start.toISOString(),\n to: end.toISOString(),\n }\n })\n}\n\n/**\n * The sales tax this merchant's own storefront collected (AGL-2440).\n *\n * `storefrontTaxCollected` has recorded every taxed storefront sale since\n * AGL-1904 and every reader of it was Aglyn's — the staff tax return, the DSAR\n * export. The merchant, whose sales these are, could see one order's\n * `totals.taxCents` at a time and nothing else. This card is that absence\n * closed, and closing it is all it does.\n *\n * ## THE NUMBER, NOT THE LABEL\n *\n * This card presents the buckets SEPARATELY and prints no per-row verdict on\n * who must remit which one.\n *\n * The copy may not say that Aglyn makes no determination: Aglyn IS a\n * marketplace facilitator for storefront sales and the Terms publish that at\n * §10.7 (AGL-1956), so such a line would contradict the company's own\n * contract.\n *\n * Separate buckets and no per-row verdict still hold, because §10.7 is\n * narrow: it binds Aglyn only where applicable law gives it a collection\n * obligation for the transaction in question, which is a per-sale,\n * per-jurisdiction test and not a fact about a merchant. So the copy still\n * describes HOW each figure was computed — who calculated the rate, and\n * against whose registration — and adds only what §10.7 itself says about the\n * bucket Aglyn holds. There is still no \"yours to remit\" column and no total\n * across the buckets. A merged \"tax collected\" figure would be the\n * banned determination wearing a neutral name: it would sum tax Aglyn holds\n * and remits with tax the merchant owes, the exact conflation the module warns\n * about in bold — *the two store modes are DIFFERENT FACTS and must never be\n * summed*. That is why the three groups never share a total row, and why the\n * grand total in the header is a TRANSACTION COUNT rather than an amount.\n *\n * ## Why the caveats are on the card and not in a tooltip\n *\n * Both are properties of the DATA, not of the law, and both change what a\n * merchant should do with the number: refunds are not yet reflected, so the\n * figure over-states whenever they have refunded; and a row whose taxable base\n * Stripe did not state is counted out loud rather than treated as a zero-base\n * sale. A figure someone may file from cannot carry its completeness caveats\n * behind a hover.\n *\n * ## Why it is route-backed and not a listener\n *\n * `storefrontTaxCollected` is denied to every client in the rules — the\n * collection spans every merchant and a row carries a shopper's address. The\n * server route applies the `hostId` boundary. Nothing here can read another\n * merchant's sales because nothing here reads the collection at all.\n */\nexport function StorefrontTaxSummaryCard(props: StorefrontTaxSummaryCardProps) {\n const { hostId } = props\n const { data: user } = useUser()\n const months = useMemo(() => monthOptions(), [])\n const [period, setPeriod] = useState(months[0].value)\n const [payload, setPayload] = useState<Payload | null>(null)\n /**\n * Three outcomes, not two (the AGL-1380 rule). \"No tax collected\" is a claim\n * about this merchant's sales; rendering it because a request FAILED would\n * tell a merchant who collected tax that they collected none — on the one\n * surface where that mistake could reach a filing.\n */\n const [loadState, setLoadState] = useState<'pending' | 'error' | 'loaded'>(\n 'pending',\n )\n const [retryNonce, setRetryNonce] = useState(0)\n\n const selected = months.find((month) => month.value === period) ?? months[0]\n\n const load = useCallback(async () => {\n const search = new URLSearchParams({\n hostId,\n from: selected.from,\n to: selected.to,\n })\n const response = await authorizedFetch(\n user,\n `/api/commerce/tax-summary?${search.toString()}`,\n )\n if (!response.ok) throw new Error('tax summary failed')\n return (await response.json()) as Payload\n }, [user, hostId, selected.from, selected.to])\n\n useEffect(() => {\n if (!user) return\n let cancelled = false\n setLoadState('pending')\n load()\n .then((next) => {\n if (cancelled) return\n setPayload(next)\n setLoadState('loaded')\n })\n .catch(() => {\n if (!cancelled) setLoadState('error')\n })\n return () => {\n cancelled = true\n }\n }, [load, user, retryNonce])\n\n const groups = payload\n ? ([\n {\n key: 'aglynLiable',\n bucket: payload.summary.aglynLiable,\n title: `Tax Stripe calculated against ${PLATFORM_BRAND_NAME}’s registrations`,\n how:\n 'Automatic tax was on for these sales. Stripe computed the rate ' +\n `against the tax registrations on ${PLATFORM_BRAND_NAME}’s platform ` +\n `account, and ${PLATFORM_BRAND_NAME} holds what was collected.`,\n },\n {\n key: 'merchantManual',\n bucket: payload.summary.merchantManual,\n title: 'Tax your store calculated at your own rate',\n how:\n 'Automatic tax was off for these sales. The rate came from the ' +\n 'tax settings you configured on this store, applied to your own ' +\n 'declared origin.',\n },\n {\n key: 'connectedAccountLiable',\n bucket: payload.summary.connectedAccountLiable,\n title: 'Tax Stripe calculated against your connected account',\n how:\n 'Automatic tax was on and Stripe named your connected account ' +\n 'as the liable party for these sales.',\n },\n ] as const)\n : []\n\n return (\n <CardDisplay\n header={'Storefront sales tax'}\n subheader={'What your storefront collected, grouped by how it was calculated.'}\n help={pluginDocsHelp('commerce', {\n anchor: '#storefront-sales-tax',\n excerpt:\n 'What your storefront collected in sales tax, grouped by how each ' +\n `figure was calculated. ${PLATFORM_BRAND_NAME} does not provide tax advice.`,\n })}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={2}>\n <TextField\n select\n size=\"small\"\n label=\"Period\"\n value={period}\n onChange={(event) => setPeriod(event.target.value)}\n sx={{ maxWidth: '16rem' }}\n >\n {months.map((month) => (\n <MenuItem key={month.value} value={month.value}>\n {month.label}\n </MenuItem>\n ))}\n </TextField>\n\n {loadState === 'pending' ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading your sales tax…\n </Typography>\n ) : loadState === 'error' || !payload ? (\n <Alert\n severity=\"warning\"\n action={\n <Button\n size=\"small\"\n color=\"inherit\"\n onClick={() => setRetryNonce((nonce) => nonce + 1)}\n >\n Retry\n </Button>\n }\n >\n We couldn’t load your sales tax for this period. This figure is\n blank because the request failed, not because no tax was collected.\n </Alert>\n ) : (\n <>\n {/*\n THE NON-ADVISORY NOTE, first and unmissable. Rendered ABOVE the\n numbers because it governs how all of them should be read.\n\n It now states the position Terms §10.7 publishes (AGL-1956)\n instead of the sentence it used to carry — \"Aglyn does not make\n that determination for you\" — which the Terms themselves have\n contradicted since 2026-08-24. What it still does NOT do is\n reach a per-merchant or per-jurisdiction verdict: §10.7 binds\n Aglyn only where applicable law gives it an obligation, so the\n note describes which bucket Aglyn holds and remits and leaves\n the rest where the merchant's own rate put it.\n */}\n <Alert severity=\"info\">\n These figures show what was collected and how each was\n calculated. For storefront sales {PLATFORM_BRAND_NAME} acts as a\n marketplace facilitator: where applicable law gives{' '}\n {PLATFORM_BRAND_NAME} a collection obligation, the tax it\n calculated is added on top at checkout, held by{' '}\n {PLATFORM_BRAND_NAME} rather than transferred to your connected\n payment account, and remitted by {PLATFORM_BRAND_NAME}. Tax\n calculated at a rate you configured yourself stays yours. See\n Terms of Service §10.7.{' '}\n <strong>\n {PLATFORM_BRAND_NAME} does not provide tax advice.\n </strong>{' '}\n Please confirm your obligations with a qualified tax\n professional.\n </Alert>\n\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`${payload.summary.transactionCount} taxed ${\n payload.summary.transactionCount === 1 ? 'sale' : 'sales'\n } in this period.`}\n </Typography>\n\n {payload.summary.transactionCount === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No storefront sale carried tax in this period.\n </Typography>\n ) : null}\n\n {groups\n .filter((group) => group.bucket.transactionCount > 0)\n .map((group) => (\n <Box key={group.key}>\n <Divider sx={{ mb: 1.5 }} />\n <Typography variant=\"subtitle2\">{group.title}</Typography>\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n component=\"div\"\n sx={{ mb: 1 }}\n >\n {group.how}\n </Typography>\n <Stack\n direction=\"row\"\n spacing={3}\n sx={{ flexWrap: 'wrap', rowGap: 1, mb: 1 }}\n >\n <Box>\n <Typography variant=\"h6\">\n {usd(group.bucket.taxCollectedCents)}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n tax collected\n </Typography>\n </Box>\n <Box>\n <Typography variant=\"h6\">\n {usd(group.bucket.grossCents)}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n gross, tax included\n </Typography>\n </Box>\n <Box>\n <Typography variant=\"h6\">\n {group.bucket.transactionCount}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {group.bucket.transactionCount === 1\n ? 'sale'\n : 'sales'}\n </Typography>\n </Box>\n </Stack>\n <ScrollTable size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{'Jurisdiction'}</TableCell>\n <TableCell align=\"right\">{'Sales'}</TableCell>\n <TableCell align=\"right\">{'Taxable base'}</TableCell>\n <TableCell align=\"right\">{'Tax'}</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {Object.entries(\n group.bucket.byJurisdiction as Record<\n string,\n Jurisdiction\n >,\n ).map(([code, jurisdiction]) => (\n <TableRow key={code}>\n <TableCell>\n {code === 'unknown' ? 'Not stated' : code}\n </TableCell>\n <TableCell align=\"right\">\n {usd(jurisdiction.totalSalesCents)}\n </TableCell>\n <TableCell align=\"right\">\n {usd(jurisdiction.taxableSalesCents)}\n </TableCell>\n <TableCell align=\"right\">\n {usd(jurisdiction.taxCollectedCents)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </ScrollTable>\n </Box>\n ))}\n\n {/*\n WHAT THE NUMBER DOES NOT YET INCLUDE. Facts about the data, on\n the card rather than behind a hover, because each one changes\n what a merchant should do with the figure.\n */}\n <Divider />\n <Stack spacing={0.5}>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Refunds are not reflected. A refunded sale keeps its full ' +\n 'tax here, so these figures over-state whenever you have ' +\n 'refunded in this period.'}\n </Typography>\n {payload.summary.attention.rowsMissingTaxableBase > 0 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${payload.summary.attention.rowsMissingTaxableBase} sale(s) collected tax but Stripe did not state the amount the rate was applied to. Their tax is counted; their taxable base is not, so “Taxable base” above is understated.`}\n </Typography>\n ) : null}\n {payload.summary.attention.rowsMissingAddress > 0 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${payload.summary.attention.rowsMissingAddress} sale(s) carried no customer address and are grouped under “Not stated”.`}\n </Typography>\n ) : null}\n {payload.summary.attention.nonUsdRows > 0 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${payload.summary.attention.nonUsdRows} sale(s) were in a currency other than USD and are summed here without conversion.`}\n </Typography>\n ) : null}\n {payload.summary.attention.rowsUnclassified > 0 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${payload.summary.attention.rowsUnclassified} sale(s) could not be classified and are excluded from every group above rather than guessed into one.`}\n </Typography>\n ) : null}\n {payload.undatedRows > 0 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${payload.undatedRows} recorded sale(s) carry no payment date and fall outside every period, including this one.`}\n </Typography>\n ) : null}\n {payload.truncated ? (\n <Typography variant=\"caption\" color=\"warning.main\">\n {'This period has more sales than one report can read. The ' +\n 'figures above are PARTIAL — narrow the period.'}\n </Typography>\n ) : null}\n </Stack>\n </>\n )}\n </Stack>\n </CardDisplay>\n )\n}\nStorefrontTaxSummaryCard.displayName = 'StorefrontTaxSummaryCard'\n\nexport default StorefrontTaxSummaryCard\n"],"names":["PLATFORM_BRAND_NAME","pluginDocsHelp","CardDisplay","ScrollTable","Alert","Box","Button","Divider","MenuItem","Stack","TableBody","TableCell","TableHead","TableRow","TextField","Typography","useCallback","useEffect","useMemo","useState","useUser","authorizedFetch","usd","cents","toFixed","monthOptions","now","Date","Array","from","length","_item","index","start","UTC","getUTCFullYear","getUTCMonth","end","value","toISOString","label","toLocaleDateString","undefined","month","year","timeZone","to","StorefrontTaxSummaryCard","props","months","hostId","data","user","period","setPeriod","payload","setPayload","loadState","setLoadState","retryNonce","setRetryNonce","selected","find","load","search","URLSearchParams","response","toString","ok","Error","json","cancelled","then","next","catch","groups","key","bucket","summary","aglynLiable","title","how","merchantManual","connectedAccountLiable","header","subheader","help","anchor","excerpt","contentGutterX","contentGutterY","spacing","select","size","onChange","event","target","sx","maxWidth","map","variant","color","severity","action","onClick","nonce","strong","transactionCount","filter","group","mb","component","direction","flexWrap","rowGap","taxCollectedCents","grossCents","align","Object","entries","byJurisdiction","code","jurisdiction","totalSalesCents","taxableSalesCents","attention","rowsMissingTaxableBase","rowsMissingAddress","nonUsdRows","rowsUnclassified","undatedRows","truncated","displayName"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/storefront-tax-summary-card.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use client'\n\nimport { PLATFORM_BRAND_NAME } from '@aglyn/aglyn/app-utils/platform-brand'\n\nimport { pluginDocsHelp } from '@aglyn/aglyn'\nimport { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport { ScrollTable } from '@aglyn/shared-ui-jsx/components/scroll-table.component'\nimport {\n Alert,\n Box,\n Button,\n Divider,\n MenuItem,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Typography,\n} from '@mui/material'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useUser } from '@aglyn/tenant-feature-instance'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\n\nexport interface StorefrontTaxSummaryCardProps {\n hostId: string\n}\n\nconst usd = (cents: number) => `$${(cents / 100).toFixed(2)}`\n\ninterface Jurisdiction {\n transactionCount: number\n totalSalesCents: number\n taxableSalesCents: number\n taxCollectedCents: number\n}\n\ninterface Bucket {\n transactionCount: number\n grossCents: number\n taxableSalesCents: number\n taxCollectedCents: number\n byJurisdiction: Record<string, Jurisdiction>\n}\n\ninterface Summary {\n periodStart: string\n periodEnd: string\n transactionCount: number\n aglynLiable: Bucket\n merchantManual: Bucket\n connectedAccountLiable: Bucket\n attention: {\n rowsMissingTaxableBase: number\n rowsMissingAddress: number\n nonUsdRows: number\n rowsMissingPaidAt: number\n rowsUnclassified: number\n }\n}\n\ninterface Payload {\n summary: Summary\n truncated: boolean\n undatedRows: number\n caveats: { refundsNotReflected: boolean }\n}\n\n/** The last twelve calendar months, newest first, as UTC month bounds. */\nfunction monthOptions(): Array<{ value: string; label: string; from: string; to: string }> {\n const now = new Date()\n return Array.from({ length: 12 }, (_item, index) => {\n const start = new Date(\n Date.UTC(now.getUTCFullYear(), now.getUTCMonth() - index, 1),\n )\n const end = new Date(\n Date.UTC(now.getUTCFullYear(), now.getUTCMonth() - index + 1, 1),\n )\n return {\n value: start.toISOString(),\n label: start.toLocaleDateString(undefined, {\n month: 'long',\n year: 'numeric',\n timeZone: 'UTC',\n }),\n from: start.toISOString(),\n to: end.toISOString(),\n }\n })\n}\n\n/**\n * The sales tax this merchant's own storefront collected (AGL-2440).\n *\n * `storefrontTaxCollected` has recorded every taxed storefront sale since\n * AGL-1904 and every reader of it was Aglyn's — the staff tax return, the DSAR\n * export. The merchant, whose sales these are, could see one order's\n * `totals.taxCents` at a time and nothing else. This card is that absence\n * closed, and closing it is all it does.\n *\n * ## THE NUMBER, NOT THE LABEL\n *\n * This card presents the buckets SEPARATELY and prints no per-row verdict on\n * who must remit which one.\n *\n * The copy may not say that Aglyn makes no determination: Aglyn IS a\n * marketplace facilitator for storefront sales and the Terms publish that at\n * §10.7 (AGL-1956), so such a line would contradict the company's own\n * contract.\n *\n * Separate buckets and no per-row verdict still hold, because §10.7 is\n * narrow: it binds Aglyn only where applicable law gives it a collection\n * obligation for the transaction in question, which is a per-sale,\n * per-jurisdiction test and not a fact about a merchant. So the copy still\n * describes HOW each figure was computed — who calculated the rate, and\n * against whose registration — and adds only what §10.7 itself says about the\n * bucket Aglyn holds. There is still no \"yours to remit\" column and no total\n * across the buckets. A merged \"tax collected\" figure would be the\n * banned determination wearing a neutral name: it would sum tax Aglyn holds\n * and remits with tax the merchant owes, the exact conflation the module warns\n * about in bold — *the two store modes are DIFFERENT FACTS and must never be\n * summed*. That is why the three groups never share a total row, and why the\n * grand total in the header is a TRANSACTION COUNT rather than an amount.\n *\n * ## Why the caveats are on the card and not in a tooltip\n *\n * Both are properties of the DATA, not of the law, and both change what a\n * merchant should do with the number: refunds are not yet reflected, so the\n * figure over-states whenever they have refunded; and a row whose taxable base\n * Stripe did not state is counted out loud rather than treated as a zero-base\n * sale. A figure someone may file from cannot carry its completeness caveats\n * behind a hover.\n *\n * ## Why it is route-backed and not a listener\n *\n * `storefrontTaxCollected` is denied to every client in the rules — the\n * collection spans every merchant and a row carries a shopper's address. The\n * server route applies the `hostId` boundary. Nothing here can read another\n * merchant's sales because nothing here reads the collection at all.\n */\nexport function StorefrontTaxSummaryCard(props: StorefrontTaxSummaryCardProps) {\n const { hostId } = props\n const { data: user } = useUser()\n const months = useMemo(() => monthOptions(), [])\n const [period, setPeriod] = useState(months[0].value)\n const [payload, setPayload] = useState<Payload | null>(null)\n /**\n * Three outcomes, not two (the AGL-1380 rule). \"No tax collected\" is a claim\n * about this merchant's sales; rendering it because a request FAILED would\n * tell a merchant who collected tax that they collected none — on the one\n * surface where that mistake could reach a filing.\n */\n const [loadState, setLoadState] = useState<'pending' | 'error' | 'loaded'>(\n 'pending',\n )\n const [retryNonce, setRetryNonce] = useState(0)\n\n const selected = months.find((month) => month.value === period) ?? months[0]\n\n const load = useCallback(async () => {\n const search = new URLSearchParams({\n hostId,\n from: selected.from,\n to: selected.to,\n })\n const response = await authorizedFetch(\n user,\n `/api/commerce/tax-summary?${search.toString()}`,\n )\n if (!response.ok) throw new Error('tax summary failed')\n return (await response.json()) as Payload\n }, [user, hostId, selected.from, selected.to])\n\n useEffect(() => {\n if (!user) return\n let cancelled = false\n setLoadState('pending')\n load()\n .then((next) => {\n if (cancelled) return\n setPayload(next)\n setLoadState('loaded')\n })\n .catch(() => {\n if (!cancelled) setLoadState('error')\n })\n return () => {\n cancelled = true\n }\n }, [load, user, retryNonce])\n\n const groups = payload\n ? ([\n {\n key: 'aglynLiable',\n bucket: payload.summary.aglynLiable,\n title: `Tax Stripe calculated against ${PLATFORM_BRAND_NAME}’s registrations`,\n how:\n 'Automatic tax was on for these sales. Stripe computed the rate ' +\n `against the tax registrations on ${PLATFORM_BRAND_NAME}’s platform ` +\n `account, and ${PLATFORM_BRAND_NAME} holds what was collected.`,\n },\n {\n key: 'merchantManual',\n bucket: payload.summary.merchantManual,\n title: 'Tax your store calculated at your own rate',\n how:\n 'Automatic tax was off for these sales. The rate came from the ' +\n 'tax settings you configured on this store, applied to your own ' +\n 'declared origin.',\n },\n {\n key: 'connectedAccountLiable',\n bucket: payload.summary.connectedAccountLiable,\n title: 'Tax Stripe calculated against your connected account',\n how:\n 'Automatic tax was on and Stripe named your connected account ' +\n 'as the liable party for these sales.',\n },\n ] as const)\n : []\n\n return (\n <CardDisplay\n header={'Storefront sales tax'}\n subheader={'What your storefront collected, grouped by how it was calculated.'}\n help={pluginDocsHelp('commerce', {\n anchor: '#storefront-sales-tax',\n excerpt:\n 'What your storefront collected in sales tax, grouped by how each ' +\n `figure was calculated. ${PLATFORM_BRAND_NAME} does not provide tax advice.`,\n })}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={2}>\n <TextField\n select\n size=\"small\"\n label=\"Period\"\n value={period}\n onChange={(event) => setPeriod(event.target.value)}\n sx={{ maxWidth: '16rem' }}\n >\n {months.map((month) => (\n <MenuItem key={month.value} value={month.value}>\n {month.label}\n </MenuItem>\n ))}\n </TextField>\n\n {loadState === 'pending' ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading your sales tax…\n </Typography>\n ) : loadState === 'error' || !payload ? (\n <Alert\n severity=\"warning\"\n action={\n <Button\n size=\"small\"\n color=\"inherit\"\n onClick={() => setRetryNonce((nonce) => nonce + 1)}\n >\n Retry\n </Button>\n }\n >\n We couldn’t load your sales tax for this period. This figure is\n blank because the request failed, not because no tax was collected.\n </Alert>\n ) : (\n <>\n {/*\n THE NON-ADVISORY NOTE, first and unmissable. Rendered ABOVE the\n numbers because it governs how all of them should be read.\n\n It now states the position Terms §10.7 publishes (AGL-1956)\n instead of the sentence it used to carry — \"Aglyn does not make\n that determination for you\" — which the Terms themselves have\n contradicted since 2026-08-24. What it still does NOT do is\n reach a per-merchant or per-jurisdiction verdict: §10.7 binds\n Aglyn only where applicable law gives it an obligation, so the\n note describes which bucket Aglyn holds and remits and leaves\n the rest where the merchant's own rate put it.\n */}\n <Alert severity=\"info\">\n These figures show what was collected and how each was\n calculated. For storefront sales {PLATFORM_BRAND_NAME} acts as a\n marketplace facilitator: where applicable law gives{' '}\n {PLATFORM_BRAND_NAME} a collection obligation, the tax it\n calculated is added on top at checkout, held by{' '}\n {PLATFORM_BRAND_NAME} rather than transferred to your connected\n payment account, and remitted by {PLATFORM_BRAND_NAME}. Tax\n calculated at a rate you configured yourself stays yours. See\n Terms of Service §10.7.{' '}\n <strong>\n {PLATFORM_BRAND_NAME} does not provide tax advice.\n </strong>{' '}\n Please confirm your obligations with a qualified tax\n professional.\n </Alert>\n\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`${payload.summary.transactionCount} taxed ${\n payload.summary.transactionCount === 1 ? 'sale' : 'sales'\n } in this period.`}\n </Typography>\n\n {payload.summary.transactionCount === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No storefront sale carried tax in this period.\n </Typography>\n ) : null}\n\n {groups\n .filter((group) => group.bucket.transactionCount > 0)\n .map((group) => (\n <Box key={group.key}>\n <Divider sx={{ mb: 1.5 }} />\n <Typography variant=\"subtitle2\">{group.title}</Typography>\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n component=\"div\"\n sx={{ mb: 1 }}\n >\n {group.how}\n </Typography>\n <Stack\n useFlexGap\n direction=\"row\"\n spacing={3}\n sx={{ flexWrap: 'wrap', rowGap: 1, mb: 1 }}\n >\n <Box>\n <Typography variant=\"h6\">\n {usd(group.bucket.taxCollectedCents)}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n tax collected\n </Typography>\n </Box>\n <Box>\n <Typography variant=\"h6\">\n {usd(group.bucket.grossCents)}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n gross, tax included\n </Typography>\n </Box>\n <Box>\n <Typography variant=\"h6\">\n {group.bucket.transactionCount}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {group.bucket.transactionCount === 1\n ? 'sale'\n : 'sales'}\n </Typography>\n </Box>\n </Stack>\n <ScrollTable size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{'Jurisdiction'}</TableCell>\n <TableCell align=\"right\">{'Sales'}</TableCell>\n <TableCell align=\"right\">{'Taxable base'}</TableCell>\n <TableCell align=\"right\">{'Tax'}</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {Object.entries(\n group.bucket.byJurisdiction as Record<\n string,\n Jurisdiction\n >,\n ).map(([code, jurisdiction]) => (\n <TableRow key={code}>\n <TableCell>\n {code === 'unknown' ? 'Not stated' : code}\n </TableCell>\n <TableCell align=\"right\">\n {usd(jurisdiction.totalSalesCents)}\n </TableCell>\n <TableCell align=\"right\">\n {usd(jurisdiction.taxableSalesCents)}\n </TableCell>\n <TableCell align=\"right\">\n {usd(jurisdiction.taxCollectedCents)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </ScrollTable>\n </Box>\n ))}\n\n {/*\n WHAT THE NUMBER DOES NOT YET INCLUDE. Facts about the data, on\n the card rather than behind a hover, because each one changes\n what a merchant should do with the figure.\n */}\n <Divider />\n <Stack spacing={0.5}>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Refunds are not reflected. A refunded sale keeps its full ' +\n 'tax here, so these figures over-state whenever you have ' +\n 'refunded in this period.'}\n </Typography>\n {payload.summary.attention.rowsMissingTaxableBase > 0 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${payload.summary.attention.rowsMissingTaxableBase} sale(s) collected tax but Stripe did not state the amount the rate was applied to. Their tax is counted; their taxable base is not, so “Taxable base” above is understated.`}\n </Typography>\n ) : null}\n {payload.summary.attention.rowsMissingAddress > 0 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${payload.summary.attention.rowsMissingAddress} sale(s) carried no customer address and are grouped under “Not stated”.`}\n </Typography>\n ) : null}\n {payload.summary.attention.nonUsdRows > 0 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${payload.summary.attention.nonUsdRows} sale(s) were in a currency other than USD and are summed here without conversion.`}\n </Typography>\n ) : null}\n {payload.summary.attention.rowsUnclassified > 0 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${payload.summary.attention.rowsUnclassified} sale(s) could not be classified and are excluded from every group above rather than guessed into one.`}\n </Typography>\n ) : null}\n {payload.undatedRows > 0 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${payload.undatedRows} recorded sale(s) carry no payment date and fall outside every period, including this one.`}\n </Typography>\n ) : null}\n {payload.truncated ? (\n <Typography variant=\"caption\" color=\"warning.main\">\n {'This period has more sales than one report can read. The ' +\n 'figures above are PARTIAL — narrow the period.'}\n </Typography>\n ) : null}\n </Stack>\n </>\n )}\n </Stack>\n </CardDisplay>\n )\n}\nStorefrontTaxSummaryCard.displayName = 'StorefrontTaxSummaryCard'\n\nexport default StorefrontTaxSummaryCard\n"],"names":["PLATFORM_BRAND_NAME","pluginDocsHelp","CardDisplay","ScrollTable","Alert","Box","Button","Divider","MenuItem","Stack","TableBody","TableCell","TableHead","TableRow","TextField","Typography","useCallback","useEffect","useMemo","useState","useUser","authorizedFetch","usd","cents","toFixed","monthOptions","now","Date","Array","from","length","_item","index","start","UTC","getUTCFullYear","getUTCMonth","end","value","toISOString","label","toLocaleDateString","undefined","month","year","timeZone","to","StorefrontTaxSummaryCard","props","months","hostId","data","user","period","setPeriod","payload","setPayload","loadState","setLoadState","retryNonce","setRetryNonce","selected","find","load","search","URLSearchParams","response","toString","ok","Error","json","cancelled","then","next","catch","groups","key","bucket","summary","aglynLiable","title","how","merchantManual","connectedAccountLiable","header","subheader","help","anchor","excerpt","contentGutterX","contentGutterY","spacing","select","size","onChange","event","target","sx","maxWidth","map","variant","color","severity","action","onClick","nonce","strong","transactionCount","filter","group","mb","component","useFlexGap","direction","flexWrap","rowGap","taxCollectedCents","grossCents","align","Object","entries","byJurisdiction","code","jurisdiction","totalSalesCents","taxableSalesCents","attention","rowsMissingTaxableBase","rowsMissingAddress","nonUsdRows","rowsUnclassified","undatedRows","truncated","displayName"],"mappings":"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"}
@@ -240,6 +240,72 @@ function dateLabel(atMs) {
240
240
  })
241
241
  }, step.key))
242
242
  }),
243
+ view.pickup ? /*#__PURE__*/ _jsx(Paper, {
244
+ variant: "outlined",
245
+ sx: {
246
+ p: 2
247
+ },
248
+ children: /*#__PURE__*/ _jsxs(Stack, {
249
+ spacing: 0.5,
250
+ children: [
251
+ /*#__PURE__*/ _jsx(Typography, {
252
+ variant: "h6",
253
+ component: "h2",
254
+ children: view.pickup.status === 'picked_up' ? 'Picked up' : 'Pickup'
255
+ }),
256
+ /*#__PURE__*/ _jsx(Typography, {
257
+ variant: "body2",
258
+ children: [
259
+ view.pickup.locationName,
260
+ view.pickup.address
261
+ ].filter(Boolean).join(', ')
262
+ }),
263
+ view.pickup.status === 'preparing' ? /*#__PURE__*/ _jsx(Typography, {
264
+ variant: "body2",
265
+ color: "text.secondary",
266
+ children: 'We’re preparing your order and will email you when it’s ready.'
267
+ }) : null,
268
+ view.pickup.hours && view.pickup.status !== 'picked_up' ? /*#__PURE__*/ _jsx(Typography, {
269
+ variant: "body2",
270
+ color: "text.secondary",
271
+ sx: {
272
+ whiteSpace: 'pre-line'
273
+ },
274
+ children: view.pickup.hours
275
+ }) : null,
276
+ view.pickup.instructions && view.pickup.status !== 'picked_up' ? /*#__PURE__*/ _jsx(Typography, {
277
+ variant: "body2",
278
+ color: "text.secondary",
279
+ children: view.pickup.instructions
280
+ }) : null
281
+ ]
282
+ })
283
+ }) : null,
284
+ view.localDelivery ? /*#__PURE__*/ _jsx(Paper, {
285
+ variant: "outlined",
286
+ sx: {
287
+ p: 2
288
+ },
289
+ children: /*#__PURE__*/ _jsxs(Stack, {
290
+ spacing: 0.5,
291
+ children: [
292
+ /*#__PURE__*/ _jsx(Typography, {
293
+ variant: "h6",
294
+ component: "h2",
295
+ children: 'Local delivery'
296
+ }),
297
+ /*#__PURE__*/ _jsx(Typography, {
298
+ variant: "body2",
299
+ children: view.localDelivery.statusLabel
300
+ }),
301
+ view.localDelivery.windowLabel ? /*#__PURE__*/ _jsx(Typography, {
302
+ variant: "body2",
303
+ color: "text.secondary",
304
+ children: view.localDelivery.windowLabel
305
+ }) : null
306
+ ]
307
+ })
308
+ }) : null,
243
309
  view.shipments.length ? /*#__PURE__*/ _jsxs(Stack, {
244
310
  spacing: 1.5,
245
311
  children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/components/order-status.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport { mdiTruckCheckOutline } from '@aglyn/shared-data-mdi'\nimport Alert from '@mui/material/Alert'\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Chip from '@mui/material/Chip'\nimport CircularProgress from '@mui/material/CircularProgress'\nimport Divider from '@mui/material/Divider'\nimport Link from '@mui/material/Link'\nimport Paper from '@mui/material/Paper'\nimport Stack from '@mui/material/Stack'\nimport Step from '@mui/material/Step'\nimport StepLabel from '@mui/material/StepLabel'\nimport Stepper from '@mui/material/Stepper'\nimport Typography from '@mui/material/Typography'\nimport { forwardRef, useEffect, useState } from 'react'\nimport { BUNDLE_ID } from '../constants/bundle-common'\nimport { ORDER_STATUS_COMPONENT_ID } from '../constants/order-status'\nimport {\n formatOrderMoney,\n type OrderStatusView,\n} from '../model'\nimport { generatePresetId } from '../utils/generate-preset-id'\n\n// Component ids are persisted in screen documents; never rename.\nexport const ID: Aglyn.ComponentId = ORDER_STATUS_COMPONENT_ID\n\nexport interface OrderStatusProps {\n heading?: string\n}\n\ntype LoadState =\n | { kind: 'loading' }\n | { kind: 'missing'; message: string }\n | { kind: 'ready'; view: OrderStatusView }\n\nfunction dateLabel(atMs: number | null): string {\n if (!atMs) return ''\n return new Date(atMs).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n })\n}\n\n/**\n * The guest order-status page (AGL-3610): what a buyer sees when they open\n * the \"View your order\" link in any order email. The commerce page resolver\n * serves it at `/order-status` inside the site's own header and footer; a\n * merchant can also place it on a page of their own design at that address.\n *\n * The order is read AFTER hydration from `?o=&t=` — the page itself is the\n * same for every buyer and may be cached, the order never is — through\n * `/api/commerce/order-status`, which verifies the signed link and returns an\n * allow-listed projection (no email, phone or address).\n */\nconst OrderStatus = forwardRef<HTMLDivElement, OrderStatusProps>((props, ref) => {\n const { heading, ...rest } = props\n const nodeSx = Array.isArray(props['sx']) ? props['sx'] : [props['sx']]\n const { hostId } = Aglyn.useSite()\n const siteFetch = Aglyn.useSiteFetch()\n const [state, setState] = useState<LoadState>({ kind: 'loading' })\n\n useEffect(() => {\n if (!hostId) return\n const params = new URLSearchParams(window.location.search)\n const orderId = params.get('o') ?? ''\n const token = params.get('t') ?? ''\n if (!orderId || !token) {\n setState({\n kind: 'missing',\n message: 'Open this page from the link in your order email.',\n })\n return\n }\n let live = true\n siteFetch(\n `/api/commerce/order-status?hostId=${encodeURIComponent(hostId)}` +\n `&o=${encodeURIComponent(orderId)}&t=${encodeURIComponent(token)}`,\n )\n .then(async (response) => {\n const payload = await response.json().catch(() => ({}))\n if (!live) return\n if (!response.ok) {\n setState({\n kind: 'missing',\n message: String(payload?.error ?? 'We could not find that order.'),\n })\n return\n }\n setState({ kind: 'ready', view: payload as OrderStatusView })\n })\n .catch(() => {\n if (live) {\n setState({\n kind: 'missing',\n message: 'Your order could not be loaded. Check your connection and try again.',\n })\n }\n })\n return () => {\n live = false\n }\n }, [hostId, siteFetch])\n\n if (!hostId) {\n return (\n <Box\n ref={ref}\n {...rest}\n sx={[\n { p: 3, border: '1px dashed', borderColor: 'divider', borderRadius: 1 },\n ...nodeSx,\n ]}\n >\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Order status — a buyer’s order, shipments and tracking render here'}\n </Typography>\n </Box>\n )\n }\n\n if (state.kind === 'loading') {\n return (\n <Box ref={ref} {...rest} sx={[{ py: 6, textAlign: 'center' }, ...nodeSx]}>\n <CircularProgress size={28} aria-label=\"Loading your order\" />\n </Box>\n )\n }\n\n if (state.kind === 'missing') {\n return (\n <Box ref={ref} {...rest} sx={[{ maxWidth: 560 }, ...nodeSx]}>\n <Typography variant=\"h4\" component=\"h1\" gutterBottom>\n {heading || 'Your order'}\n </Typography>\n <Alert severity=\"info\">{state.message}</Alert>\n </Box>\n )\n }\n\n const { view } = state\n const money = (cents: number) => formatOrderMoney(cents, view.currency)\n const activeStep = Math.max(\n 0,\n view.steps.reduce((last, step, index) => (step.done ? index : last), 0),\n )\n const cancelled = view.status === 'cancelled'\n\n return (\n <Box ref={ref} {...rest} sx={[{ maxWidth: 720 }, ...nodeSx]}>\n <Stack spacing={3}>\n <Stack spacing={1}>\n {view.storeName ? (\n <Typography variant=\"overline\" color=\"text.secondary\">\n {view.storeName}\n </Typography>\n ) : null}\n <Stack direction=\"row\" spacing={1.5} sx={{ alignItems: 'center', flexWrap: 'wrap' }}>\n <Typography variant=\"h4\" component=\"h1\">\n {heading || `Order ${view.number}`}\n </Typography>\n <Chip\n label={view.statusLabel}\n color={cancelled || view.status === 'refunded' ? 'default' : 'primary'}\n size=\"small\"\n />\n </Stack>\n {view.createdAtMs ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`Placed ${dateLabel(view.createdAtMs)}`}\n </Typography>\n ) : null}\n </Stack>\n\n <Stepper activeStep={activeStep} alternativeLabel>\n {view.steps.map((step) => (\n <Step key={step.key} completed={step.done}>\n <StepLabel\n optional={\n step.atMs ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {dateLabel(step.atMs)}\n </Typography>\n ) : undefined\n }\n >\n {step.label}\n </StepLabel>\n </Step>\n ))}\n </Stepper>\n\n {view.shipments.length ? (\n <Stack spacing={1.5}>\n <Typography variant=\"h6\" component=\"h2\">\n {view.shipments.length === 1 ? 'Shipment' : 'Shipments'}\n </Typography>\n {view.shipments.map((shipment, index) => (\n <Paper key={shipment.id || index} variant=\"outlined\" sx={{ p: 2 }}>\n <Stack spacing={1}>\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap' }}\n >\n <Typography variant=\"subtitle2\">\n {[\n view.shipments.length > 1 ? `Package ${index + 1}` : 'Package',\n dateLabel(shipment.atMs) ? `shipped ${dateLabel(shipment.atMs)}` : '',\n ]\n .filter(Boolean)\n .join(' · ')}\n </Typography>\n {shipment.trackingUrl ? (\n <Button\n size=\"small\"\n variant=\"outlined\"\n href={shipment.trackingUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {'Track package'}\n </Button>\n ) : null}\n </Stack>\n {shipment.trackingNumber ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {[shipment.carrier, shipment.trackingNumber].filter(Boolean).join(' ')}\n </Typography>\n ) : null}\n <Typography variant=\"body2\">\n {shipment.lines.map((line) => `${line.quantity}× ${line.name}`).join(', ')}\n </Typography>\n </Stack>\n </Paper>\n ))}\n </Stack>\n ) : null}\n\n <Stack spacing={1}>\n <Typography variant=\"h6\" component=\"h2\">\n {'Items'}\n </Typography>\n {view.lines.map((line, index) => (\n <Stack key={index} direction=\"row\" spacing={2} sx={{ justifyContent: 'space-between' }}>\n <Box>\n <Typography\n variant=\"body2\"\n sx={line.refunded ? { textDecoration: 'line-through' } : undefined}\n >\n {`${line.quantity}× ${line.name}`}\n {line.variantLabel ? ` (${line.variantLabel})` : ''}\n </Typography>\n {line.refunded ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Refunded'}\n </Typography>\n ) : !cancelled && line.shippedQuantity > 0 && line.shippedQuantity < line.quantity ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${line.shippedQuantity} of ${line.quantity} shipped`}\n </Typography>\n ) : null}\n </Box>\n <Typography variant=\"body2\">{money(line.amountCents)}</Typography>\n </Stack>\n ))}\n <Divider />\n {(\n [\n ['Subtotal', view.totals.itemsCents],\n ['Discount', -view.totals.discountCents],\n ['Shipping', view.totals.shippingCents],\n // Optional lines the buyer took at checkout (AGL-3635), by name.\n ...(view.extras ?? []).map((extra) => [extra.label, extra.amountCents]),\n ['Tax', view.totals.taxCents],\n ] as Array<[string, number]>\n )\n .filter(([label, cents]) => label === 'Subtotal' || cents !== 0)\n .map(([label, cents]) => (\n <Stack key={label} direction=\"row\" sx={{ justifyContent: 'space-between' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {label}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {money(cents)}\n </Typography>\n </Stack>\n ))}\n <Stack direction=\"row\" sx={{ justifyContent: 'space-between' }}>\n <Typography variant=\"subtitle1\">{'Total'}</Typography>\n <Typography variant=\"subtitle1\">{money(view.totals.totalCents)}</Typography>\n </Stack>\n {view.totals.refundedCents > 0 ? (\n <Stack direction=\"row\" sx={{ justifyContent: 'space-between' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Refunded'}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {money(-view.totals.refundedCents)}\n </Typography>\n </Stack>\n ) : null}\n </Stack>\n\n {view.actions.length ? (\n <Stack direction=\"row\" spacing={1} sx={{ flexWrap: 'wrap' }}>\n {view.actions.map((action) => (\n <Button key={action.id} variant=\"outlined\" href={action.url}>\n {action.label}\n </Button>\n ))}\n </Stack>\n ) : null}\n\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Questions about your order? Reply to your order email'}\n {view.storeName ? ` or contact ${view.storeName}` : ''}\n {'.'}\n </Typography>\n <Link href=\"/\" variant=\"body2\">\n {'Continue shopping'}\n </Link>\n </Stack>\n </Box>\n )\n})\nOrderStatus.displayName = 'OrderStatus'\n\nexport const schema: Aglyn.ComponentSchema<OrderStatusProps> = {\n $id: ID,\n pluginId: BUNDLE_ID,\n displayName: 'Order status',\n description:\n 'A buyer’s order, shipments and tracking, opened from the link in their order emails.',\n category: Aglyn.ComponentCategory.COMMERCE,\n icon: { path: mdiTruckCheckOutline.path, sx: { color: 'success.main' } },\n flags: { selfClosing: Aglyn.FEATURE_FLAG.ENABLED },\n attributes: [\n {\n name: 'heading',\n label: 'Heading',\n description: 'Shown above the order. Defaults to the order number.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n ],\n}\n\nexport const presets: Aglyn.PresetSchema[] = [\n {\n $id: generatePresetId(ID),\n type: Aglyn.NodeType.PRESET,\n displayName: 'Order status',\n pluginId: BUNDLE_ID,\n description: 'The buyer’s order status, for the /order-status page',\n category: Aglyn.ComponentCategory.COMMERCE,\n icon: { path: mdiTruckCheckOutline.path, sx: { color: 'success.main' } },\n data: {\n $id: null,\n componentId: ID,\n pluginId: BUNDLE_ID,\n props: {},\n },\n },\n]\n\nexport default OrderStatus\n"],"names":["Aglyn","mdiTruckCheckOutline","Alert","Box","Button","Chip","CircularProgress","Divider","Link","Paper","Stack","Step","StepLabel","Stepper","Typography","forwardRef","useEffect","useState","BUNDLE_ID","ORDER_STATUS_COMPONENT_ID","formatOrderMoney","generatePresetId","ID","dateLabel","atMs","Date","toLocaleDateString","undefined","month","day","year","OrderStatus","props","ref","view","heading","rest","nodeSx","Array","isArray","hostId","useSite","siteFetch","useSiteFetch","state","setState","kind","params","URLSearchParams","window","location","search","orderId","get","token","message","live","encodeURIComponent","then","response","payload","json","catch","ok","String","error","sx","p","border","borderColor","borderRadius","variant","color","py","textAlign","size","aria-label","maxWidth","component","gutterBottom","severity","money","cents","currency","activeStep","Math","max","steps","reduce","last","step","index","done","cancelled","status","spacing","storeName","direction","alignItems","flexWrap","number","label","statusLabel","createdAtMs","alternativeLabel","map","completed","optional","key","shipments","length","shipment","justifyContent","filter","Boolean","join","trackingUrl","href","target","rel","trackingNumber","carrier","lines","line","quantity","name","id","refunded","textDecoration","variantLabel","shippedQuantity","amountCents","totals","itemsCents","discountCents","shippingCents","extras","extra","taxCents","totalCents","refundedCents","actions","action","url","displayName","schema","$id","pluginId","description","category","ComponentCategory","COMMERCE","icon","path","flags","selfClosing","FEATURE_FLAG","ENABLED","attributes","FieldComponentType","TEXT_FIELD","presets","type","NodeType","PRESET","data","componentId"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/components/order-status.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport { mdiTruckCheckOutline } from '@aglyn/shared-data-mdi'\nimport Alert from '@mui/material/Alert'\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Chip from '@mui/material/Chip'\nimport CircularProgress from '@mui/material/CircularProgress'\nimport Divider from '@mui/material/Divider'\nimport Link from '@mui/material/Link'\nimport Paper from '@mui/material/Paper'\nimport Stack from '@mui/material/Stack'\nimport Step from '@mui/material/Step'\nimport StepLabel from '@mui/material/StepLabel'\nimport Stepper from '@mui/material/Stepper'\nimport Typography from '@mui/material/Typography'\nimport { forwardRef, useEffect, useState } from 'react'\nimport { BUNDLE_ID } from '../constants/bundle-common'\nimport { ORDER_STATUS_COMPONENT_ID } from '../constants/order-status'\nimport {\n formatOrderMoney,\n type OrderStatusView,\n} from '../model'\nimport { generatePresetId } from '../utils/generate-preset-id'\n\n// Component ids are persisted in screen documents; never rename.\nexport const ID: Aglyn.ComponentId = ORDER_STATUS_COMPONENT_ID\n\nexport interface OrderStatusProps {\n heading?: string\n}\n\ntype LoadState =\n | { kind: 'loading' }\n | { kind: 'missing'; message: string }\n | { kind: 'ready'; view: OrderStatusView }\n\nfunction dateLabel(atMs: number | null): string {\n if (!atMs) return ''\n return new Date(atMs).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n })\n}\n\n/**\n * The guest order-status page (AGL-3610): what a buyer sees when they open\n * the \"View your order\" link in any order email. The commerce page resolver\n * serves it at `/order-status` inside the site's own header and footer; a\n * merchant can also place it on a page of their own design at that address.\n *\n * The order is read AFTER hydration from `?o=&t=` — the page itself is the\n * same for every buyer and may be cached, the order never is — through\n * `/api/commerce/order-status`, which verifies the signed link and returns an\n * allow-listed projection (no email, phone or address).\n */\nconst OrderStatus = forwardRef<HTMLDivElement, OrderStatusProps>((props, ref) => {\n const { heading, ...rest } = props\n const nodeSx = Array.isArray(props['sx']) ? props['sx'] : [props['sx']]\n const { hostId } = Aglyn.useSite()\n const siteFetch = Aglyn.useSiteFetch()\n const [state, setState] = useState<LoadState>({ kind: 'loading' })\n\n useEffect(() => {\n if (!hostId) return\n const params = new URLSearchParams(window.location.search)\n const orderId = params.get('o') ?? ''\n const token = params.get('t') ?? ''\n if (!orderId || !token) {\n setState({\n kind: 'missing',\n message: 'Open this page from the link in your order email.',\n })\n return\n }\n let live = true\n siteFetch(\n `/api/commerce/order-status?hostId=${encodeURIComponent(hostId)}` +\n `&o=${encodeURIComponent(orderId)}&t=${encodeURIComponent(token)}`,\n )\n .then(async (response) => {\n const payload = await response.json().catch(() => ({}))\n if (!live) return\n if (!response.ok) {\n setState({\n kind: 'missing',\n message: String(payload?.error ?? 'We could not find that order.'),\n })\n return\n }\n setState({ kind: 'ready', view: payload as OrderStatusView })\n })\n .catch(() => {\n if (live) {\n setState({\n kind: 'missing',\n message: 'Your order could not be loaded. Check your connection and try again.',\n })\n }\n })\n return () => {\n live = false\n }\n }, [hostId, siteFetch])\n\n if (!hostId) {\n return (\n <Box\n ref={ref}\n {...rest}\n sx={[\n { p: 3, border: '1px dashed', borderColor: 'divider', borderRadius: 1 },\n ...nodeSx,\n ]}\n >\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Order status — a buyer’s order, shipments and tracking render here'}\n </Typography>\n </Box>\n )\n }\n\n if (state.kind === 'loading') {\n return (\n <Box ref={ref} {...rest} sx={[{ py: 6, textAlign: 'center' }, ...nodeSx]}>\n <CircularProgress size={28} aria-label=\"Loading your order\" />\n </Box>\n )\n }\n\n if (state.kind === 'missing') {\n return (\n <Box ref={ref} {...rest} sx={[{ maxWidth: 560 }, ...nodeSx]}>\n <Typography variant=\"h4\" component=\"h1\" gutterBottom>\n {heading || 'Your order'}\n </Typography>\n <Alert severity=\"info\">{state.message}</Alert>\n </Box>\n )\n }\n\n const { view } = state\n const money = (cents: number) => formatOrderMoney(cents, view.currency)\n const activeStep = Math.max(\n 0,\n view.steps.reduce((last, step, index) => (step.done ? index : last), 0),\n )\n const cancelled = view.status === 'cancelled'\n\n return (\n <Box ref={ref} {...rest} sx={[{ maxWidth: 720 }, ...nodeSx]}>\n <Stack spacing={3}>\n <Stack spacing={1}>\n {view.storeName ? (\n <Typography variant=\"overline\" color=\"text.secondary\">\n {view.storeName}\n </Typography>\n ) : null}\n <Stack direction=\"row\" spacing={1.5} sx={{ alignItems: 'center', flexWrap: 'wrap' }}>\n <Typography variant=\"h4\" component=\"h1\">\n {heading || `Order ${view.number}`}\n </Typography>\n <Chip\n label={view.statusLabel}\n color={cancelled || view.status === 'refunded' ? 'default' : 'primary'}\n size=\"small\"\n />\n </Stack>\n {view.createdAtMs ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`Placed ${dateLabel(view.createdAtMs)}`}\n </Typography>\n ) : null}\n </Stack>\n\n <Stepper activeStep={activeStep} alternativeLabel>\n {view.steps.map((step) => (\n <Step key={step.key} completed={step.done}>\n <StepLabel\n optional={\n step.atMs ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {dateLabel(step.atMs)}\n </Typography>\n ) : undefined\n }\n >\n {step.label}\n </StepLabel>\n </Step>\n ))}\n </Stepper>\n\n {/* Where to collect it, or when it is coming (AGL-3624). */}\n {view.pickup ? (\n <Paper variant=\"outlined\" sx={{ p: 2 }}>\n <Stack spacing={0.5}>\n <Typography variant=\"h6\" component=\"h2\">\n {view.pickup.status === 'picked_up' ? 'Picked up' : 'Pickup'}\n </Typography>\n <Typography variant=\"body2\">\n {[view.pickup.locationName, view.pickup.address].filter(Boolean).join(', ')}\n </Typography>\n {view.pickup.status === 'preparing' ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'We’re preparing your order and will email you when it’s ready.'}\n </Typography>\n ) : null}\n {view.pickup.hours && view.pickup.status !== 'picked_up' ? (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ whiteSpace: 'pre-line' }}>\n {view.pickup.hours}\n </Typography>\n ) : null}\n {view.pickup.instructions && view.pickup.status !== 'picked_up' ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {view.pickup.instructions}\n </Typography>\n ) : null}\n </Stack>\n </Paper>\n ) : null}\n {view.localDelivery ? (\n <Paper variant=\"outlined\" sx={{ p: 2 }}>\n <Stack spacing={0.5}>\n <Typography variant=\"h6\" component=\"h2\">\n {'Local delivery'}\n </Typography>\n <Typography variant=\"body2\">{view.localDelivery.statusLabel}</Typography>\n {view.localDelivery.windowLabel ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {view.localDelivery.windowLabel}\n </Typography>\n ) : null}\n </Stack>\n </Paper>\n ) : null}\n\n {view.shipments.length ? (\n <Stack spacing={1.5}>\n <Typography variant=\"h6\" component=\"h2\">\n {view.shipments.length === 1 ? 'Shipment' : 'Shipments'}\n </Typography>\n {view.shipments.map((shipment, index) => (\n <Paper key={shipment.id || index} variant=\"outlined\" sx={{ p: 2 }}>\n <Stack spacing={1}>\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap' }}\n >\n <Typography variant=\"subtitle2\">\n {[\n view.shipments.length > 1 ? `Package ${index + 1}` : 'Package',\n dateLabel(shipment.atMs) ? `shipped ${dateLabel(shipment.atMs)}` : '',\n ]\n .filter(Boolean)\n .join(' · ')}\n </Typography>\n {shipment.trackingUrl ? (\n <Button\n size=\"small\"\n variant=\"outlined\"\n href={shipment.trackingUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {'Track package'}\n </Button>\n ) : null}\n </Stack>\n {shipment.trackingNumber ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {[shipment.carrier, shipment.trackingNumber].filter(Boolean).join(' ')}\n </Typography>\n ) : null}\n <Typography variant=\"body2\">\n {shipment.lines.map((line) => `${line.quantity}× ${line.name}`).join(', ')}\n </Typography>\n </Stack>\n </Paper>\n ))}\n </Stack>\n ) : null}\n\n <Stack spacing={1}>\n <Typography variant=\"h6\" component=\"h2\">\n {'Items'}\n </Typography>\n {view.lines.map((line, index) => (\n <Stack key={index} direction=\"row\" spacing={2} sx={{ justifyContent: 'space-between' }}>\n <Box>\n <Typography\n variant=\"body2\"\n sx={line.refunded ? { textDecoration: 'line-through' } : undefined}\n >\n {`${line.quantity}× ${line.name}`}\n {line.variantLabel ? ` (${line.variantLabel})` : ''}\n </Typography>\n {line.refunded ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Refunded'}\n </Typography>\n ) : !cancelled && line.shippedQuantity > 0 && line.shippedQuantity < line.quantity ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${line.shippedQuantity} of ${line.quantity} shipped`}\n </Typography>\n ) : null}\n </Box>\n <Typography variant=\"body2\">{money(line.amountCents)}</Typography>\n </Stack>\n ))}\n <Divider />\n {(\n [\n ['Subtotal', view.totals.itemsCents],\n ['Discount', -view.totals.discountCents],\n ['Shipping', view.totals.shippingCents],\n // Optional lines the buyer took at checkout (AGL-3635), by name.\n ...(view.extras ?? []).map((extra) => [extra.label, extra.amountCents]),\n ['Tax', view.totals.taxCents],\n ] as Array<[string, number]>\n )\n .filter(([label, cents]) => label === 'Subtotal' || cents !== 0)\n .map(([label, cents]) => (\n <Stack key={label} direction=\"row\" sx={{ justifyContent: 'space-between' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {label}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {money(cents)}\n </Typography>\n </Stack>\n ))}\n <Stack direction=\"row\" sx={{ justifyContent: 'space-between' }}>\n <Typography variant=\"subtitle1\">{'Total'}</Typography>\n <Typography variant=\"subtitle1\">{money(view.totals.totalCents)}</Typography>\n </Stack>\n {view.totals.refundedCents > 0 ? (\n <Stack direction=\"row\" sx={{ justifyContent: 'space-between' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Refunded'}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {money(-view.totals.refundedCents)}\n </Typography>\n </Stack>\n ) : null}\n </Stack>\n\n {view.actions.length ? (\n <Stack direction=\"row\" spacing={1} sx={{ flexWrap: 'wrap' }}>\n {view.actions.map((action) => (\n <Button key={action.id} variant=\"outlined\" href={action.url}>\n {action.label}\n </Button>\n ))}\n </Stack>\n ) : null}\n\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Questions about your order? Reply to your order email'}\n {view.storeName ? ` or contact ${view.storeName}` : ''}\n {'.'}\n </Typography>\n <Link href=\"/\" variant=\"body2\">\n {'Continue shopping'}\n </Link>\n </Stack>\n </Box>\n )\n})\nOrderStatus.displayName = 'OrderStatus'\n\nexport const schema: Aglyn.ComponentSchema<OrderStatusProps> = {\n $id: ID,\n pluginId: BUNDLE_ID,\n displayName: 'Order status',\n description:\n 'A buyer’s order, shipments and tracking, opened from the link in their order emails.',\n category: Aglyn.ComponentCategory.COMMERCE,\n icon: { path: mdiTruckCheckOutline.path, sx: { color: 'success.main' } },\n flags: { selfClosing: Aglyn.FEATURE_FLAG.ENABLED },\n attributes: [\n {\n name: 'heading',\n label: 'Heading',\n description: 'Shown above the order. Defaults to the order number.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n ],\n}\n\nexport const presets: Aglyn.PresetSchema[] = [\n {\n $id: generatePresetId(ID),\n type: Aglyn.NodeType.PRESET,\n displayName: 'Order status',\n pluginId: BUNDLE_ID,\n description: 'The buyer’s order status, for the /order-status page',\n category: Aglyn.ComponentCategory.COMMERCE,\n icon: { path: mdiTruckCheckOutline.path, sx: { color: 'success.main' } },\n data: {\n $id: null,\n componentId: ID,\n pluginId: BUNDLE_ID,\n props: {},\n },\n },\n]\n\nexport default OrderStatus\n"],"names":["Aglyn","mdiTruckCheckOutline","Alert","Box","Button","Chip","CircularProgress","Divider","Link","Paper","Stack","Step","StepLabel","Stepper","Typography","forwardRef","useEffect","useState","BUNDLE_ID","ORDER_STATUS_COMPONENT_ID","formatOrderMoney","generatePresetId","ID","dateLabel","atMs","Date","toLocaleDateString","undefined","month","day","year","OrderStatus","props","ref","view","heading","rest","nodeSx","Array","isArray","hostId","useSite","siteFetch","useSiteFetch","state","setState","kind","params","URLSearchParams","window","location","search","orderId","get","token","message","live","encodeURIComponent","then","response","payload","json","catch","ok","String","error","sx","p","border","borderColor","borderRadius","variant","color","py","textAlign","size","aria-label","maxWidth","component","gutterBottom","severity","money","cents","currency","activeStep","Math","max","steps","reduce","last","step","index","done","cancelled","status","spacing","storeName","direction","alignItems","flexWrap","number","label","statusLabel","createdAtMs","alternativeLabel","map","completed","optional","key","pickup","locationName","address","filter","Boolean","join","hours","whiteSpace","instructions","localDelivery","windowLabel","shipments","length","shipment","justifyContent","trackingUrl","href","target","rel","trackingNumber","carrier","lines","line","quantity","name","id","refunded","textDecoration","variantLabel","shippedQuantity","amountCents","totals","itemsCents","discountCents","shippingCents","extras","extra","taxCents","totalCents","refundedCents","actions","action","url","displayName","schema","$id","pluginId","description","category","ComponentCategory","COMMERCE","icon","path","flags","selfClosing","FEATURE_FLAG","ENABLED","attributes","FieldComponentType","TEXT_FIELD","presets","type","NodeType","PRESET","data","componentId"],"mappings":"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"}
@@ -38,6 +38,7 @@ import { BUNDLE_ID } from "../constants/bundle-common.js";
38
38
  import { generatePresetId } from "../utils/generate-preset-id.js";
39
39
  import { useStorefrontPurchaseEvent } from "../utils/use-storefront-purchase-event.js";
40
40
  import { CART_UPDATED_EVENT } from "./cart.js";
41
+ import { CartFulfillmentChoice, useCartFulfillment } from "./cart-fulfillment.js";
41
42
  import { ID as PRODUCT_REVIEWS_ID } from "./product-reviews.js";
42
43
  import { ID as RELATED_PRODUCTS_ID } from "./related-products.js";
43
44
  import { readLocalWishlist, toggleWishlist } from "./wishlist.js";
@@ -128,7 +129,7 @@ function slugFromLocation() {
128
129
  * variant. Resolves its product from the /products/{slug} URL unless a
129
130
  * slug prop pins it; sample data on the inert canvas.
130
131
  */ const ProductDetail = /*#__PURE__*/ forwardRef((props, ref)=>{
131
- var _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
132
+ var _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6;
132
133
  var _site_pageData_commerce, _site_pageData;
133
134
  const { slug: slugProp, buyLabel, hideDescription, showCoupon } = props, rest = _object_without_properties_loose(props, [
134
135
  "slug",
@@ -292,7 +293,14 @@ function slugFromLocation() {
292
293
  * the same key, so the server replays the original session instead of
293
294
  * opening a second one (for a subscription product, a second RECURRING
294
295
  * subscription).
295
- */ const attemptKey = useRef('');
296
+ */ // Pickup or the store's own delivery (AGL-3624), for a one-time sale; the
297
+ // server offers nothing for a product with nothing physical to collect.
298
+ const fulfillment = useCartFulfillment(hostId, (_ref = resolved == null ? void 0 : resolved.id) != null ? _ref : '[]', resolved && variant && !(resolved.subscription && (!resolved.subscriptionOptional || billing === 'subscribe')) ? {
299
+ productId: resolved.id,
300
+ variantId: variant.id,
301
+ quantity
302
+ } : null);
303
+ const attemptKey = useRef('');
296
304
  useEffect(()=>{
297
305
  attemptKey.current = '';
298
306
  // `coupon` is in here because it CHANGES THE PRICE. Without it a shopper
@@ -307,7 +315,8 @@ function slugFromLocation() {
307
315
  billing,
308
316
  shipTo,
309
317
  shipPostal,
310
- coupon
318
+ coupon,
319
+ fulfillment.signature
311
320
  ]);
312
321
  const handleBuy = async ()=>{
313
322
  if (!hostId || !resolved || !variant || status === 'sending') return;
@@ -333,10 +342,12 @@ function slugFromLocation() {
333
342
  quantity
334
343
  }, resolved.subscriptionOptional ? {
335
344
  billing
336
- } : {}, shipTo ? {
345
+ } : {}, shipTo && !fulfillment.request ? {
337
346
  shippingCountry: shipTo
338
- } : {}, shipPostal.trim() ? {
347
+ } : {}, shipPostal.trim() && !fulfillment.request ? {
339
348
  shippingPostalCode: shipPostal.trim()
349
+ } : {}, fulfillment.request ? {
350
+ fulfillment: fulfillment.request
340
351
  } : {}, coupon.trim() ? {
341
352
  couponCode: coupon.trim()
342
353
  } : {}))
@@ -386,19 +397,26 @@ function slugFromLocation() {
386
397
  }
387
398
  // Buy-now's half of AGL-2019. The server's own 501 wording is not
388
399
  // rendered to a visitor; this surface is public.
400
+ if (payload == null ? void 0 : payload.fulfillmentChanged) {
401
+ var _ref2;
402
+ fulfillment.reload();
403
+ setMessage(String((_ref2 = payload == null ? void 0 : payload.error) != null ? _ref2 : ''));
404
+ setStatus('error');
405
+ return;
406
+ }
389
407
  if (isPaymentsNotConfigured(response.status)) {
390
408
  setMessage(storefrontPaymentsNotConfiguredText());
391
409
  setStatus('unconfigured');
392
410
  return;
393
411
  }
394
412
  if (payload == null ? void 0 : payload.needsShippingCountry) {
395
- var _ref2;
413
+ var _ref3;
396
414
  var _payload_shippingCountries;
397
415
  if (payload == null ? void 0 : payload.needsShippingPostalCode) setAskPostal(true);
398
416
  setShipCountries(((_payload_shippingCountries = payload.shippingCountries) == null ? void 0 : _payload_shippingCountries.length) ? payload.shippingCountries : [
399
417
  ...CommerceModel.CHECKOUT_SHIPPING_COUNTRIES
400
418
  ]);
401
- setMessage(String((_ref2 = payload == null ? void 0 : payload.error) != null ? _ref2 : ''));
419
+ setMessage(String((_ref3 = payload == null ? void 0 : payload.error) != null ? _ref3 : ''));
402
420
  // An unserved destination is a refusal and reads as one; being
403
421
  // asked the first time is not.
404
422
  setStatus(shipTo ? 'error' : 'ask');
@@ -480,7 +498,7 @@ function slugFromLocation() {
480
498
  // schema.org `image` array below is read out of band by a crawler, where
481
499
  // an absolute URL is the point. That one wants `absoluteMediaSrc` with
482
500
  // the site's own origin, which is the tenant page's job (AGL-1725).
483
- const galleryImage = Aglyn.siteRelativeMediaSrc((_ref = (_ref1 = variant == null ? void 0 : variant.imageUrl) != null ? _ref1 : resolved.mediaUrls[activeImage]) != null ? _ref : resolved.mediaUrls[0], {
501
+ const galleryImage = Aglyn.siteRelativeMediaSrc((_ref1 = (_ref2 = variant == null ? void 0 : variant.imageUrl) != null ? _ref2 : resolved.mediaUrls[activeImage]) != null ? _ref1 : resolved.mediaUrls[0], {
484
502
  hostId
485
503
  });
486
504
  // Subscription framing (AGL-545): subscription-only products price as
@@ -507,7 +525,7 @@ function slugFromLocation() {
507
525
  offers: {
508
526
  '@type': 'Offer',
509
527
  priceCurrency: 'USD',
510
- price: String((_ref2 = variant == null ? void 0 : variant.priceUsd) != null ? _ref2 : 0),
528
+ price: String((_ref3 = variant == null ? void 0 : variant.priceUsd) != null ? _ref3 : 0),
511
529
  availability: (variant == null ? void 0 : variant.soldOut) ? 'https://schema.org/OutOfStock' : 'https://schema.org/InStock'
512
530
  }
513
531
  }) : null;
@@ -624,7 +642,7 @@ function slugFromLocation() {
624
642
  children: [
625
643
  /*#__PURE__*/ _jsx(Typography, {
626
644
  variant: "h6",
627
- children: `$${(_ref3 = variant == null ? void 0 : variant.priceUsd) != null ? _ref3 : 0}${subscribing ? intervalSuffix : ''}`
645
+ children: `$${(_ref4 = variant == null ? void 0 : variant.priceUsd) != null ? _ref4 : 0}${subscribing ? intervalSuffix : ''}`
628
646
  }),
629
647
  subscribing && (subscription == null ? void 0 : subscription.trialDays) ? /*#__PURE__*/ _jsx(Typography, {
630
648
  variant: "caption",
@@ -679,11 +697,11 @@ function slugFromLocation() {
679
697
  children: [
680
698
  /*#__PURE__*/ _jsx(ToggleButton, {
681
699
  value: "once",
682
- children: `One-time $${(_ref4 = variant == null ? void 0 : variant.priceUsd) != null ? _ref4 : 0}`
700
+ children: `One-time $${(_ref5 = variant == null ? void 0 : variant.priceUsd) != null ? _ref5 : 0}`
683
701
  }),
684
702
  /*#__PURE__*/ _jsx(ToggleButton, {
685
703
  value: "subscribe",
686
- children: `Subscribe $${(_ref5 = variant == null ? void 0 : variant.priceUsd) != null ? _ref5 : 0}${intervalSuffix}`
704
+ children: `Subscribe $${(_ref6 = variant == null ? void 0 : variant.priceUsd) != null ? _ref6 : 0}${intervalSuffix}`
687
705
  })
688
706
  ]
689
707
  }) : null,
@@ -755,7 +773,7 @@ function slugFromLocation() {
755
773
  // the control latches off rather than inviting a retry that
756
774
  // cannot succeed (AGL-2019).
757
775
  status === 'unconfigured' || // Asked but unanswered: the server would only refuse again.
758
- shipCountries !== null && !shipTo || askPostal && !shipPostal.trim(),
776
+ fulfillment.method === 'shipping' && shipCountries !== null && !shipTo || fulfillment.method === 'shipping' && askPostal && !shipPostal.trim() || !fulfillment.ready,
759
777
  onClick: handleBuy,
760
778
  sx: {
761
779
  flex: 1
@@ -788,7 +806,16 @@ function slugFromLocation() {
788
806
  onCancel: ()=>setNativeCheckout(null)
789
807
  })
790
808
  }) : null,
791
- shipCountries ? /*#__PURE__*/ _jsx(TextField, {
809
+ fulfillment.offered ? /*#__PURE__*/ _jsx(Box, {
810
+ sx: {
811
+ mb: 2
812
+ },
813
+ children: /*#__PURE__*/ _jsx(CartFulfillmentChoice, {
814
+ state: fulfillment,
815
+ formatCents: (cents)=>`$${(cents / 100).toFixed(2)}`
816
+ })
817
+ }) : null,
818
+ shipCountries && fulfillment.method === 'shipping' ? /*#__PURE__*/ _jsx(TextField, {
792
819
  select: true,
793
820
  label: "Ship to",
794
821
  value: shipTo,
@@ -807,7 +834,7 @@ function slugFromLocation() {
807
834
  }, code);
808
835
  })
809
836
  }) : null,
810
- askPostal ? /*#__PURE__*/ _jsx(TextField, {
837
+ askPostal && fulfillment.method === 'shipping' ? /*#__PURE__*/ _jsx(TextField, {
811
838
  label: "Postal code",
812
839
  value: shipPostal,
813
840
  onChange: (event)=>setShipPostal(event.target.value),