@vtex/faststore 0.0.8 → 0.0.11

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 (568) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/README.md +0 -1
  3. package/dist/actions.json +48 -1
  4. package/dist/catalog.json +1397 -1594
  5. package/dist/cli/index.d.ts +66 -28
  6. package/dist/cli/index.js +7371 -512
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/cli/server-runtime.js +41 -60
  9. package/dist/cli/server-runtime.js.map +1 -1
  10. package/dist/client.d.ts +3 -3
  11. package/dist/client.js +2 -2
  12. package/dist/components.d.ts +67 -56
  13. package/dist/components.js +64 -53
  14. package/dist/content-types.json +5886 -555
  15. package/dist/core/dist/define-component.d.ts +7 -2
  16. package/dist/core/dist/define-content-type.d.ts +50 -2
  17. package/dist/core/dist/define-content-type.js +107 -3
  18. package/dist/core/dist/define-content-type.js.map +1 -1
  19. package/dist/core/dist/index.d.ts +2 -2
  20. package/dist/docs/access-code-field.md +1 -1
  21. package/dist/docs/access-code-sign-in.md +126 -77
  22. package/dist/docs/account-address-book.md +210 -95
  23. package/dist/docs/account-entry-point.md +4 -4
  24. package/dist/docs/account-menu.md +16 -17
  25. package/dist/docs/account-saved-cards.md +306 -0
  26. package/dist/docs/alert-dialog.md +3 -1
  27. package/dist/docs/avatar.md +4 -2
  28. package/dist/docs/billing-address.md +99 -30
  29. package/dist/docs/binding-switcher.md +157 -0
  30. package/dist/docs/buy-button.md +7 -8
  31. package/dist/docs/card-entry.md +42 -29
  32. package/dist/docs/card-summary.md +185 -0
  33. package/dist/docs/cardholder-document.md +5 -3
  34. package/dist/docs/carousel.md +5 -4
  35. package/dist/docs/cart-destination.md +251 -0
  36. package/dist/docs/cart-item.md +48 -15
  37. package/dist/docs/cart-totalizer.md +8 -6
  38. package/dist/docs/cart.md +240 -39
  39. package/dist/docs/challenge-return.md +135 -0
  40. package/dist/docs/client-preferences-fieldset.md +10 -5
  41. package/dist/docs/client-preferences.md +31 -8
  42. package/dist/docs/client-profile-fieldset.md +20 -6
  43. package/dist/docs/client-profile.md +12 -3
  44. package/dist/docs/copy-text.md +9 -7
  45. package/dist/docs/document-field.md +1 -1
  46. package/dist/docs/email-field.md +2 -1
  47. package/dist/docs/email-identification.md +12 -2
  48. package/dist/docs/footer-copyright.md +4 -2
  49. package/dist/docs/footer-social.md +1 -1
  50. package/dist/docs/form.md +54 -18
  51. package/dist/docs/free-shipping-progress.md +18 -13
  52. package/dist/docs/identity-edit.md +8 -2
  53. package/dist/docs/identity-summary.md +18 -5
  54. package/dist/docs/incentives.md +2 -2
  55. package/dist/docs/installments.md +46 -32
  56. package/dist/docs/logo.md +1 -1
  57. package/dist/docs/my-account-profile.md +16 -11
  58. package/dist/docs/navigation-link.md +5 -3
  59. package/dist/docs/order-cancel.md +3 -1
  60. package/dist/docs/order-delivery-address.md +7 -5
  61. package/dist/docs/order-delivery-group.md +1 -3
  62. package/dist/docs/order-details-back.md +1 -1
  63. package/dist/docs/order-details-header.md +1 -4
  64. package/dist/docs/order-invoice-download.md +60 -0
  65. package/dist/docs/order-list-row.md +1 -1
  66. package/dist/docs/order-list-search.md +13 -20
  67. package/dist/docs/order-list-views.md +11 -17
  68. package/dist/docs/order-list.md +12 -5
  69. package/dist/docs/order-payment.md +9 -7
  70. package/dist/docs/order-placed-date.md +1 -1
  71. package/dist/docs/order-placed-payment-summary.md +28 -15
  72. package/dist/docs/order-placed.md +49 -14
  73. package/dist/docs/order-progress.md +1 -1
  74. package/dist/docs/order-status-badge.md +20 -9
  75. package/dist/docs/order-summary.md +2 -2
  76. package/dist/docs/order-tracking-link.md +58 -0
  77. package/dist/docs/payment-method-badges.md +32 -6
  78. package/dist/docs/payment-methods.md +2 -2
  79. package/dist/docs/payment.md +36 -17
  80. package/dist/docs/phone-field.md +4 -4
  81. package/dist/docs/place-order.md +84 -36
  82. package/dist/docs/postal-code-field.md +3 -1
  83. package/dist/docs/pricing.md +21 -23
  84. package/dist/docs/product-gallery.md +19 -20
  85. package/dist/docs/product-information.md +14 -10
  86. package/dist/docs/product-list.md +7 -6
  87. package/dist/docs/product-shelf.md +7 -1
  88. package/dist/docs/promotion.md +4 -2
  89. package/dist/docs/region.md +23 -15
  90. package/dist/docs/save-card.md +7 -6
  91. package/dist/docs/saved-cards.md +65 -36
  92. package/dist/docs/select.md +3 -4
  93. package/dist/docs/shipping-address.md +57 -21
  94. package/dist/docs/shipping-simulator.md +53 -15
  95. package/dist/docs/sign-in-disclosure.md +176 -0
  96. package/dist/docs/sign-in-form.md +78 -47
  97. package/dist/docs/sign-in-redirect.md +5 -3
  98. package/dist/docs/sign-in.md +173 -0
  99. package/dist/docs/toast.md +45 -16
  100. package/dist/docs/variant-selector.md +15 -11
  101. package/dist/graphql/types.d.ts +4 -14
  102. package/dist/index.d.ts +3 -2
  103. package/dist/internal/client.d.ts +4 -3
  104. package/dist/internal/client.js +5 -2
  105. package/dist/internal/server.d.ts +10 -5
  106. package/dist/internal/server.js +9 -4
  107. package/dist/matter/access-code-sign-in/access-code-sign-in.d.ts +250 -66
  108. package/dist/matter/access-code-sign-in/access-code-sign-in.js +459 -188
  109. package/dist/matter/access-code-sign-in/access-code-sign-in.js.map +1 -1
  110. package/dist/matter/account-address-book/account-address-book-delete.d.ts +78 -40
  111. package/dist/matter/account-address-book/account-address-book-delete.js +86 -50
  112. package/dist/matter/account-address-book/account-address-book-delete.js.map +1 -1
  113. package/dist/matter/account-address-book/account-address-book-deliverability.d.ts +21 -4
  114. package/dist/matter/account-address-book/account-address-book-deliverability.js +45 -17
  115. package/dist/matter/account-address-book/account-address-book-deliverability.js.map +1 -1
  116. package/dist/matter/account-address-book/account-address-book-form-parts.d.ts +74 -19
  117. package/dist/matter/account-address-book/account-address-book-form-parts.js +77 -26
  118. package/dist/matter/account-address-book/account-address-book-form-parts.js.map +1 -1
  119. package/dist/matter/account-address-book/account-address-book-profile-notice.d.ts +27 -6
  120. package/dist/matter/account-address-book/account-address-book-profile-notice.js +55 -28
  121. package/dist/matter/account-address-book/account-address-book-profile-notice.js.map +1 -1
  122. package/dist/matter/account-address-book/account-address-book.d.ts +67 -14
  123. package/dist/matter/account-address-book/account-address-book.js +74 -33
  124. package/dist/matter/account-address-book/account-address-book.js.map +1 -1
  125. package/dist/matter/account-address-book/account-address-country-switch.js +3 -3
  126. package/dist/matter/account-address-book/account-address-country-switch.js.map +1 -1
  127. package/dist/matter/account-address-book/account-address-country.d.ts +66 -20
  128. package/dist/matter/account-address-book/account-address-country.js +83 -49
  129. package/dist/matter/account-address-book/account-address-country.js.map +1 -1
  130. package/dist/matter/account-address-book/account-address-form-context.d.ts +8 -4
  131. package/dist/matter/account-address-book/account-address-form-context.js.map +1 -1
  132. package/dist/matter/account-address-book/account-address-form.d.ts +468 -45
  133. package/dist/matter/account-address-book/account-address-form.js +518 -155
  134. package/dist/matter/account-address-book/account-address-form.js.map +1 -1
  135. package/dist/matter/account-address-book/account-address-record.d.ts +27 -6
  136. package/dist/matter/account-address-book/account-address-record.js +32 -17
  137. package/dist/matter/account-address-book/account-address-record.js.map +1 -1
  138. package/dist/matter/account-menu/account-menu.d.ts +34 -17
  139. package/dist/matter/account-menu/account-menu.js +46 -54
  140. package/dist/matter/account-menu/account-menu.js.map +1 -1
  141. package/dist/matter/account-menu-identity/account-menu-identity.js +1 -1
  142. package/dist/matter/account-saved-cards/account-saved-cards.d.ts +463 -0
  143. package/dist/matter/account-saved-cards/account-saved-cards.js +1011 -0
  144. package/dist/matter/account-saved-cards/account-saved-cards.js.map +1 -0
  145. package/dist/matter/billing-address/billing-address.d.ts +156 -74
  146. package/dist/matter/billing-address/billing-address.js +227 -156
  147. package/dist/matter/billing-address/billing-address.js.map +1 -1
  148. package/dist/matter/breadcrumb/breadcrumb.d.ts +21 -3
  149. package/dist/matter/breadcrumb/breadcrumb.js +24 -9
  150. package/dist/matter/breadcrumb/breadcrumb.js.map +1 -1
  151. package/dist/matter/buy-button/buy-button.d.ts +8 -11
  152. package/dist/matter/buy-button/buy-button.js +10 -19
  153. package/dist/matter/buy-button/buy-button.js.map +1 -1
  154. package/dist/matter/card-entry/card-capture.js +12 -4
  155. package/dist/matter/card-entry/card-capture.js.map +1 -1
  156. package/dist/matter/card-entry/card-entry.d.ts +123 -32
  157. package/dist/matter/card-entry/card-entry.js +348 -221
  158. package/dist/matter/card-entry/card-entry.js.map +1 -1
  159. package/dist/matter/cart/cart-namespace.d.ts +11 -1
  160. package/dist/matter/cart/cart-namespace.js +11 -1
  161. package/dist/matter/cart/cart-namespace.js.map +1 -1
  162. package/dist/matter/cart/cart.d.ts +416 -45
  163. package/dist/matter/cart/cart.js +782 -101
  164. package/dist/matter/cart/cart.js.map +1 -1
  165. package/dist/matter/cart-destination/cart-destination.d.ts +233 -0
  166. package/dist/matter/cart-destination/cart-destination.js +703 -0
  167. package/dist/matter/cart-destination/cart-destination.js.map +1 -0
  168. package/dist/matter/cart-item/cart-item.d.ts +145 -16
  169. package/dist/matter/cart-item/cart-item.js +230 -54
  170. package/dist/matter/cart-item/cart-item.js.map +1 -1
  171. package/dist/matter/cart-item-compositions/cart-item-compositions.js +1 -1
  172. package/dist/matter/cart-item-compositions/cart-item-compositions.js.map +1 -1
  173. package/dist/matter/cart-item-customizations/cart-item-customizations.js +1 -1
  174. package/dist/matter/cart-item-customizations/cart-item-customizations.js.map +1 -1
  175. package/dist/matter/cart-item-discounts/cart-item-discounts.js +1 -1
  176. package/dist/matter/cart-item-discounts/cart-item-discounts.js.map +1 -1
  177. package/dist/matter/cart-item-seller-info/cart-item-seller-info.js +1 -1
  178. package/dist/matter/cart-item-seller-info/cart-item-seller-info.js.map +1 -1
  179. package/dist/matter/cart-item-variations/cart-item-variations.js +1 -1
  180. package/dist/matter/cart-item-variations/cart-item-variations.js.map +1 -1
  181. package/dist/matter/cart-totalizer/cart-totalizer.d.ts +43 -9
  182. package/dist/matter/cart-totalizer/cart-totalizer.js +49 -19
  183. package/dist/matter/cart-totalizer/cart-totalizer.js.map +1 -1
  184. package/dist/matter/challenge-return/challenge-return.d.ts +62 -0
  185. package/dist/matter/challenge-return/challenge-return.js +241 -0
  186. package/dist/matter/challenge-return/challenge-return.js.map +1 -0
  187. package/dist/matter/client-preferences/client-preferences-fieldset.d.ts +86 -17
  188. package/dist/matter/client-preferences/client-preferences-fieldset.js +126 -54
  189. package/dist/matter/client-preferences/client-preferences-fieldset.js.map +1 -1
  190. package/dist/matter/client-preferences/client-preferences.d.ts +50 -7
  191. package/dist/matter/client-preferences/client-preferences.js +84 -15
  192. package/dist/matter/client-preferences/client-preferences.js.map +1 -1
  193. package/dist/matter/client-profile/client-profile.d.ts +44 -9
  194. package/dist/matter/client-profile/client-profile.js +64 -24
  195. package/dist/matter/client-profile/client-profile.js.map +1 -1
  196. package/dist/matter/client-profile-form/client-profile-fieldset.d.ts +119 -22
  197. package/dist/matter/client-profile-form/client-profile-fieldset.js +161 -73
  198. package/dist/matter/client-profile-form/client-profile-fieldset.js.map +1 -1
  199. package/dist/matter/delivery-options/delivery-options-accordion.d.ts +49 -4
  200. package/dist/matter/delivery-options/delivery-options-accordion.js +67 -14
  201. package/dist/matter/delivery-options/delivery-options-accordion.js.map +1 -1
  202. package/dist/matter/delivery-options/delivery-options-controller.d.ts +69 -9
  203. package/dist/matter/delivery-options/delivery-options-controller.js +80 -14
  204. package/dist/matter/delivery-options/delivery-options-controller.js.map +1 -1
  205. package/dist/matter/delivery-options/delivery-options.d.ts +37 -2
  206. package/dist/matter/delivery-options/delivery-options.js +75 -12
  207. package/dist/matter/delivery-options/delivery-options.js.map +1 -1
  208. package/dist/matter/delivery-options/use-delivery-option-selection.d.ts +1 -0
  209. package/dist/matter/delivery-options/use-delivery-option-selection.js +1 -1
  210. package/dist/matter/delivery-options/use-delivery-option-selection.js.map +1 -1
  211. package/dist/matter/email-identification/email-identification.d.ts +25 -3
  212. package/dist/matter/email-identification/email-identification.js +49 -12
  213. package/dist/matter/email-identification/email-identification.js.map +1 -1
  214. package/dist/matter/free-shipping-progress/free-shipping-progress.d.ts +85 -10
  215. package/dist/matter/free-shipping-progress/free-shipping-progress.js +153 -53
  216. package/dist/matter/free-shipping-progress/free-shipping-progress.js.map +1 -1
  217. package/dist/matter/identity-edit/identity-edit.d.ts +52 -10
  218. package/dist/matter/identity-edit/identity-edit.js +47 -19
  219. package/dist/matter/identity-edit/identity-edit.js.map +1 -1
  220. package/dist/matter/identity-summary/identity-summary.d.ts +76 -22
  221. package/dist/matter/identity-summary/identity-summary.js +95 -45
  222. package/dist/matter/identity-summary/identity-summary.js.map +1 -1
  223. package/dist/matter/installments/installments-select.d.ts +98 -16
  224. package/dist/matter/installments/installments-select.js +156 -48
  225. package/dist/matter/installments/installments-select.js.map +1 -1
  226. package/dist/matter/installments/installments.d.ts +96 -16
  227. package/dist/matter/installments/installments.js +115 -40
  228. package/dist/matter/installments/installments.js.map +1 -1
  229. package/dist/matter/installments/use-installments-selection.d.ts +1 -0
  230. package/dist/matter/installments/use-installments-selection.js +8 -3
  231. package/dist/matter/installments/use-installments-selection.js.map +1 -1
  232. package/dist/matter/my-account-profile/my-account-profile.d.ts +358 -103
  233. package/dist/matter/my-account-profile/my-account-profile.js +370 -174
  234. package/dist/matter/my-account-profile/my-account-profile.js.map +1 -1
  235. package/dist/matter/order-cancel/order-cancel.d.ts +65 -19
  236. package/dist/matter/order-cancel/order-cancel.js +118 -51
  237. package/dist/matter/order-cancel/order-cancel.js.map +1 -1
  238. package/dist/matter/order-delivery-address/order-delivery-address.d.ts +8 -18
  239. package/dist/matter/order-delivery-address/order-delivery-address.js +14 -23
  240. package/dist/matter/order-delivery-address/order-delivery-address.js.map +1 -1
  241. package/dist/matter/order-delivery-group/order-delivery-group.d.ts +40 -24
  242. package/dist/matter/order-delivery-group/order-delivery-group.js +64 -74
  243. package/dist/matter/order-delivery-group/order-delivery-group.js.map +1 -1
  244. package/dist/matter/order-details-header/order-details-header.d.ts +32 -15
  245. package/dist/matter/order-details-header/order-details-header.js +66 -58
  246. package/dist/matter/order-details-header/order-details-header.js.map +1 -1
  247. package/dist/matter/order-invoice-download/order-invoice-download.d.ts +78 -0
  248. package/dist/matter/order-invoice-download/order-invoice-download.js +173 -0
  249. package/dist/matter/order-invoice-download/order-invoice-download.js.map +1 -0
  250. package/dist/matter/order-list/order-list.d.ts +164 -19
  251. package/dist/matter/order-list/order-list.js +229 -87
  252. package/dist/matter/order-list/order-list.js.map +1 -1
  253. package/dist/matter/order-list-row/order-list-row.d.ts +6 -1
  254. package/dist/matter/order-list-row/order-list-row.js +3 -2
  255. package/dist/matter/order-list-row/order-list-row.js.map +1 -1
  256. package/dist/matter/order-list-search/order-list-search.d.ts +18 -26
  257. package/dist/matter/order-list-search/order-list-search.js +30 -69
  258. package/dist/matter/order-list-search/order-list-search.js.map +1 -1
  259. package/dist/matter/order-list-views/order-list-views.d.ts +15 -22
  260. package/dist/matter/order-list-views/order-list-views.js +22 -68
  261. package/dist/matter/order-list-views/order-list-views.js.map +1 -1
  262. package/dist/matter/order-payment/order-payment.d.ts +33 -10
  263. package/dist/matter/order-payment/order-payment.js +44 -39
  264. package/dist/matter/order-payment/order-payment.js.map +1 -1
  265. package/dist/matter/order-placed/order-placed-deliveries.d.ts +144 -12
  266. package/dist/matter/order-placed/order-placed-deliveries.js +115 -40
  267. package/dist/matter/order-placed/order-placed-deliveries.js.map +1 -1
  268. package/dist/matter/order-placed/order-placed.d.ts +198 -31
  269. package/dist/matter/order-placed/order-placed.js +230 -139
  270. package/dist/matter/order-placed/order-placed.js.map +1 -1
  271. package/dist/matter/order-placed-date/order-placed-date.d.ts +5 -8
  272. package/dist/matter/order-placed-date/order-placed-date.js +7 -8
  273. package/dist/matter/order-placed-date/order-placed-date.js.map +1 -1
  274. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.d.ts +90 -17
  275. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js +93 -117
  276. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js.map +1 -1
  277. package/dist/matter/order-progress/order-progress.d.ts +19 -8
  278. package/dist/matter/order-progress/order-progress.js +37 -45
  279. package/dist/matter/order-progress/order-progress.js.map +1 -1
  280. package/dist/matter/order-summary/order-summary.d.ts +19 -9
  281. package/dist/matter/order-summary/order-summary.js +38 -44
  282. package/dist/matter/order-summary/order-summary.js.map +1 -1
  283. package/dist/matter/order-tracking-link/order-tracking-link.d.ts +43 -0
  284. package/dist/matter/order-tracking-link/order-tracking-link.js +107 -0
  285. package/dist/matter/order-tracking-link/order-tracking-link.js.map +1 -0
  286. package/dist/matter/payment/payment-card-capture.js +17 -10
  287. package/dist/matter/payment/payment-card-capture.js.map +1 -1
  288. package/dist/matter/payment/payment-controller.d.ts +4 -2
  289. package/dist/matter/payment/payment-controller.js +30 -9
  290. package/dist/matter/payment/payment-controller.js.map +1 -1
  291. package/dist/matter/payment/payment-method-badges.js +1 -1
  292. package/dist/matter/payment/payment.d.ts +69 -19
  293. package/dist/matter/payment/payment.js +101 -35
  294. package/dist/matter/payment/payment.js.map +1 -1
  295. package/dist/matter/payment/use-payment-method-selection.d.ts +25 -4
  296. package/dist/matter/payment/use-payment-method-selection.js +94 -32
  297. package/dist/matter/payment/use-payment-method-selection.js.map +1 -1
  298. package/dist/matter/payment/use-payment-submit-gate.d.ts +14 -3
  299. package/dist/matter/payment/use-payment-submit-gate.js +47 -8
  300. package/dist/matter/payment/use-payment-submit-gate.js.map +1 -1
  301. package/dist/matter/place-order/place-order.d.ts +171 -57
  302. package/dist/matter/place-order/place-order.js +376 -185
  303. package/dist/matter/place-order/place-order.js.map +1 -1
  304. package/dist/matter/pricing/pricing.d.ts +152 -13
  305. package/dist/matter/pricing/pricing.js +153 -52
  306. package/dist/matter/pricing/pricing.js.map +1 -1
  307. package/dist/matter/product-information/product-information.d.ts +27 -4
  308. package/dist/matter/product-information/product-information.js +32 -15
  309. package/dist/matter/product-information/product-information.js.map +1 -1
  310. package/dist/matter/product-list/product-list.d.ts +24 -6
  311. package/dist/matter/product-list/product-list.js +32 -26
  312. package/dist/matter/product-list/product-list.js.map +1 -1
  313. package/dist/matter/product-shelf/product-shelf.d.ts +8 -3
  314. package/dist/matter/product-shelf/product-shelf.js +111 -10
  315. package/dist/matter/product-shelf/product-shelf.js.map +1 -1
  316. package/dist/matter/region/region.d.ts +33 -16
  317. package/dist/matter/region/region.js +59 -52
  318. package/dist/matter/region/region.js.map +1 -1
  319. package/dist/matter/save-card/save-card.d.ts +43 -8
  320. package/dist/matter/save-card/save-card.js +61 -23
  321. package/dist/matter/save-card/save-card.js.map +1 -1
  322. package/dist/matter/saved-cards/saved-cards.d.ts +113 -21
  323. package/dist/matter/saved-cards/saved-cards.js +349 -77
  324. package/dist/matter/saved-cards/saved-cards.js.map +1 -1
  325. package/dist/matter/shipping-address/address-payload.js +25 -0
  326. package/dist/matter/shipping-address/address-payload.js.map +1 -0
  327. package/dist/matter/shipping-address/country-descriptors.js +71 -71
  328. package/dist/matter/shipping-address/country-descriptors.js.map +1 -1
  329. package/dist/matter/shipping-address/library-country-descriptors.js +136 -0
  330. package/dist/matter/shipping-address/library-country-descriptors.js.map +1 -0
  331. package/dist/matter/shipping-address/shipping-address.d.ts +312 -45
  332. package/dist/matter/shipping-address/shipping-address.js +443 -188
  333. package/dist/matter/shipping-address/shipping-address.js.map +1 -1
  334. package/dist/matter/shipping-simulator/shipping-simulator.d.ts +251 -25
  335. package/dist/matter/shipping-simulator/shipping-simulator.js +261 -51
  336. package/dist/matter/shipping-simulator/shipping-simulator.js.map +1 -1
  337. package/dist/matter/sign-in/sign-in.d.ts +108 -0
  338. package/dist/matter/sign-in/sign-in.js +285 -0
  339. package/dist/matter/sign-in/sign-in.js.map +1 -0
  340. package/dist/matter/sign-in-disclosure/sign-in-disclosure.d.ts +81 -0
  341. package/dist/matter/sign-in-disclosure/sign-in-disclosure.js +232 -0
  342. package/dist/matter/sign-in-disclosure/sign-in-disclosure.js.map +1 -0
  343. package/dist/matter/sign-in-form/sign-in-form.d.ts +93 -62
  344. package/dist/matter/sign-in-form/sign-in-form.js +134 -144
  345. package/dist/matter/sign-in-form/sign-in-form.js.map +1 -1
  346. package/dist/particles/binding-switcher/binding-switcher.d.ts +59 -0
  347. package/dist/particles/binding-switcher/binding-switcher.js +194 -0
  348. package/dist/particles/binding-switcher/binding-switcher.js.map +1 -0
  349. package/dist/particles/card-summary/card-network.d.ts +17 -0
  350. package/dist/particles/card-summary/card-network.js +25 -0
  351. package/dist/particles/card-summary/card-network.js.map +1 -0
  352. package/dist/particles/card-summary/card-summary.d.ts +113 -0
  353. package/dist/particles/card-summary/card-summary.js +221 -0
  354. package/dist/particles/card-summary/card-summary.js.map +1 -0
  355. package/dist/particles/carousel/carousel.d.ts +99 -11
  356. package/dist/particles/carousel/carousel.js +103 -35
  357. package/dist/particles/carousel/carousel.js.map +1 -1
  358. package/dist/particles/copy-text/copy-text.js +5 -15
  359. package/dist/particles/copy-text/copy-text.js.map +1 -1
  360. package/dist/particles/dialog/dialog.d.ts +14 -6
  361. package/dist/particles/dialog/dialog.js +6 -3
  362. package/dist/particles/dialog/dialog.js.map +1 -1
  363. package/dist/particles/drawer/drawer.js +1 -1
  364. package/dist/particles/drawer/drawer.js.map +1 -1
  365. package/dist/particles/email-field/email-field.d.ts +2 -1
  366. package/dist/particles/email-field/email-field.js +2 -1
  367. package/dist/particles/email-field/email-field.js.map +1 -1
  368. package/dist/particles/footer-link-group/footer-link-group.js +1 -0
  369. package/dist/particles/footer-link-group/footer-link-group.js.map +1 -1
  370. package/dist/particles/footer-social/footer-social.d.ts +1 -1
  371. package/dist/particles/footer-social/footer-social.js +1 -1
  372. package/dist/particles/footer-social/footer-social.js.map +1 -1
  373. package/dist/particles/form/form.d.ts +85 -13
  374. package/dist/particles/form/form.js +91 -42
  375. package/dist/particles/form/form.js.map +1 -1
  376. package/dist/particles/gallery/gallery.d.ts +129 -12
  377. package/dist/particles/gallery/gallery.js +121 -34
  378. package/dist/particles/gallery/gallery.js.map +1 -1
  379. package/dist/particles/incentives/incentives.d.ts +1 -1
  380. package/dist/particles/incentives/incentives.js +1 -1
  381. package/dist/particles/incentives/incentives.js.map +1 -1
  382. package/dist/particles/order-details-back/order-details-back.d.ts +5 -3
  383. package/dist/particles/order-details-back/order-details-back.js +8 -10
  384. package/dist/particles/order-details-back/order-details-back.js.map +1 -1
  385. package/dist/particles/order-status-badge/order-status-badge.d.ts +3 -3
  386. package/dist/particles/order-status-badge/order-status-badge.js +4 -20
  387. package/dist/particles/order-status-badge/order-status-badge.js.map +1 -1
  388. package/dist/particles/password-field/password-field.d.ts +1 -1
  389. package/dist/particles/password-field/password-field.js +2 -4
  390. package/dist/particles/password-field/password-field.js.map +1 -1
  391. package/dist/particles/payment-methods/payment-methods.d.ts +1 -1
  392. package/dist/particles/payment-methods/payment-methods.js +1 -1
  393. package/dist/particles/payment-methods/payment-methods.js.map +1 -1
  394. package/dist/particles/phone-field/phone-field.d.ts +4 -4
  395. package/dist/particles/phone-field/phone-field.js +8 -11
  396. package/dist/particles/phone-field/phone-field.js.map +1 -1
  397. package/dist/particles/spinner/spinner.d.ts +24 -4
  398. package/dist/particles/spinner/spinner.js +25 -9
  399. package/dist/particles/spinner/spinner.js.map +1 -1
  400. package/dist/particles/switch/switch.d.ts +4 -1
  401. package/dist/particles/switch/switch.js +3 -1
  402. package/dist/particles/switch/switch.js.map +1 -1
  403. package/dist/particles/toast/toast.d.ts +49 -9
  404. package/dist/particles/toast/toast.js +81 -15
  405. package/dist/particles/toast/toast.js.map +1 -1
  406. package/dist/schema.graphql +461 -89
  407. package/dist/sdk/actions/index.d.ts +3 -1
  408. package/dist/sdk/actions/index.js +3 -1
  409. package/dist/sdk/actions/locale-action-provider.d.ts +16 -0
  410. package/dist/sdk/actions/locale-action-provider.js +20 -0
  411. package/dist/sdk/actions/locale-action-provider.js.map +1 -0
  412. package/dist/sdk/actions/saved-card-action-provider.d.ts +12 -0
  413. package/dist/sdk/actions/saved-card-action-provider.js +16 -0
  414. package/dist/sdk/actions/saved-card-action-provider.js.map +1 -0
  415. package/dist/sdk/actions/types.d.ts +6 -2
  416. package/dist/sdk/address/address-fields.js +4 -4
  417. package/dist/sdk/address/address-fields.js.map +1 -1
  418. package/dist/sdk/address/constants.js +1 -6
  419. package/dist/sdk/address/constants.js.map +1 -1
  420. package/dist/sdk/address/messages.js +44 -44
  421. package/dist/sdk/address/messages.js.map +1 -1
  422. package/dist/sdk/address/postal-code.js +15 -2
  423. package/dist/sdk/address/postal-code.js.map +1 -1
  424. package/dist/sdk/address/types.d.ts +5 -3
  425. package/dist/sdk/address/validate-address.js +3 -3
  426. package/dist/sdk/address/validate-address.js.map +1 -1
  427. package/dist/sdk/analytics/use-analytics-actions.d.ts +1 -1
  428. package/dist/sdk/analytics/use-analytics-actions.js.map +1 -1
  429. package/dist/sdk/cache/storefront-cache.js +2 -1
  430. package/dist/sdk/cache/storefront-cache.js.map +1 -1
  431. package/dist/sdk/cart/operations.d.ts +2 -1
  432. package/dist/sdk/cart/operations.js +55 -1
  433. package/dist/sdk/cart/operations.js.map +1 -1
  434. package/dist/sdk/cart/optimistic.d.ts +30 -7
  435. package/dist/sdk/cart/optimistic.js +78 -41
  436. package/dist/sdk/cart/optimistic.js.map +1 -1
  437. package/dist/sdk/cart/use-cart-actions.d.ts +7 -0
  438. package/dist/sdk/cart/use-cart-actions.js +61 -15
  439. package/dist/sdk/cart/use-cart-actions.js.map +1 -1
  440. package/dist/sdk/cart/use-cart-sync-sales-channel.js +70 -0
  441. package/dist/sdk/cart/use-cart-sync-sales-channel.js.map +1 -0
  442. package/dist/sdk/data/index.js +2 -2
  443. package/dist/sdk/data/reactive-list-item-data-provider.js +2 -2
  444. package/dist/sdk/generated/gql.js +16 -12
  445. package/dist/sdk/generated/gql.js.map +1 -1
  446. package/dist/sdk/generated/graphql.d.ts +197 -51
  447. package/dist/sdk/generated/graphql.js +2318 -91
  448. package/dist/sdk/generated/graphql.js.map +1 -1
  449. package/dist/sdk/i18n/format-error-code.js +23 -0
  450. package/dist/sdk/i18n/format-error-code.js.map +1 -0
  451. package/dist/sdk/i18n/message-formatter.d.ts +22 -0
  452. package/dist/sdk/i18n/message-formatter.js +140 -0
  453. package/dist/sdk/i18n/message-formatter.js.map +1 -0
  454. package/dist/sdk/i18n/use-message-formatter.d.ts +8 -0
  455. package/dist/sdk/i18n/use-message-formatter.js +18 -0
  456. package/dist/sdk/i18n/use-message-formatter.js.map +1 -0
  457. package/dist/sdk/identity/use-identity-actions.js.map +1 -1
  458. package/dist/sdk/locale/binding-switch-provider.d.ts +13 -0
  459. package/dist/sdk/locale/binding-switch-provider.js +20 -0
  460. package/dist/sdk/locale/binding-switch-provider.js.map +1 -0
  461. package/dist/sdk/locale/use-locale-actions.d.ts +16 -0
  462. package/dist/sdk/locale/use-locale-actions.js +70 -0
  463. package/dist/sdk/locale/use-locale-actions.js.map +1 -0
  464. package/dist/sdk/navigation/binding-switch.d.ts +39 -0
  465. package/dist/sdk/navigation/binding-switch.js +129 -0
  466. package/dist/sdk/navigation/binding-switch.js.map +1 -0
  467. package/dist/sdk/navigation/decode-route-params.d.ts +11 -0
  468. package/dist/sdk/navigation/decode-route-params.js +32 -0
  469. package/dist/sdk/navigation/decode-route-params.js.map +1 -0
  470. package/dist/sdk/navigation/redirect.d.ts +2 -0
  471. package/dist/sdk/navigation/redirect.js +19 -1
  472. package/dist/sdk/navigation/redirect.js.map +1 -1
  473. package/dist/sdk/navigation/types.d.ts +13 -0
  474. package/dist/sdk/payment/bin-format.js +20 -0
  475. package/dist/sdk/payment/bin-format.js.map +1 -0
  476. package/dist/sdk/payment/challenge-return.js +37 -0
  477. package/dist/sdk/payment/challenge-return.js.map +1 -0
  478. package/dist/sdk/payment/confirmation-last-four.js +39 -0
  479. package/dist/sdk/payment/confirmation-last-four.js.map +1 -0
  480. package/dist/sdk/payment/gateway.d.ts +1 -1
  481. package/dist/sdk/payment/gateway.js +8 -2
  482. package/dist/sdk/payment/gateway.js.map +1 -1
  483. package/dist/sdk/payment/operations.d.ts +1 -0
  484. package/dist/sdk/payment/operations.js +28 -6
  485. package/dist/sdk/payment/operations.js.map +1 -1
  486. package/dist/sdk/payment/resumed-purchase.d.ts +1 -0
  487. package/dist/sdk/payment/resumed-purchase.js +119 -0
  488. package/dist/sdk/payment/resumed-purchase.js.map +1 -0
  489. package/dist/sdk/payment/security-code-mask.js +16 -23
  490. package/dist/sdk/payment/security-code-mask.js.map +1 -1
  491. package/dist/sdk/payment/submission-registry.js +6 -2
  492. package/dist/sdk/payment/submission-registry.js.map +1 -1
  493. package/dist/sdk/payment/use-payment-actions.d.ts +18 -3
  494. package/dist/sdk/payment/use-payment-actions.js +23 -3
  495. package/dist/sdk/payment/use-payment-actions.js.map +1 -1
  496. package/dist/sdk/payment/use-place-order.d.ts +10 -2
  497. package/dist/sdk/payment/use-place-order.js +138 -76
  498. package/dist/sdk/payment/use-place-order.js.map +1 -1
  499. package/dist/sdk/provider/storefront-provider.d.ts +1 -7
  500. package/dist/sdk/provider/storefront-provider.js +4 -11
  501. package/dist/sdk/provider/storefront-provider.js.map +1 -1
  502. package/dist/sdk/saved-cards/operations.d.ts +16 -0
  503. package/dist/sdk/saved-cards/operations.js +41 -0
  504. package/dist/sdk/saved-cards/operations.js.map +1 -0
  505. package/dist/sdk/saved-cards/use-saved-card-actions.d.ts +26 -0
  506. package/dist/sdk/saved-cards/use-saved-card-actions.js +86 -0
  507. package/dist/sdk/saved-cards/use-saved-card-actions.js.map +1 -0
  508. package/dist/sdk/seo/entity-landing.d.ts +24 -0
  509. package/dist/sdk/seo/entity-landing.js +30 -0
  510. package/dist/sdk/seo/entity-landing.js.map +1 -0
  511. package/dist/sdk/seo/page-alternates.d.ts +8 -5
  512. package/dist/sdk/seo/page-alternates.js +11 -14
  513. package/dist/sdk/seo/page-alternates.js.map +1 -1
  514. package/dist/sdk/seo/search-landing.d.ts +42 -0
  515. package/dist/sdk/seo/search-landing.js +85 -0
  516. package/dist/sdk/seo/search-landing.js.map +1 -0
  517. package/dist/sdk/session/mock-session.d.ts +9 -0
  518. package/dist/sdk/session/mock-session.js +31 -0
  519. package/dist/sdk/session/mock-session.js.map +1 -0
  520. package/dist/sdk/session/read-server-session.d.ts +3 -0
  521. package/dist/sdk/session/read-server-session.js +5 -0
  522. package/dist/sdk/session/read-server-session.js.map +1 -1
  523. package/dist/sdk/session/return-path-segment.d.ts +10 -0
  524. package/dist/sdk/session/return-path-segment.js +15 -0
  525. package/dist/sdk/session/return-path-segment.js.map +1 -0
  526. package/dist/sdk/session/use-session-actions.js.map +1 -1
  527. package/dist/sdk/shipping/shipping-operations.d.ts +1 -1
  528. package/dist/sdk/shipping/shipping-operations.js +13 -0
  529. package/dist/sdk/shipping/shipping-operations.js.map +1 -1
  530. package/dist/sdk/shipping/use-cart-shipping-simulation.js.map +1 -1
  531. package/dist/sdk/shipping/use-shipping-actions.js.map +1 -1
  532. package/dist/sdk/shipping/use-shipping-simulation.js.map +1 -1
  533. package/dist/sdk/state/cart.d.ts +9 -2
  534. package/dist/sdk/state/cart.js +9 -2
  535. package/dist/sdk/state/cart.js.map +1 -1
  536. package/dist/utils/safe-href.d.ts +2 -0
  537. package/package.json +4 -3
  538. package/skills/storefront-asset/SKILL.md +2 -2
  539. package/skills/storefront-asset/references/api-side.md +27 -14
  540. package/skills/storefront-asset/references/findings.md +5 -2
  541. package/src/styles/tailwind.css +9 -2
  542. package/dist/matter/shipping-address/country-descriptors.d.ts +0 -1
  543. package/dist/message-locales.json +0 -7
  544. package/dist/sdk/i18n/client.d.ts +0 -4
  545. package/dist/sdk/i18n/client.js +0 -4
  546. package/dist/sdk/i18n/locales.d.ts +0 -8
  547. package/dist/sdk/i18n/locales.js +0 -57
  548. package/dist/sdk/i18n/locales.js.map +0 -1
  549. package/dist/sdk/i18n/messages/en-US.js +0 -164
  550. package/dist/sdk/i18n/messages/en-US.js.map +0 -1
  551. package/dist/sdk/i18n/messages/en-US.json +0 -159
  552. package/dist/sdk/i18n/messages/en-US.json.d.ts +0 -163
  553. package/dist/sdk/i18n/messages/es-ES.js +0 -164
  554. package/dist/sdk/i18n/messages/es-ES.js.map +0 -1
  555. package/dist/sdk/i18n/messages/es-ES.json +0 -159
  556. package/dist/sdk/i18n/messages/pt-BR.js +0 -164
  557. package/dist/sdk/i18n/messages/pt-BR.js.map +0 -1
  558. package/dist/sdk/i18n/messages/pt-BR.json +0 -159
  559. package/dist/sdk/i18n/provider.d.ts +0 -1
  560. package/dist/sdk/i18n/provider.js +0 -30
  561. package/dist/sdk/i18n/provider.js.map +0 -1
  562. package/dist/sdk/i18n/server.d.ts +0 -28
  563. package/dist/sdk/i18n/server.js +0 -59
  564. package/dist/sdk/i18n/server.js.map +0 -1
  565. package/dist/utils/resolve-authored-copy.js +0 -18
  566. package/dist/utils/resolve-authored-copy.js.map +0 -1
  567. package/dist/utils/substitute-template.js +0 -33
  568. package/dist/utils/substitute-template.js.map +0 -1
@@ -1,9 +1,12 @@
1
1
  "use client";
2
2
  import { defineComponent } from "../../core/dist/define-component.js";
3
+ import { defineContentType } from "../../core/dist/define-content-type.js";
3
4
  import "../../core/dist/index.js";
5
+ import { useMessageFormatter } from "../../sdk/i18n/use-message-formatter.js";
4
6
  import { Checkbox } from "../../particles/checkbox/checkbox.js";
5
7
  import { Field } from "../../particles/field/field.js";
6
8
  import { useActionsOverride } from "../../sdk/actions/actions-override-context.js";
9
+ import { formatErrorCode } from "../../sdk/i18n/format-error-code.js";
7
10
  import { useDataOverride } from "../../sdk/data/data-override-context.js";
8
11
  import { useSession } from "../session/session.js";
9
12
  import { Icon } from "../../particles/icon/icon.js";
@@ -39,10 +42,58 @@ const fragment = `
39
42
  }
40
43
  }
41
44
  `;
45
+ const SaveCardContent = defineContentType({
46
+ id: "save-card",
47
+ title: "Save Card",
48
+ description: "Copy for the save-card toggle, its consent notice, the nickname field and a refused consent write.",
49
+ schema: {
50
+ type: "object",
51
+ additionalProperties: false,
52
+ properties: {
53
+ label: {
54
+ type: "string",
55
+ title: "Toggle label",
56
+ format: "icu-message",
57
+ messageSource: "Save this card for next time"
58
+ },
59
+ nicknameLabel: {
60
+ type: "string",
61
+ title: "Nickname field label",
62
+ description: "Rendered only while the toggle is checked.",
63
+ format: "icu-message",
64
+ messageSource: "Card nickname"
65
+ },
66
+ consentNoticeLabel: {
67
+ type: "string",
68
+ title: "Consent notice",
69
+ description: "Shown beside the toggle until the shopper has granted the save-personal-data consent.",
70
+ format: "icu-message",
71
+ messageSource: "Checking this also lets us store your personal data for future purchases."
72
+ },
73
+ genericErrorMessage: {
74
+ type: "string",
75
+ title: "Consent write failure message",
76
+ description: "Shown when the consent write fails: a network failure or a fault the shopper cannot fix.",
77
+ format: "icu-message",
78
+ messageSource: "Unable to save your card preference. Please try again."
79
+ }
80
+ }
81
+ }
82
+ });
42
83
  /** Legacy's own cap (`CardLabelInputForm.tsx:15`, `fastcheckout@cd09bec3`), carried here as a plain
43
84
  * HTML `maxLength` rather than a schema prop — schema entries are authorable copy, not behavior. */
44
85
  const NICKNAME_MAX_LENGTH = 50;
45
86
  /**
87
+ * The message for each code the consent write can return. None is one the shopper can act on, so all share
88
+ * one message, as does a code this map does not know.
89
+ */
90
+ const SAVE_CARD_ERROR_FIELDS = {
91
+ MISSING_CART_CONTEXT: "genericErrorMessage",
92
+ CART_NOT_FOUND: "genericErrorMessage",
93
+ NO_PREFERENCE_PROVIDED: "genericErrorMessage",
94
+ NETWORK_ERROR: "genericErrorMessage"
95
+ };
96
+ /**
46
97
  * Whether the control should render at all. Requires BOTH `!loading` and `state === 'loggedIn'` —
47
98
  * `useSession()` forces `state: 'anonymous'` while loading (the least-privileged default), so this
48
99
  * reads correctly today even on `state` alone, but checking `loading` explicitly makes that
@@ -71,41 +122,28 @@ const SaveCardDefinition = defineComponent({
71
122
  fetchStrategy: "reactive",
72
123
  requiresContext: ["payment", "session"],
73
124
  actions: { payment: ["saveCard"] },
125
+ content: SaveCardContent,
74
126
  editor: {
75
127
  label: "Save Card",
76
128
  category: "commerce"
77
129
  },
78
130
  schema: {
79
- label: {
80
- type: "string",
81
- default: "Save this card for next time",
82
- label: "Toggle label"
83
- },
84
- nicknameLabel: {
85
- type: "string",
86
- default: "Card nickname",
87
- label: "Nickname field label"
88
- },
89
131
  nicknamePlaceholder: {
90
132
  type: "string",
91
133
  label: "Nickname field placeholder"
92
134
  },
93
- consentNoticeLabel: {
94
- type: "string",
95
- default: "Checking this also lets us store your personal data for future purchases.",
96
- label: "Consent notice label"
97
- },
98
135
  disabled: {
99
136
  type: "boolean",
100
137
  default: false,
101
138
  label: "Disabled"
102
139
  }
103
140
  },
104
- guideline: "Opt-in save-card control for authenticated shoppers only: off by default; checking it writes the draft save-card flag/label AND grants the broader save-personal-data consent ($actions.payment.saveCard(true)); unchecking clears only the draft flag and never revokes that consent (see save-card-control.md Decision 1). The nickname field appears only while checked. Must be inside both a PaymentSectionRoot/PaymentSectionController (T5) and a SessionRoot — self-gates to null while the session is loading or the shopper is not logged in. Renders no card data; the flag and label are folded into the card object by CardEntry/SavedCards at submit time."
141
+ guideline: "Opt-in save-card control for authenticated shoppers only: off by default; checking it writes the draft save-card flag/label AND grants the broader save-personal-data consent ($actions.payment.saveCard(true)); unchecking clears only the draft flag and never revokes that consent (see save-card-control.md Decision 1). The nickname field appears only while checked. Its copy comes from the $content fields label, nicknameLabel and consentNoticeLabel; a refused consent write shows genericErrorMessage. Must be inside both a PaymentSectionRoot/PaymentSectionController (T5) and a SessionRoot — self-gates to null while the session is loading or the shopper is not logged in. Renders no card data; the flag and label are folded into the card object by CardEntry/SavedCards at submit time."
105
142
  });
106
- function SaveCard({ label = "Save this card for next time", nicknameLabel = "Card nickname", nicknamePlaceholder, consentNoticeLabel = "Checking this also lets us store your personal data for future purchases.", disabled = false, className, $data: $dataProp, $actions: $actionsProp, ...props }) {
143
+ function SaveCard({ nicknamePlaceholder, disabled = false, className, $content, $locale, $data: $dataProp, $actions: $actionsProp, ...props }) {
107
144
  const $data = useDataOverride($dataProp);
108
145
  const $actions = useActionsOverride($actionsProp);
146
+ const { format } = useMessageFormatter(SaveCardContent, $content);
109
147
  const { state, loading } = useSession();
110
148
  const { draft, setDraftSaveCard, setDraftCardLabel, placing, cardPaymentCollapsed } = usePayment();
111
149
  const [pending, setPending] = useState(false);
@@ -125,7 +163,7 @@ function SaveCard({ label = "Save this card for next time", nicknameLabel = "Car
125
163
  setPending(true);
126
164
  try {
127
165
  const [firstError] = await saveCard(true);
128
- if (firstError) setConsentError(firstError.message);
166
+ if (firstError) setConsentError(firstError);
129
167
  } finally {
130
168
  setPending(false);
131
169
  }
@@ -153,10 +191,10 @@ function SaveCard({ label = "Save this card for next time", nicknameLabel = "Car
153
191
  onCheckedChange: handleCheckedChange,
154
192
  disabled: fieldDisabled,
155
193
  children: /* @__PURE__ */ jsx(Checkbox.Indicator, { children: /* @__PURE__ */ jsx(Icon, { name: "checked" }) })
156
- }), label] })
194
+ }), format("label")] })
157
195
  }), isConsentNoticeVisible($data?.savePersonalData) ? /* @__PURE__ */ jsx("p", {
158
196
  "data-fs-save-card-consent-notice": "",
159
- children: consentNoticeLabel
197
+ children: format("consentNoticeLabel")
160
198
  }) : null]
161
199
  }),
162
200
  checked ? /* @__PURE__ */ jsx("div", {
@@ -164,7 +202,7 @@ function SaveCard({ label = "Save this card for next time", nicknameLabel = "Car
164
202
  children: /* @__PURE__ */ jsxs(Field.Root, {
165
203
  disabled: fieldDisabled,
166
204
  "data-fs-field-root": "",
167
- children: [/* @__PURE__ */ jsx(Field.Label, { children: nicknameLabel }), /* @__PURE__ */ jsx(Field.Control, {
205
+ children: [/* @__PURE__ */ jsx(Field.Label, { children: format("nicknameLabel") }), /* @__PURE__ */ jsx(Field.Control, {
168
206
  name: "cardLabel",
169
207
  placeholder: nicknamePlaceholder,
170
208
  value: draft.cardLabel ?? "",
@@ -177,12 +215,12 @@ function SaveCard({ label = "Save this card for next time", nicknameLabel = "Car
177
215
  consentError ? /* @__PURE__ */ jsx("div", {
178
216
  role: "alert",
179
217
  "data-fs-save-card-error": "",
180
- children: consentError
218
+ children: formatErrorCode(SaveCardContent, SAVE_CARD_ERROR_FIELDS, consentError, format, "genericErrorMessage")
181
219
  }) : null
182
220
  ]
183
221
  });
184
222
  }
185
223
  //#endregion
186
- export { SaveCard, SaveCardDefinition, isConsentNoticeVisible, isSaveCardVisible };
224
+ export { SAVE_CARD_ERROR_FIELDS, SaveCard, SaveCardContent, SaveCardDefinition, isConsentNoticeVisible, isSaveCardVisible };
187
225
 
188
226
  //# sourceMappingURL=save-card.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"save-card.js","names":[],"sources":["../../../src/matter/save-card/save-card.tsx"],"sourcesContent":["'use client';\n\nimport { defineComponent } from '@vtex/fs-core';\nimport type { ChangeEvent, ComponentPropsWithRef } from 'react';\nimport { useState } from 'react';\nimport { Checkbox } from '../../particles/checkbox/checkbox.js';\nimport { Field } from '../../particles/field/field.js';\nimport { Icon } from '../../particles/icon/icon.js';\nimport { useActionsOverride } from '../../sdk/actions/actions-override-context.js';\nimport type { ComponentActions } from '../../sdk/actions/types.js';\nimport { useDataOverride } from '../../sdk/data/data-override-context.js';\nimport { usePayment } from '../payment/payment.js';\nimport { type SessionContextValue, useSession } from '../session/session.js';\n\n/**\n * The `SaveCard` matter (specs/save-card-control.md, T10 of the Credit Card epic;\n * docs/features/credit-card/rfc.md § D5). Composes `Checkbox` + `Field` into an opt-in, off-by-default\n * toggle plus a custom nickname field, visible only to an authenticated shopper.\n *\n * Writes exactly two client-only facts T7 already provisioned on `PaymentDraft`\n * (`setDraftSaveCard` / `setDraftCardLabel`, via `usePayment()`) — this component never registers on\n * the submission channel and never calls `sendPayments`. `CardEntry` (T7) folds both facts into the\n * card object at submit time (`card-entry.tsx:639-640`); the saved-card path does NOT, because it\n * submits `{ kind: 'saved', accountId, bin, securityCode }` (`saved-cards.tsx:355`) and\n * `PaymentGatewaySavedCard` (`sdk/payment/gateway.ts:103-111`) declares no field either fact could\n * occupy. So on that path both draft writes are inert while the consent below is still granted\n * account-wide. Checking the toggle grants the account-level data-storage consent a saved card\n * requires (`$actions.payment.saveCard(true)`); unchecking never revokes it — see specs/save-card-control.md Decision 1 for the rationale and the\n * last-write-wins hazard against `SavePersonalDataOptInControl`, which writes the same field.\n *\n * Self-gates on `useSession()` (never `SessionGuard`) and requires BOTH the `payment` and `session`\n * contexts — the first component in this package to declare `requiresContext` as an array (Decision 4).\n */\n\n// ---------------------------------------------------------------------------\n// GraphQL Fragment — raw template literal, matching `card-entry.tsx`'s / `payment.tsx`'s convention;\n// the codegen `documents` glob does not scan `src/matter/save-card*`. Deliberately its OWN fragment,\n// never composed under `ClientPreferencesRoot` — that Root's section context is built from a wrapped\n// `$data?.clientPreferences?.savePersonalData` read that is always `false` at runtime for an arity-1\n// fragment (ADR-0015), a live, pre-existing defect this component must not inherit\n// (specs/save-card-control.md Decision 2).\n// ---------------------------------------------------------------------------\n\nconst fragment = /* GraphQL */ `\n fragment SaveCardData on Query {\n clientPreferences {\n __typename\n id\n savePersonalData\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** The `$data` slice forwarded by the reactive runtime — the unwrapped `ClientPreferences` entity\n * (arity-1 fragment, ADR-0015): the value of the fragment's own `clientPreferences` top-level field,\n * never the wrapping `{ clientPreferences: ... }` shape. Mirrors `card-entry.tsx`'s / `saved-cards.tsx`'s\n * identical arity-1 contract. */\nexport type SaveCardData = {\n savePersonalData?: boolean | null;\n} | null;\n\nexport type SaveCardProps = Omit<ComponentPropsWithRef<'div'>, 'children'> & {\n /** The toggle's own accessible label. */\n label?: string;\n /** Label for the nickname field. Rendered only while the toggle is checked. */\n nicknameLabel?: string;\n nicknamePlaceholder?: string;\n /** Shown beside the toggle while `savePersonalData !== true` (covers both `false` and `null`). */\n consentNoticeLabel?: string;\n /** Disables both the toggle and the nickname field. */\n disabled?: boolean;\n /** This component's own `clientPreferences` slice (arity-1 fragment, ADR-0015). */\n $data?: SaveCardData;\n /** Compiler-injected action surface; carries `payment.saveCard`. */\n $actions?: ComponentActions;\n};\n\n/** Legacy's own cap (`CardLabelInputForm.tsx:15`, `fastcheckout@cd09bec3`), carried here as a plain\n * HTML `maxLength` rather than a schema prop — schema entries are authorable copy, not behavior. */\nconst NICKNAME_MAX_LENGTH = 50;\n\n// ---------------------------------------------------------------------------\n// Pure decision functions — exported so the gate and the tri-state collapse are unit-testable\n// independent of any rendering (specs/save-card-control.md § Resolution logic).\n// ---------------------------------------------------------------------------\n\n/**\n * Whether the control should render at all. Requires BOTH `!loading` and `state === 'loggedIn'` —\n * `useSession()` forces `state: 'anonymous'` while loading (the least-privileged default), so this\n * reads correctly today even on `state` alone, but checking `loading` explicitly makes that\n * invariant load-bearing in this component's own code rather than incidental to `session.tsx`'s\n * current implementation. Takes no closure over component state, so it is safe to call fresh on\n * every render — this is what lets the control appear the instant a loading session resolves to a\n * logged-in shopper, with no stuck-hidden state (specs/save-card-control.md § NFR-1).\n */\nexport function isSaveCardVisible({ loading, state }: Pick<SessionContextValue, 'loading' | 'state'>): boolean {\n return !loading && state === 'loggedIn';\n}\n\n/**\n * Whether the consent notice should render. Collapses `null` (\"the shopper has never chosen\") and\n * `false` (\"explicitly declined at some point\") into the same \"not yet granted\" outcome — checking\n * the toggle is a new grant either way, from this control's point of view\n * (specs/save-card-control.md Decision 2).\n */\nexport function isConsentNoticeVisible(savePersonalData: boolean | null | undefined): boolean {\n return savePersonalData !== true;\n}\n\n// ---------------------------------------------------------------------------\n// Definition\n// ---------------------------------------------------------------------------\n\nexport const SaveCardDefinition = defineComponent<SaveCardProps>({\n name: 'SaveCard',\n importPath: '@vtex/faststore/components',\n component: SaveCard,\n fragment,\n fetchStrategy: 'reactive',\n requiresContext: ['payment', 'session'],\n actions: { payment: ['saveCard'] },\n editor: { label: 'Save Card', category: 'commerce' },\n schema: {\n label: { type: 'string', default: 'Save this card for next time', label: 'Toggle label' },\n nicknameLabel: { type: 'string', default: 'Card nickname', label: 'Nickname field label' },\n nicknamePlaceholder: { type: 'string', label: 'Nickname field placeholder' },\n consentNoticeLabel: {\n type: 'string',\n default: 'Checking this also lets us store your personal data for future purchases.',\n label: 'Consent notice label',\n },\n disabled: { type: 'boolean', default: false, label: 'Disabled' },\n },\n guideline:\n 'Opt-in save-card control for authenticated shoppers only: off by default; checking it writes the draft save-card flag/label AND grants the broader save-personal-data consent ($actions.payment.saveCard(true)); unchecking clears only the draft flag and never revokes that consent (see save-card-control.md Decision 1). The nickname field appears only while checked. Must be inside both a PaymentSectionRoot/PaymentSectionController (T5) and a SessionRoot — self-gates to null while the session is loading or the shopper is not logged in. Renders no card data; the flag and label are folded into the card object by CardEntry/SavedCards at submit time.',\n});\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nexport function SaveCard({\n label = 'Save this card for next time',\n nicknameLabel = 'Card nickname',\n nicknamePlaceholder,\n consentNoticeLabel = 'Checking this also lets us store your personal data for future purchases.',\n disabled = false,\n className,\n $data: $dataProp,\n $actions: $actionsProp,\n ...props\n}: SaveCardProps) {\n const $data = useDataOverride($dataProp);\n const $actions = useActionsOverride($actionsProp);\n // Also enforces the SessionRoot ancestor: useSession() throws when rendered outside one.\n const { state, loading } = useSession();\n // Also enforces the PaymentSectionRoot/PaymentSectionController ancestor: usePayment() throws\n // when rendered outside one.\n const { draft, setDraftSaveCard, setDraftCardLabel, placing, cardPaymentCollapsed } = usePayment();\n\n const [pending, setPending] = useState(false);\n const [consentError, setConsentError] = useState<string | null>(null);\n\n // Both hooks above are called unconditionally, before this early return, so neither context\n // requirement is skipped depending on the auth state. T191 (FR-7, Decision 3): nothing renders while\n // the card payment is collapsed either; the flag and label stay on `draft` for when it comes back.\n if (cardPaymentCollapsed || !isSaveCardVisible({ loading, state })) return null;\n\n const checked = draft.saveCard ?? false;\n const fieldDisabled = disabled || pending;\n\n async function handleCheckedChange(next: boolean) {\n setDraftSaveCard(next);\n setConsentError(null);\n // Decision 1: unchecking withdraws only this transaction's local intent — no dispatch of any\n // kind, so a standing `savePersonalData` consent an unrelated control granted is never touched.\n if (!next) return;\n\n const saveCard = $actions?.payment?.saveCard;\n // Silent no-op when the action namespace is not injected, mirroring\n // `usePaymentMethodSelection.selectMethod`'s \"no-op (no error, no throw)\" convention — this is a\n // soft, consent-adjacent write, not the PCI-critical submission itself.\n if (!saveCard) return;\n\n setPending(true);\n try {\n const userErrors = await saveCard(true);\n const [firstError] = userErrors;\n if (firstError) setConsentError(firstError.message);\n } finally {\n setPending(false);\n }\n }\n\n function handleNicknameChange(event: ChangeEvent<HTMLInputElement>) {\n const raw = event.target.value.slice(0, NICKNAME_MAX_LENGTH);\n // Normalizes an emptied field to `null`, never `''` — matches `PaymentDraft`'s existing\n // \"always present, null means absent\" idiom for `bin`/`path`.\n setDraftCardLabel(raw.length > 0 ? raw : null);\n }\n\n return (\n <div\n {...props}\n className={className}\n inert={placing}\n aria-disabled={placing || undefined}\n data-fs-save-card=\"\"\n {...(placing ? { 'data-fs-save-card-placing': '' } : {})}\n {...(pending ? { 'data-fs-save-card-pending': '' } : {})}\n >\n <div data-fs-save-card-toggle-field=\"\">\n <Field.Root disabled={fieldDisabled} data-fs-field-root=\"\">\n <Field.Label>\n <Checkbox.Root checked={checked} onCheckedChange={handleCheckedChange} disabled={fieldDisabled}>\n <Checkbox.Indicator>\n <Icon name=\"checked\" />\n </Checkbox.Indicator>\n </Checkbox.Root>\n {label}\n </Field.Label>\n </Field.Root>\n {isConsentNoticeVisible($data?.savePersonalData) ? (\n <p data-fs-save-card-consent-notice=\"\">{consentNoticeLabel}</p>\n ) : null}\n </div>\n\n {checked ? (\n <div data-fs-save-card-nickname-field=\"\">\n <Field.Root disabled={fieldDisabled} data-fs-field-root=\"\">\n <Field.Label>{nicknameLabel}</Field.Label>\n <Field.Control\n name=\"cardLabel\"\n placeholder={nicknamePlaceholder}\n value={draft.cardLabel ?? ''}\n onChange={handleNicknameChange}\n disabled={fieldDisabled}\n maxLength={NICKNAME_MAX_LENGTH}\n />\n </Field.Root>\n </div>\n ) : null}\n\n {consentError ? (\n <div role=\"alert\" data-fs-save-card-error=\"\">\n {consentError}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"save-card.js","names":[],"sources":["../../../src/matter/save-card/save-card.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ContentValue,\n defineComponent,\n defineContentType,\n type MessageFieldName,\n type MessageLocaleProp,\n} from '@vtex/fs-core';\nimport type { ChangeEvent, ComponentPropsWithRef } from 'react';\nimport { useState } from 'react';\nimport { Checkbox } from '../../particles/checkbox/checkbox.js';\nimport { Field } from '../../particles/field/field.js';\nimport { Icon } from '../../particles/icon/icon.js';\nimport { useActionsOverride } from '../../sdk/actions/actions-override-context.js';\nimport type { ComponentActions } from '../../sdk/actions/types.js';\nimport { useDataOverride } from '../../sdk/data/data-override-context.js';\nimport { formatErrorCode } from '../../sdk/i18n/format-error-code.js';\nimport { useMessageFormatter } from '../../sdk/i18n/use-message-formatter.js';\nimport type { PaymentUserError } from '../../sdk/payment/operations.js';\nimport { usePayment } from '../payment/payment.js';\nimport { type SessionContextValue, useSession } from '../session/session.js';\n\n/**\n * The `SaveCard` matter (specs/save-card-control.md, T10 of the Credit Card epic;\n * docs/features/credit-card/rfc.md § D5). Composes `Checkbox` + `Field` into an opt-in, off-by-default\n * toggle plus a custom nickname field, visible only to an authenticated shopper.\n *\n * Writes exactly two client-only facts T7 already provisioned on `PaymentDraft`\n * (`setDraftSaveCard` / `setDraftCardLabel`, via `usePayment()`) — this component never registers on\n * the submission channel and never calls `sendPayments`. `CardEntry` (T7) folds both facts into the\n * card object at submit time (`card-entry.tsx:639-640`); the saved-card path does NOT, because it\n * submits `{ kind: 'saved', accountId, bin, securityCode }` (`saved-cards.tsx:355`) and\n * `PaymentGatewaySavedCard` (`sdk/payment/gateway.ts:103-111`) declares no field either fact could\n * occupy. So on that path both draft writes are inert while the consent below is still granted\n * account-wide. Checking the toggle grants the account-level data-storage consent a saved card\n * requires (`$actions.payment.saveCard(true)`); unchecking never revokes it — see specs/save-card-control.md Decision 1 for the rationale and the\n * last-write-wins hazard against `SavePersonalDataOptInControl`, which writes the same field.\n *\n * Self-gates on `useSession()` (never `SessionGuard`) and requires BOTH the `payment` and `session`\n * contexts — the first component in this package to declare `requiresContext` as an array (Decision 4).\n */\n\n// ---------------------------------------------------------------------------\n// GraphQL Fragment — raw template literal, matching `card-entry.tsx`'s / `payment.tsx`'s convention;\n// the codegen `documents` glob does not scan `src/matter/save-card*`. Deliberately its OWN fragment,\n// never composed under `ClientPreferencesRoot` — that Root's section context is built from a wrapped\n// `$data?.clientPreferences?.savePersonalData` read that is always `false` at runtime for an arity-1\n// fragment (ADR-0015), a live, pre-existing defect this component must not inherit\n// (specs/save-card-control.md Decision 2).\n// ---------------------------------------------------------------------------\n\nconst fragment = /* GraphQL */ `\n fragment SaveCardData on Query {\n clientPreferences {\n __typename\n id\n savePersonalData\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** The `$data` slice forwarded by the reactive runtime — the unwrapped `ClientPreferences` entity\n * (arity-1 fragment, ADR-0015): the value of the fragment's own `clientPreferences` top-level field,\n * never the wrapping `{ clientPreferences: ... }` shape. Mirrors `card-entry.tsx`'s / `saved-cards.tsx`'s\n * identical arity-1 contract. */\nexport type SaveCardData = {\n savePersonalData?: boolean | null;\n} | null;\n\nexport const SaveCardContent = defineContentType({\n id: 'save-card',\n title: 'Save Card',\n description: 'Copy for the save-card toggle, its consent notice, the nickname field and a refused consent write.',\n schema: {\n type: 'object',\n additionalProperties: false,\n properties: {\n label: {\n type: 'string',\n title: 'Toggle label',\n format: 'icu-message',\n messageSource: 'Save this card for next time',\n },\n nicknameLabel: {\n type: 'string',\n title: 'Nickname field label',\n description: 'Rendered only while the toggle is checked.',\n format: 'icu-message',\n messageSource: 'Card nickname',\n },\n consentNoticeLabel: {\n type: 'string',\n title: 'Consent notice',\n description: 'Shown beside the toggle until the shopper has granted the save-personal-data consent.',\n format: 'icu-message',\n messageSource: 'Checking this also lets us store your personal data for future purchases.',\n },\n genericErrorMessage: {\n type: 'string',\n title: 'Consent write failure message',\n description: 'Shown when the consent write fails: a network failure or a fault the shopper cannot fix.',\n format: 'icu-message',\n messageSource: 'Unable to save your card preference. Please try again.',\n },\n },\n },\n});\n\nexport type SaveCardProps = Omit<ComponentPropsWithRef<'div'>, 'children'> &\n MessageLocaleProp & {\n nicknamePlaceholder?: string;\n /** Disables both the toggle and the nickname field. */\n disabled?: boolean;\n /** Merchant-authored copy: the toggle label, the nickname field label, the consent notice and the write error. */\n $content?: ContentValue<typeof SaveCardContent>;\n /** This component's own `clientPreferences` slice (arity-1 fragment, ADR-0015). */\n $data?: SaveCardData;\n /** Compiler-injected action surface; carries `payment.saveCard`. */\n $actions?: ComponentActions;\n };\n\n/** Legacy's own cap (`CardLabelInputForm.tsx:15`, `fastcheckout@cd09bec3`), carried here as a plain\n * HTML `maxLength` rather than a schema prop — schema entries are authorable copy, not behavior. */\nconst NICKNAME_MAX_LENGTH = 50;\n\n/** The `ClientPreferencesUpdateErrorCode` values plus the client-minted transport failure. */\ntype SaveCardErrorCode = 'MISSING_CART_CONTEXT' | 'CART_NOT_FOUND' | 'NO_PREFERENCE_PROVIDED' | 'NETWORK_ERROR';\n\n/**\n * The message for each code the consent write can return. None is one the shopper can act on, so all share\n * one message, as does a code this map does not know.\n */\nexport const SAVE_CARD_ERROR_FIELDS = {\n MISSING_CART_CONTEXT: 'genericErrorMessage',\n CART_NOT_FOUND: 'genericErrorMessage',\n NO_PREFERENCE_PROVIDED: 'genericErrorMessage',\n NETWORK_ERROR: 'genericErrorMessage',\n} as const satisfies Record<SaveCardErrorCode, MessageFieldName<typeof SaveCardContent>>;\n\n// ---------------------------------------------------------------------------\n// Pure decision functions — exported so the gate and the tri-state collapse are unit-testable\n// independent of any rendering (specs/save-card-control.md § Resolution logic).\n// ---------------------------------------------------------------------------\n\n/**\n * Whether the control should render at all. Requires BOTH `!loading` and `state === 'loggedIn'` —\n * `useSession()` forces `state: 'anonymous'` while loading (the least-privileged default), so this\n * reads correctly today even on `state` alone, but checking `loading` explicitly makes that\n * invariant load-bearing in this component's own code rather than incidental to `session.tsx`'s\n * current implementation. Takes no closure over component state, so it is safe to call fresh on\n * every render — this is what lets the control appear the instant a loading session resolves to a\n * logged-in shopper, with no stuck-hidden state (specs/save-card-control.md § NFR-1).\n */\nexport function isSaveCardVisible({ loading, state }: Pick<SessionContextValue, 'loading' | 'state'>): boolean {\n return !loading && state === 'loggedIn';\n}\n\n/**\n * Whether the consent notice should render. Collapses `null` (\"the shopper has never chosen\") and\n * `false` (\"explicitly declined at some point\") into the same \"not yet granted\" outcome — checking\n * the toggle is a new grant either way, from this control's point of view\n * (specs/save-card-control.md Decision 2).\n */\nexport function isConsentNoticeVisible(savePersonalData: boolean | null | undefined): boolean {\n return savePersonalData !== true;\n}\n\n// ---------------------------------------------------------------------------\n// Definition\n// ---------------------------------------------------------------------------\n\nexport const SaveCardDefinition = defineComponent<SaveCardProps>({\n name: 'SaveCard',\n importPath: '@vtex/faststore/components',\n component: SaveCard,\n fragment,\n fetchStrategy: 'reactive',\n requiresContext: ['payment', 'session'],\n actions: { payment: ['saveCard'] },\n content: SaveCardContent,\n editor: { label: 'Save Card', category: 'commerce' },\n schema: {\n nicknamePlaceholder: { type: 'string', label: 'Nickname field placeholder' },\n disabled: { type: 'boolean', default: false, label: 'Disabled' },\n },\n guideline:\n 'Opt-in save-card control for authenticated shoppers only: off by default; checking it writes the draft save-card flag/label AND grants the broader save-personal-data consent ($actions.payment.saveCard(true)); unchecking clears only the draft flag and never revokes that consent (see save-card-control.md Decision 1). The nickname field appears only while checked. Its copy comes from the $content fields label, nicknameLabel and consentNoticeLabel; a refused consent write shows genericErrorMessage. Must be inside both a PaymentSectionRoot/PaymentSectionController (T5) and a SessionRoot — self-gates to null while the session is loading or the shopper is not logged in. Renders no card data; the flag and label are folded into the card object by CardEntry/SavedCards at submit time.',\n});\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nexport function SaveCard({\n nicknamePlaceholder,\n disabled = false,\n className,\n $content,\n $locale,\n $data: $dataProp,\n $actions: $actionsProp,\n ...props\n}: SaveCardProps) {\n const $data = useDataOverride($dataProp);\n const $actions = useActionsOverride($actionsProp);\n const { format } = useMessageFormatter(SaveCardContent, $content);\n // Also enforces the SessionRoot ancestor: useSession() throws when rendered outside one.\n const { state, loading } = useSession();\n // Also enforces the PaymentSectionRoot/PaymentSectionController ancestor: usePayment() throws\n // when rendered outside one.\n const { draft, setDraftSaveCard, setDraftCardLabel, placing, cardPaymentCollapsed } = usePayment();\n\n const [pending, setPending] = useState(false);\n const [consentError, setConsentError] = useState<PaymentUserError | null>(null);\n\n // Both hooks above are called unconditionally, before this early return, so neither context\n // requirement is skipped depending on the auth state. T191 (FR-7, Decision 3): nothing renders while\n // the card payment is collapsed either; the flag and label stay on `draft` for when it comes back.\n if (cardPaymentCollapsed || !isSaveCardVisible({ loading, state })) return null;\n\n const checked = draft.saveCard ?? false;\n const fieldDisabled = disabled || pending;\n\n async function handleCheckedChange(next: boolean) {\n setDraftSaveCard(next);\n setConsentError(null);\n // Decision 1: unchecking withdraws only this transaction's local intent — no dispatch of any\n // kind, so a standing `savePersonalData` consent an unrelated control granted is never touched.\n if (!next) return;\n\n const saveCard = $actions?.payment?.saveCard;\n // Silent no-op when the action namespace is not injected, mirroring\n // `usePaymentMethodSelection.selectMethod`'s \"no-op (no error, no throw)\" convention — this is a\n // soft, consent-adjacent write, not the PCI-critical submission itself.\n if (!saveCard) return;\n\n setPending(true);\n try {\n const userErrors = await saveCard(true);\n const [firstError] = userErrors;\n if (firstError) setConsentError(firstError);\n } finally {\n setPending(false);\n }\n }\n\n function handleNicknameChange(event: ChangeEvent<HTMLInputElement>) {\n const raw = event.target.value.slice(0, NICKNAME_MAX_LENGTH);\n // Normalizes an emptied field to `null`, never `''` — matches `PaymentDraft`'s existing\n // \"always present, null means absent\" idiom for `bin`/`path`.\n setDraftCardLabel(raw.length > 0 ? raw : null);\n }\n\n return (\n <div\n {...props}\n className={className}\n inert={placing}\n aria-disabled={placing || undefined}\n data-fs-save-card=\"\"\n {...(placing ? { 'data-fs-save-card-placing': '' } : {})}\n {...(pending ? { 'data-fs-save-card-pending': '' } : {})}\n >\n <div data-fs-save-card-toggle-field=\"\">\n <Field.Root disabled={fieldDisabled} data-fs-field-root=\"\">\n <Field.Label>\n <Checkbox.Root checked={checked} onCheckedChange={handleCheckedChange} disabled={fieldDisabled}>\n <Checkbox.Indicator>\n <Icon name=\"checked\" />\n </Checkbox.Indicator>\n </Checkbox.Root>\n {format('label')}\n </Field.Label>\n </Field.Root>\n {isConsentNoticeVisible($data?.savePersonalData) ? (\n <p data-fs-save-card-consent-notice=\"\">{format('consentNoticeLabel')}</p>\n ) : null}\n </div>\n\n {checked ? (\n <div data-fs-save-card-nickname-field=\"\">\n <Field.Root disabled={fieldDisabled} data-fs-field-root=\"\">\n <Field.Label>{format('nicknameLabel')}</Field.Label>\n <Field.Control\n name=\"cardLabel\"\n placeholder={nicknamePlaceholder}\n value={draft.cardLabel ?? ''}\n onChange={handleNicknameChange}\n disabled={fieldDisabled}\n maxLength={NICKNAME_MAX_LENGTH}\n />\n </Field.Root>\n </div>\n ) : null}\n\n {consentError ? (\n <div role=\"alert\" data-fs-save-card-error=\"\">\n {formatErrorCode(SaveCardContent, SAVE_CARD_ERROR_FIELDS, consentError, format, 'genericErrorMessage')}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,29 +1,111 @@
1
+ import { ContentValue, MessageLocaleProp } from "../../core/dist/define-content-type.js";
1
2
  import { ComponentDefinition } from "../../core/dist/define-component.js";
2
3
  import "../../core/dist/index.js";
3
4
  import { ComponentActions } from "../../sdk/actions/types.js";
4
5
  import { ComponentPropsWithRef, ReactNode } from "react";
5
6
  //#region src/matter/saved-cards/saved-cards.d.ts
6
- /** The minimal per-row identifiers `SavedCards` needs to iterate and to dispatch selection. */
7
+ /**
8
+ * The minimal per-row facts `SavedCards` needs to iterate, to dispatch selection, and to tell whether the
9
+ * persisted selection is an expired card (which is never the radio group's value).
10
+ */
7
11
  export type SavedCardsListEntry = Readonly<{
8
12
  id: string;
9
13
  accountId: string;
10
14
  methodId: string;
11
15
  bin: string;
16
+ expired: boolean;
12
17
  }>;
13
18
  export type SavedCardsData = {
14
19
  savedCards?: readonly SavedCardsListEntry[];
15
20
  } | null;
16
- export type SavedCardsProps = ComponentPropsWithRef<'div'> & {
21
+ export declare const SavedCardsContent: {
22
+ readonly id: "saved-cards";
23
+ readonly title: "Saved Cards";
24
+ readonly description: "Copy for the saved-card group legend and a refused card selection.";
25
+ readonly schema: {
26
+ readonly type: "object";
27
+ readonly additionalProperties: false;
28
+ readonly properties: {
29
+ readonly legend: {
30
+ readonly type: "string";
31
+ readonly title: "Legend";
32
+ readonly description: "The radio group's visible accessible name.";
33
+ readonly format: "icu-message";
34
+ readonly messageSource: "Saved cards";
35
+ };
36
+ readonly savedCardUnavailableMessage: {
37
+ readonly type: "string";
38
+ readonly title: "Saved card unavailable message";
39
+ readonly description: "Shown when the picked saved card can no longer be used.";
40
+ readonly format: "icu-message";
41
+ readonly messageSource: "This saved card is no longer available. Choose another card.";
42
+ };
43
+ readonly genericErrorMessage: {
44
+ readonly type: "string";
45
+ readonly title: "Selection failure message";
46
+ readonly description: "Shown when a card selection fails: a network failure or a fault the shopper cannot fix.";
47
+ readonly format: "icu-message";
48
+ readonly messageSource: "Unable to select this card. Please try again.";
49
+ };
50
+ };
51
+ };
52
+ };
53
+ export declare const SavedCardCvvFieldContent: {
54
+ readonly id: "saved-card-cvv-field";
55
+ readonly title: "Saved Card CVV Field";
56
+ readonly description: "Copy for the security code input of a saved card.";
57
+ readonly schema: {
58
+ readonly type: "object";
59
+ readonly additionalProperties: false;
60
+ readonly properties: {
61
+ readonly securityCodeLabel: {
62
+ readonly type: "string";
63
+ readonly title: "Security code label";
64
+ readonly description: "The input's accessible name; no visible label renders.";
65
+ readonly format: "icu-message";
66
+ readonly messageSource: "Security code";
67
+ };
68
+ readonly securityCodeDescription: {
69
+ readonly type: "string";
70
+ readonly title: "Security code description";
71
+ readonly description: "Helper text linked to the input; blank renders nothing.";
72
+ readonly format: "icu-message";
73
+ readonly messageSource: "The 3-4 digit number on your card";
74
+ };
75
+ };
76
+ };
77
+ };
78
+ export declare const SavedCardRemoveContent: {
79
+ readonly id: "saved-card-remove";
80
+ readonly title: "Saved Card Remove";
81
+ readonly description: "Copy for the remove control of an expired saved card.";
82
+ readonly schema: {
83
+ readonly type: "object";
84
+ readonly additionalProperties: false;
85
+ readonly properties: {
86
+ readonly label: {
87
+ readonly type: "string";
88
+ readonly title: "Label";
89
+ readonly format: "icu-message";
90
+ readonly messageSource: "Remove card";
91
+ };
92
+ readonly failureMessage: {
93
+ readonly type: "string";
94
+ readonly title: "Failure message";
95
+ readonly description: "Rendered when the removal did not complete, never the server's text.";
96
+ readonly format: "icu-message";
97
+ readonly messageSource: "The card was not removed. Please try again.";
98
+ };
99
+ };
100
+ };
101
+ };
102
+ export type SavedCardsProps = ComponentPropsWithRef<'div'> & MessageLocaleProp & {
17
103
  /** Unwrapped `payment` value from the reactive runtime (arity-1 fragment, ADR-0015); `null` until resolved. */
18
104
  $data?: SavedCardsData;
19
105
  /** The per-row template, typically one `SavedCardOption`, repeated once per saved card. */
20
106
  children?: ReactNode;
21
- /**
22
- * The radio group's accessible name, rendered as a visible `Fieldset.Legend` (T38, Decision 1).
23
- * Resolved through `resolveAuthoredCopy`: an authored empty or whitespace-only string falls back to
24
- * the default rather than rendering a nameless group.
25
- */
26
- legend?: string;
107
+ /** Merchant-authored copy: the radio group's visible legend (T38). */
108
+ $content?: ContentValue<typeof SavedCardsContent>;
27
109
  };
28
110
  /** The full per-row slice `SavedCardOption` independently resolves via `reactive-list-item`. */
29
111
  export type SavedCardOptionSlice = Readonly<{
@@ -42,26 +124,28 @@ export type SavedCardOptionProps = ComponentPropsWithRef<'div'> & {
42
124
  /** Typically a `SavedCardCvvField`. */
43
125
  children?: ReactNode;
44
126
  };
45
- export type SavedCardCvvFieldProps = ComponentPropsWithRef<'input'> & {
127
+ export type SavedCardCvvFieldProps = ComponentPropsWithRef<'input'> & MessageLocaleProp & {
46
128
  /** Compiler-injected action surface; carries `payment.sendPayments`. */
47
129
  $actions?: ComponentActions;
48
130
  /**
49
- * Accessible name for the CVV input. No visible `<label>` renders (Accessibility Contract), so this
50
- * is the input's only accessible name — authorable rather than a hardcoded English string.
51
- */
52
- securityCodeLabel?: string;
53
- /**
54
- * Helper copy rendered as a sibling `<p>` and linked to the input via `aria-describedby` (this
55
- * component's root is the input itself, so there is no `Field.Root` to host a `Field.Description` —
56
- * saved-cards.md Decision 3). An empty string renders nothing. Copy configuration only — never the
57
- * security code itself.
131
+ * Merchant-authored copy. No visible `<label>` renders (Accessibility Contract), so
132
+ * `securityCodeLabel` is the input's only accessible name. `securityCodeDescription` renders as a
133
+ * sibling `<p>` linked through `aria-describedby` (the root is the input itself, so there is no
134
+ * `Field.Root` to host a `Field.Description` — saved-cards.md Decision 3).
58
135
  */
59
- securityCodeDescription?: string;
136
+ $content?: ContentValue<typeof SavedCardCvvFieldContent>;
137
+ };
138
+ export type SavedCardRemoveProps = Omit<ComponentPropsWithRef<'button'>, 'children'> & MessageLocaleProp & {
139
+ /** Compiler-injected action surface; carries `savedCard.remove`. */
140
+ $actions?: ComponentActions;
141
+ /** Merchant-authored copy: the control's text and the message when the removal did not complete. */
142
+ $content?: ContentValue<typeof SavedCardRemoveContent>;
60
143
  };
61
144
  export declare const SavedCardsDefinition: ComponentDefinition<SavedCardsProps>;
62
145
  export declare const SavedCardOptionDefinition: ComponentDefinition<SavedCardOptionProps>;
63
146
  export declare const SavedCardCvvFieldDefinition: ComponentDefinition<SavedCardCvvFieldProps>;
64
- export declare function SavedCards({ $data: $dataProp, legend, className, children, ...props }: SavedCardsProps): import("react/jsx-runtime").JSX.Element | null;
147
+ export declare const SavedCardRemoveDefinition: ComponentDefinition<SavedCardRemoveProps>;
148
+ export declare function SavedCards({ $data: $dataProp, $content, $locale, className, children, ...props }: SavedCardsProps): import("react/jsx-runtime").JSX.Element | null;
65
149
  export declare function SavedCardOption({ $data: $dataProp, className, children, ...props }: SavedCardOptionProps): import("react/jsx-runtime").JSX.Element | null;
66
150
  /**
67
151
  * The saved-card path's own client-synthesized refusal (T27, specs/place-order-preflight-card-
@@ -74,6 +158,14 @@ export declare function SavedCardOption({ $data: $dataProp, className, children,
74
158
  * `PaymentUserError` (spec NFR-1, Risk R9).
75
159
  */
76
160
  export declare const SAVED_CARD_INVALID_SECURITY_CODE = "INVALID_SECURITY_CODE";
77
- export declare function SavedCardCvvField({ $actions: $actionsProp, securityCodeLabel, securityCodeDescription, className, ...props }: SavedCardCvvFieldProps): import("react/jsx-runtime").JSX.Element | null;
161
+ export declare function SavedCardCvvField({ $actions: $actionsProp, $content, $locale, className, ...props }: SavedCardCvvFieldProps): import("react/jsx-runtime").JSX.Element | null;
162
+ /**
163
+ * Removes an expired saved card (T216). Renders only for a row whose `expired` is the literal `true`. A
164
+ * success evicts the row's `SavedCard` entity, which is what the checkout list reads; the SDK action only
165
+ * updates the account's own `CustomerSavedCards` entity. Anything else, including a missing action, leaves
166
+ * the row and says so with its failureMessage, never the server's message. A caller's `onClick` runs first, and
167
+ * calling `event.preventDefault()` there cancels the removal.
168
+ */
169
+ export declare function SavedCardRemove({ $actions: $actionsProp, $content, $locale, className, onClick, ...props }: SavedCardRemoveProps): import("react/jsx-runtime").JSX.Element | null;
78
170
  //#endregion
79
171
  //# sourceMappingURL=saved-cards.d.ts.map