@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
@@ -0,0 +1,306 @@
1
+ # Account Saved Cards
2
+
3
+ **Category:** identity
4
+ **Purpose:** The signed-in shopper's saved cards in their account: a list of card summaries, or a statement that there are none, with loading and failure states, and a confirmed removal for each card. Needs no cart.
5
+
6
+ ---
7
+
8
+ ## Visual cues (how to identify in an image)
9
+
10
+ - A section heading such as "Saved cards", "Payment methods", or "My cards" inside an account page.
11
+ - A vertical list of rows, each a card-network logo, a network name, and `•••• 1234`, with a line such as "Expires 05/28" under it.
12
+ - A dimmed row reading "Expired 05/24" or "This card can't be used".
13
+ - A "Remove" link or button in each row, opening a confirmation such as "Remove this card?" with Cancel and "Remove card".
14
+ - Or a single sentence such as "You have no saved cards yet." where the list would be.
15
+ - Usually beside the account's side navigation, never inside a checkout step.
16
+
17
+ The image is the source of truth for layout.
18
+
19
+ ## When to use
20
+
21
+ - Showing the shopper the cards saved to their account, outside any purchase: the account's Payments page, or a block inside another account page.
22
+
23
+ ## When NOT to use
24
+
25
+ - Picking a saved card to pay with during checkout → [[saved-cards]] (`SavedCards`, cart-scoped, with CVV entry).
26
+ - Describing one card on its own → [[card-summary]].
27
+ - The store's accepted payment methods as a strip of logos → [[payment-methods]].
28
+
29
+ ---
30
+
31
+ ## Composition
32
+
33
+ ```
34
+ AccountSavedCardsRoot ← requires 'session'; provides 'account-saved-cards'; declares savedCard.remove
35
+ ├── AccountSavedCardsHeading
36
+ ├── AccountSavedCardsRemoveFeedback
37
+ ├── AccountSavedCardsLoading
38
+ ├── AccountSavedCardsError
39
+ ├── AccountSavedCardsEmpty
40
+ └── AccountSavedCardsList ← provides 'account-saved-card'
41
+ └── AccountSavedCardItem ← one row per card; provides 'card-summary', 'account-saved-card-data'
42
+ ├── CardSummary
43
+ ├── AccountSavedCardExpiry
44
+ └── AccountSavedCardRemove ← provides 'account-saved-card-remove'
45
+ └── AlertDialogRoot
46
+ ├── AccountSavedCardRemoveTrigger
47
+ └── AlertDialogPortal > AlertDialogBackdrop + AlertDialogViewport > AlertDialogPopup
48
+ ├── AccountSavedCardRemoveTitle
49
+ ├── AccountSavedCardRemoveDescription
50
+ ├── AccountSavedCardRemoveCancel
51
+ └── AccountSavedCardRemoveConfirm
52
+ ```
53
+
54
+ The Root renders nothing unless the session is `loggedIn`, and no chrome: no navigation, no page title, no landmark. It derives one state and exposes it on `data-fs-account-saved-cards-state`:
55
+
56
+ | State | When | Renders |
57
+ |---|---|---|
58
+ | `loading` | No cards yet and the read is in flight | `AccountSavedCardsLoading` |
59
+ | `error` | No cards and the read failed | `AccountSavedCardsError` |
60
+ | `empty` | The read resolved with no card | `AccountSavedCardsEmpty` |
61
+ | `ready` | The read resolved with cards | `AccountSavedCardsList` |
62
+ | `idle` | No cards and nothing in flight | Nothing but the heading |
63
+
64
+ The heading and the removal feedback render in every state. Every part except the Item must be inside the Root; the Item must be inside the List; the CardSummary parts, `AccountSavedCardExpiry`, and `AccountSavedCardRemove` inside the Item; and the five prompt parts inside `AccountSavedCardRemove`. A part outside its provider fails the build with a `ContextConstraintError`.
65
+
66
+ ---
67
+
68
+ ## Components
69
+
70
+ ### AccountSavedCardsRoot
71
+
72
+ Reads the card ids (`customerSavedCards`, reactive) and publishes the section state. No schema props.
73
+
74
+ It also holds the section's removal: which card is being removed (one at a time) and how the last removal ended. It declares `actions: { savedCard: ['remove'] }`, so every remove control inside reaches the action.
75
+
76
+ ### AccountSavedCardsHeading
77
+
78
+ | Prop | Type | Default | Notes |
79
+ |------|------|---------|-------|
80
+ | `as` | `'h2' \| 'h3' \| 'h4' \| 'h5' \| 'h6'` | `h2` | No `h1`: the page title belongs to the page shell. |
81
+
82
+ ### AccountSavedCardsLoading
83
+
84
+ | Prop | Type | Default | Notes |
85
+ |------|------|---------|-------|
86
+ | `skeletonCount` | number | `2` | Placeholder rows (`data-fs-account-saved-cards-loading-row`), hidden from assistive technology. |
87
+
88
+ A polite live region (`data-fs-account-saved-cards-loading-announcement`) stays mounted and announces the wait.
89
+
90
+ ### AccountSavedCardsError
91
+
92
+ An alert. An expired session (`UNAUTHORIZED`) says so and links to sign-in (`data-fs-account-saved-cards-sign-in`), returning the shopper to the current page; any other failure says the cards could not be loaded. `data-fs-account-saved-cards-error-code` is `unauthorized` or `failed`. The server's message never renders. Children replace the message for every failure and drop the link.
93
+
94
+ ### AccountSavedCardsEmpty
95
+
96
+ The statement that no card is saved. Renders only once the read resolved with none.
97
+
98
+ ### AccountSavedCardsList
99
+
100
+ A `<ul>` repeating its child once per card.
101
+
102
+ ### AccountSavedCardItem
103
+
104
+ A `<li>` that provides its card to the CardSummary parts, `AccountSavedCardExpiry`, and `AccountSavedCardRemove`. It renders only its children; with none, the row is empty. It shows no label: the account's read does not return one.
105
+
106
+ An expired card's row carries `data-fs-account-saved-card-expired`, and an unusable one's `data-fs-account-saved-card-unusable`, so a swatch can dim it. A working card's row carries neither. While its card is being removed, the row carries `data-fs-account-saved-card-removing`. Compose `CardSummary`, `AccountSavedCardExpiry` and `AccountSavedCardRemove` as children, in the order the row needs. Leave `AccountSavedCardRemove` out only for a read-only list.
107
+
108
+ ### AccountSavedCardExpiry
109
+
110
+ The line that says when the card expires, from the API's `status` and `expiry`. No schema props and no children.
111
+
112
+ | Card | Line | `data-fs-account-saved-card-expiry-status` |
113
+ |---|---|---|
114
+ | Working, with a date | "Expires 05/28" | `usable` |
115
+ | Expired, with a date | "Expired 05/24" | `expired` |
116
+ | Expired, no date | "Expired" | `expired` |
117
+ | Unusable (any other status) | "This card can't be used", never a date | `unusable` |
118
+ | Working, no date | Nothing | — |
119
+
120
+ The label is in `data-fs-account-saved-card-expiry-label`, the `MM/YY` date in `data-fs-account-saved-card-expiry-date` (a `<time>`). The short date is hidden from assistive technology; a visually hidden span reads the month and year in full ("May 2028") in the store's locale. A month outside 1–12 or a year outside four digits counts as no date.
121
+
122
+ ### AccountSavedCardRemove
123
+
124
+ The controller for one row's removal prompt. It owns the prompt's open state and passes it to its single `AlertDialogRoot` child; the schema never sets `open`. With no children it renders nothing. No schema props.
125
+
126
+ Opening the prompt dispatches nothing. Confirm dispatches `savedCard.remove` with the row's card id. The prompt then stays open until the server answers, and Escape and Cancel cannot close it meanwhile. On success the row leaves the list, and the prompt goes with it. On failure the prompt closes, focus returns to the trigger, and the row stays. An expired or unusable card is removed like any other.
127
+
128
+ ### AccountSavedCardRemoveTrigger
129
+
130
+ The row's control that opens the prompt. Its visible text is short ("Remove"); a visually hidden span adds the card ("Visa ending in 1234"), so each trigger has its own accessible name. Disabled while any removal in the section is pending.
131
+
132
+ ### AccountSavedCardRemoveTitle, AccountSavedCardRemoveDescription
133
+
134
+ The prompt's title and accessible description. With no children, the description renders the card's `CardSummary` before its text, so the prompt names the card it removes; that `CardSummary` reads the description's `cardEndingIn` message as its `endingIn`.
135
+
136
+ ### AccountSavedCardRemoveCancel
137
+
138
+ Closes the prompt and keeps the card. Opened with a mouse or the keyboard, the prompt focuses it first, so the safe action is the default; opened by touch, the popup takes focus itself. Disabled while the removal is pending.
139
+
140
+ ### AccountSavedCardRemoveConfirm
141
+
142
+ Removes the card. While the removal is pending it carries `aria-disabled="true"`, `aria-busy="true"`, and `data-fs-account-saved-card-remove-confirm-pending`, and shows its pending text ("Removing…"). It stays focusable, so focus does not leave the prompt.
143
+
144
+ ### AccountSavedCardsRemoveFeedback
145
+
146
+ Tells the shopper how the last removal ended. Place it once in the Root, outside the list, because a removed card's row unmounts. No schema props and no children.
147
+
148
+ | Outcome | Renders | `data-fs-account-saved-cards-remove-feedback-outcome` |
149
+ |---|---|---|
150
+ | Removed | "The card was removed." in a polite status region, which takes focus | `removed` |
151
+ | Session expired (`UNAUTHORIZED`) | An alert saying so, with a sign-in link (`data-fs-account-saved-cards-remove-feedback-sign-in`) that returns to the page | `unauthorized` |
152
+ | Any other failure | An alert: "We couldn't remove the card. Please try again." | `failed` |
153
+ | None yet, or a new removal started | Nothing | — |
154
+
155
+ The status region stays mounted so screen readers announce it. No message disappears on its own, and the server's message never renders.
156
+
157
+ ## Text
158
+
159
+ Every text is `children` or else the part's own message field (`$content`). A missing message, absent or blank, renders empty and logs an error; no part falls back to other text.
160
+
161
+ | Part | Message fields |
162
+ |---|---|
163
+ | `AccountSavedCardsHeading` | `text` |
164
+ | `AccountSavedCardsEmpty` | `text` |
165
+ | `AccountSavedCardsLoading` | `text` |
166
+ | `AccountSavedCardsError` | `text`, `sessionExpiredText`, `signInLabel` |
167
+ | `AccountSavedCardExpiry` | `expiresLabel`, `expiredLabel`, `expiredText`, `unusableText` |
168
+ | `CardSummary` | `endingIn` (`lastDigits`) |
169
+ | `AccountSavedCardRemoveTrigger` | `text`, `cardEndingIn` (`lastDigits`) |
170
+ | `AccountSavedCardRemoveTitle` | `text` |
171
+ | `AccountSavedCardRemoveDescription` | `text`, `cardEndingIn` (`lastDigits`) |
172
+ | `AccountSavedCardRemoveCancel` | `text` |
173
+ | `AccountSavedCardRemoveConfirm` | `text`, `pendingText` |
174
+ | `AccountSavedCardsRemoveFeedback` | `successText`, `failureText`, `sessionExpiredText`, `signInLabel` |
175
+
176
+ Every field is an ICU message (`format: 'icu-message'`). The trigger's hidden card name is the card's name followed by its `cardEndingIn` message.
177
+
178
+ `AccountSavedCardExpiry` and `AccountSavedCardsRemoveFeedback` take no children. `expiresLabel` and `expiredLabel` precede the date, which the component always places; `expiredText` and `unusableText` stand alone. The trigger's hidden card name follows its text whatever the source. Children on the Confirm replace only its idle label. Only a part placed in the schema has `$content`, so the Item and `AccountSavedCardRemove` have no default parts. The `CardSummary` that `AccountSavedCardRemoveDescription` renders with no children is the exception: the description passes it its own `cardEndingIn` message.
179
+
180
+ ## Canonical schema example
181
+
182
+ ```json
183
+ {
184
+ "saved-cards": {
185
+ "type": "AccountSavedCardsRoot",
186
+ "children": [
187
+ "saved-cards-heading",
188
+ "saved-cards-remove-feedback",
189
+ "saved-cards-loading",
190
+ "saved-cards-error",
191
+ "saved-cards-empty",
192
+ "saved-cards-list"
193
+ ]
194
+ },
195
+ "saved-cards-heading": { "type": "AccountSavedCardsHeading" },
196
+ "saved-cards-remove-feedback": { "type": "AccountSavedCardsRemoveFeedback" },
197
+ "saved-cards-loading": { "type": "AccountSavedCardsLoading" },
198
+ "saved-cards-error": { "type": "AccountSavedCardsError" },
199
+ "saved-cards-empty": { "type": "AccountSavedCardsEmpty" },
200
+ "saved-cards-list": { "type": "AccountSavedCardsList", "children": ["saved-card-item"] }
201
+ }
202
+ ```
203
+
204
+ Nested inside another account page, with a lower heading:
205
+
206
+ ```json
207
+ {
208
+ "saved-cards-heading": { "type": "AccountSavedCardsHeading", "props": { "as": "h3" } }
209
+ }
210
+ ```
211
+
212
+ The row, composed part by part, since the Item and `AccountSavedCardRemove` render only their children:
213
+
214
+ ```json
215
+ {
216
+ "saved-card-item": {
217
+ "type": "AccountSavedCardItem",
218
+ "children": ["saved-card-summary", "saved-card-expiry", "saved-card-remove"]
219
+ },
220
+ "saved-card-summary": { "type": "CardSummary" },
221
+ "saved-card-expiry": { "type": "AccountSavedCardExpiry" },
222
+ "saved-card-remove": { "type": "AccountSavedCardRemove", "children": ["saved-card-remove-dialog"] },
223
+ "saved-card-remove-dialog": {
224
+ "type": "AlertDialogRoot",
225
+ "children": ["saved-card-remove-trigger", "saved-card-remove-portal"]
226
+ },
227
+ "saved-card-remove-trigger": { "type": "AccountSavedCardRemoveTrigger" },
228
+ "saved-card-remove-portal": {
229
+ "type": "AlertDialogPortal",
230
+ "children": ["saved-card-remove-backdrop", "saved-card-remove-viewport"]
231
+ },
232
+ "saved-card-remove-backdrop": { "type": "AlertDialogBackdrop" },
233
+ "saved-card-remove-viewport": { "type": "AlertDialogViewport", "children": ["saved-card-remove-popup"] },
234
+ "saved-card-remove-popup": {
235
+ "type": "AlertDialogPopup",
236
+ "children": [
237
+ "saved-card-remove-title",
238
+ "saved-card-remove-description",
239
+ "saved-card-remove-cancel",
240
+ "saved-card-remove-confirm"
241
+ ]
242
+ },
243
+ "saved-card-remove-title": { "type": "AccountSavedCardRemoveTitle" },
244
+ "saved-card-remove-description": { "type": "AccountSavedCardRemoveDescription" },
245
+ "saved-card-remove-cancel": { "type": "AccountSavedCardRemoveCancel" },
246
+ "saved-card-remove-confirm": { "type": "AccountSavedCardRemoveConfirm" }
247
+ }
248
+ ```
249
+
250
+ ## Common mistakes
251
+
252
+ - **`AccountSavedCards`, `SavedCardsList`, `MyCards`.** The Root is `AccountSavedCardsRoot`; the list is `AccountSavedCardsList`.
253
+ - **Using `SavedCards` or `SavedCardOption` in the account.** Those are the checkout's cart-scoped picker and need a payment section.
254
+ - **Using `AccountSavedCardRemove` or its parts in the checkout's saved-card list.** They need `AccountSavedCardsRoot` and read the `CustomerSavedCard` entity, which a checkout row is not. The checkout removes an expired card with `SavedCardRemove` inside `SavedCardOption` (see [[saved-cards]]), which calls the same `savedCard.remove` action with the account-side id.
255
+ - **Placing `AccountSavedCardItem` directly in the Root.** It must be inside `AccountSavedCardsList`.
256
+ - **Composing `AccountSavedCardsEmpty` as the only state part.** Compose Loading and Error too, or a slow or failed read shows nothing under the heading.
257
+ - **Setting `as: "h1"`.** Not accepted; the page title belongs to the page shell.
258
+ - **Leaving a message field blank.** Nothing falls back: the part renders that text empty and logs an error.
259
+ - **Placing the Root outside the `my-account` layout.** It requires `session`; without a `SessionRoot` the build fails.
260
+ - **Giving the Item custom children without `AccountSavedCardExpiry`.** The row then hides when the card expires and whether it can be used.
261
+ - **Leaving an Item or `AccountSavedCardRemove` with no children.** Neither has a default: the row renders empty and the prompt never appears. Place `CardSummary`, `AccountSavedCardExpiry` and the `AccountSavedCardRemove` composition explicitly.
262
+ - **Giving the Item custom children without `AccountSavedCardRemove`.** The shopper can no longer remove the card. Do it only for a read-only list.
263
+ - **Leaving out `AccountSavedCardsRemoveFeedback`.** A removal then ends with no message: a success only drops the row, and a failure says nothing.
264
+ - **Placing the feedback inside the Item.** A removed card's row unmounts, taking the message with it.
265
+ - **Setting `open` on the `AlertDialogRoot` inside `AccountSavedCardRemove`.** The controller owns it.
266
+ - **Adding a plain button as the confirm control.** Only `AccountSavedCardRemoveConfirm` dispatches the removal.
267
+
268
+ ---
269
+
270
+ ## Styling
271
+
272
+ | Component | What you style | Plausible classes |
273
+ |---|---|---|
274
+ | `AccountSavedCardsRoot` | Section spacing | `flex flex-col gap-[16px]` |
275
+ | `AccountSavedCardsHeading` | Heading typography | `text-[20px] font-semibold text-[#1F1F1F]` |
276
+ | `AccountSavedCardsList` | Row stack | `flex flex-col gap-[8px]` |
277
+ | `AccountSavedCardItem` | Row box; dim expired and unusable rows | `rounded-[8px] border border-[var(--color-border)] p-[12px] data-[fs-account-saved-card-expired]:opacity-60 data-[fs-account-saved-card-unusable]:opacity-60` |
278
+ | `AccountSavedCardExpiry` | Line typography; color by state | `mt-[4px] text-[13px] text-[var(--color-text-muted)] data-[fs-account-saved-card-expiry-status=expired]:text-[var(--color-feedback-danger)] data-[fs-account-saved-card-expiry-status=unusable]:text-[var(--color-feedback-danger)]` |
279
+ | `AccountSavedCardsEmpty` | Statement typography | `text-[14px] text-[var(--color-text-muted)]` |
280
+ | `AccountSavedCardsLoading` | Placeholder stack; rows via `[&_[data-fs-account-saved-cards-loading-row]]` | `flex flex-col gap-[8px] [&_[data-fs-account-saved-cards-loading-row]]:h-[48px] [&_[data-fs-account-saved-cards-loading-row]]:rounded-[8px] [&_[data-fs-account-saved-cards-loading-row]]:bg-[#F0F0F0]` |
281
+ | `AccountSavedCardsError` | Alert box and link | `rounded-[8px] bg-[#FDECEC] p-[12px] text-[14px] text-[var(--color-feedback-danger)] [&_a]:underline` |
282
+ | `AccountSavedCardItem` (removing) | Fade the row while it is removed | `data-[fs-account-saved-card-removing]:opacity-60` |
283
+ | `AccountSavedCardRemoveTrigger` | Link-like control | `mt-[8px] text-[13px] text-[var(--color-feedback-danger)] underline disabled:opacity-50` |
284
+ | `AlertDialogPopup` | Prompt box (style the AlertDialog parts directly) | `w-full max-w-[420px] rounded-[12px] bg-white p-[24px] shadow-xl` |
285
+ | `AccountSavedCardRemoveConfirm` | Destructive button; dim while pending | `rounded-[6px] bg-[var(--color-feedback-danger)] px-[16px] py-[8px] text-white aria-disabled:opacity-70` |
286
+ | `AccountSavedCardsRemoveFeedback` | Message typography; alert color | `text-[14px] [&_[role=alert]]:text-[var(--color-feedback-danger)] [&_a]:underline` |
287
+
288
+ ```json
289
+ {
290
+ "saved-cards": { "type": "AccountSavedCardsRoot", "style": ["flex", "flex-col", "gap-[16px]"] },
291
+ "saved-card-item": { "type": "AccountSavedCardItem", "style": ["rounded-[8px]", "border", "border-[var(--color-border)]", "p-[12px]"] }
292
+ }
293
+ ```
294
+
295
+ The role colors above are the foundation's `visualIdentity` roles (`--color-feedback-danger`), so they follow the store when it changes them.
296
+
297
+ The colors that several elements share are variables of the page or layout `theme`, which declares them: `{"--color-border": "#E5E5E5", "--color-text-muted": "#6B6B6B"}`. A color used once stays a hex.
298
+
299
+ ---
300
+
301
+ ## Related
302
+
303
+ - [[card-summary]]: the card description each row renders.
304
+ - [[alert-dialog]]: the overlay the removal prompt is built on.
305
+ - [[saved-cards]]: the checkout's saved-card picker; cart-scoped.
306
+ - [[my-account-profile]]: the account's other session-scoped matter.
@@ -185,7 +185,7 @@ A delete-address confirmation. The confirm `Button` is inert here: in a store, t
185
185
 
186
186
  | Component | What you style | Plausible classes |
187
187
  |---|---|---|
188
- | `AlertDialogTrigger` | The button that opens the prompt | `px-[16px] py-[8px] text-[14px] font-medium text-[#B42318] border border-[#FDA29B] rounded-[6px]` |
188
+ | `AlertDialogTrigger` | The button that opens the prompt | `px-[16px] py-[8px] text-[14px] font-medium text-[var(--color-feedback-danger)] border border-[#FDA29B] rounded-[6px]` |
189
189
  | `AlertDialogBackdrop` | The dimmed layer over the page | `fixed inset-0 bg-black/40` |
190
190
  | `AlertDialogViewport` | Fixed positioning and centering of the popup | `fixed inset-0 flex items-center justify-center p-[16px]` |
191
191
  | `AlertDialogPopup` | The card: layout, background, radius, shadow, and its enter and exit | `flex flex-col gap-[8px] w-full max-w-[448px] p-[24px] bg-white rounded-[12px] shadow-xl data-[starting-style]:opacity-0 data-[ending-style]:opacity-0` |
@@ -195,6 +195,8 @@ A delete-address confirmation. The confirm `Button` is inert here: in a store, t
195
195
 
196
196
  `AlertDialogRoot` and `AlertDialogPortal` have no styling surface. Base UI sets `data-open`, `data-closed`, `data-starting-style`, and `data-ending-style` on the popup and the backdrop, so enter and exit animations key on those attributes.
197
197
 
198
+ The role colors above are the foundation's `visualIdentity` roles (`--color-feedback-danger`), so they follow the store when it changes them.
199
+
198
200
  ---
199
201
 
200
202
  ## Related
@@ -77,7 +77,7 @@ The fallback shows whenever there is no image, the image is still loading, or it
77
77
 
78
78
  | Component | What you style | Plausible classes |
79
79
  |---|---|---|
80
- | `Avatar` | `data-fs-avatar` is the circle: size, shape, background, and the initials' type | `inline-flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-full bg-[#E5E7EB] text-[14px] font-medium` |
80
+ | `Avatar` | `data-fs-avatar` is the circle: size, shape, background, and the initials' type | `inline-flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-full bg-[var(--color-surface-strong)] text-[14px] font-medium` |
81
81
  | Image | `data-fs-avatar-image` is the `<img>` once loaded | `size-full object-cover` |
82
82
  | Initials | `data-fs-avatar-fallback` is the initials span | `uppercase` |
83
83
 
@@ -88,12 +88,14 @@ The fallback shows whenever there is no image, the image is still loading, or it
88
88
  "props": { "name": "Jane Doe", "alt": "Jane Doe" },
89
89
  "style": [
90
90
  "inline-flex", "size-10", "shrink-0", "items-center", "justify-center", "overflow-hidden",
91
- "rounded-full", "bg-[#E5E7EB]", "text-[14px]", "font-medium", "[&_img]:size-full", "[&_img]:object-cover"
91
+ "rounded-full", "bg-[var(--color-surface-strong)]", "text-[14px]", "font-medium", "[&_img]:size-full", "[&_img]:object-cover"
92
92
  ]
93
93
  }
94
94
  }
95
95
  ```
96
96
 
97
+ The colors that several elements share are variables of the page or layout `theme`, which declares them: `{"--color-surface-strong": "#E5E7EB"}`. A color used once stays a hex.
98
+
97
99
  ---
98
100
 
99
101
  ## Related
@@ -90,27 +90,37 @@ a form the shopper cannot see.
90
90
 
91
91
  | Prop | Type | Default | Notes |
92
92
  |------|------|---------|-------|
93
- | `sameAsDeliveryLabel` | string | `"Billing address same as delivery address"` | The toggle's own label text. |
94
- | `defaultCountry` | string | `"BRA"` | Initial country selected when the custom form first mounts. |
95
- | `countryLabel` | string | `"Country"` | Label for the country selector inside the custom form. |
96
- | `recipientNameLabel` | string | `"Recipient's name"` | Label for the recipient-name descriptor field. Not rendered by the custom-address form today — the write contract has no matching input slot — kept for parity with the other seven field labels. |
97
- | `streetLabel` | string | `"Street"` | Label for the street descriptor field. |
98
- | `numberLabel` | string | `"Number"` | Label for the street-number descriptor field. |
99
- | `complementLabel` | string | `"Complement (optional)"` | Label for the complement descriptor field. Its "(optional)" suffix is the only signal that the field is not required — the actual `required` attribute is driven independently, so authoring this without the suffix loses the visual cue, not the behavior. |
100
- | `neighborhoodLabel` | string | `"Neighborhood"` | Label for the neighborhood descriptor field. Unused when the active country's descriptor has no `neighborhood` field (e.g. USA). |
101
- | `cityLabel` | string | `"City"` | Label for the city descriptor field. |
102
- | `stateLabel` | string | `"State"` | Label for the state descriptor field. |
103
- | `postalCodeLabel` | string | `"Postal code"` | Label for the postal-code descriptor field. |
104
- | `submitLabel` | string | `"Save billing address"` | Label for the button that persists a custom address. |
105
- | `submitPendingLabel` | string | `"Saving..."` | Submit button's label while the write is in flight. |
106
- | `requiredNoticeLabel` | string | `"This payment method requires a billing address."` | Shown when the selected method's validator marks a billing address required. |
107
- | `unsavedAddressNoticeLabel` | string | `"No billing address has been saved yet — the delivery address will be used unless you save one below."` | Shown, `role="status"`, while the custom-address form is open and no address has been persisted yet. |
108
- | `billingMatchNoticeLabel` | string | `"Your billing address must match the one on your card or bank statement, or your bank may decline the order."` | Always-on billing-match disclaimer. Gated only by this prop and `billingMatchNoticeVisible` — unlike the two notices above, it never changes with the toggle, the form, `billingAddressRequired`, or a saved address. |
109
- | `billingMatchNoticeVisible` | boolean | `true` | Switches the billing-match disclaimer above on or off. A blank `billingMatchNoticeLabel` also renders nothing, even while this is `true` — the two rules never combine into an empty element. |
110
- | `fieldRequiredMessage` | string | `"This field is required."` | Shown as an inline field error under a required, blank address field once it has been touched (T38) — see Accessibility Contract below. One prop, not one per field: every rendered field but `complement` shares the same rule. An authored empty or whitespace-only string falls back to this default. |
111
- | `postalCodeInvalidMessage` | string | `"Enter a valid postal code."` | Shown as an inline field error under a touched, non-blank postal code that does not match the selected country's format (the descriptor's `rule.pattern`, the same one the delivery form enforces). Only the postal code reads this prop; the English default matches every other default on this form, so an author localises it with the rest. A blank postal code reads `fieldRequiredMessage` instead, never this. The message never contains the typed value. An authored empty or whitespace-only string falls back to this default. |
93
+ | `defaultCountry` | string | `"BRA"` | Initial country selected when the custom form first mounts: `BRA`, `USA`, `CAN` or `MEX`. The store authors it; the form does not follow the store's own country. A code with no descriptor falls back to the first available country (`BRA`); `CAN` and `MEX` are kept while their descriptor is still loading, and the form shows the country and no fields until it arrives. |
94
+ | `billingMatchNoticeVisible` | boolean | `true` | Switches the billing-match disclaimer on or off. A blank `billingMatchNoticeLabel` message also renders nothing, even while this is `true` — the two rules never combine into an empty element. |
112
95
  | `disabled` | boolean | `false` | Disables the toggle, every form field, the country selector, and the submit button. |
113
96
 
97
+ **Content (`billing-address`):** every word of the form is a message field the store authors in `$content`; a missing or blank one renders empty and logs `message.missing`. Country names in the selector are not copy: they come from `Intl.DisplayNames` in the store locale ("Brazil" in `en-US`, "Brasil" in `pt-BR`).
98
+
99
+ | Field | Source (English) | Notes |
100
+ |-------|------------------|-------|
101
+ | `sameAsDeliveryLabel` | `Billing address same as delivery address` | The toggle's own label text. |
102
+ | `countryLabel` | `Country` | Label for the country selector inside the custom form. |
103
+ | `recipientNameLabel` | `Recipient's name` | Label for the recipient-name descriptor field. Not rendered by the custom-address form today — the write contract has no matching input slot — kept for parity with the other seven field labels. |
104
+ | `streetLabel` | `Street` | Label for the street descriptor field. |
105
+ | `numberLabel` | `Number` | Label for the street-number descriptor field. |
106
+ | `complementLabel` | `Complement (optional)` | Label for the complement descriptor field. Its "(optional)" suffix is the only signal that the field is not required — the actual `required` attribute is driven independently, so authoring this without the suffix loses the visual cue, not the behavior. |
107
+ | `neighborhoodLabel` | `Neighborhood` | Label for the neighborhood descriptor field. Unused when the active country's descriptor has no `neighborhood` field (e.g. USA or Canada). |
108
+ | `cityLabel` | `City` | Label for the city descriptor field. |
109
+ | `stateLabel` | `State` | Label for the state descriptor field. |
110
+ | `postalCodeLabel` | `Postal code` | Label for the postal-code descriptor field. |
111
+ | `submitLabel` | `Save billing address` | Label for the button that persists a custom address. |
112
+ | `submitPendingLabel` | `Saving...` | Submit button's label while the write is in flight. |
113
+ | `requiredNoticeLabel` | `This payment method requires a billing address.` | Shown when the selected method's validator marks a billing address required. |
114
+ | `unsavedAddressNoticeLabel` | `No billing address has been saved yet — the delivery address will be used unless you save one below.` | Shown, `role="status"`, while the custom-address form is open and no address has been persisted yet. |
115
+ | `billingMatchNoticeLabel` | `Your billing address must match the one on your card or bank statement, or your bank may decline the order.` | Always-on billing-match disclaimer. Gated only by this message and `billingMatchNoticeVisible` — unlike the two notices above, it never changes with the toggle, the form, `billingAddressRequired`, or a saved address. |
116
+ | `fieldRequiredMessage` | `This field is required.` | Shown as an inline field error under a required, blank address field once it has been touched (T38) — see Accessibility Contract below. One field, not one per address field: every rendered field but `complement` shares the same rule. |
117
+ | `postalCodeInvalidMessage` | `Enter a valid postal code.` | Shown as an inline field error under a touched, non-blank postal code that does not match the selected country's format (the descriptor's `rule.pattern`, the same one the delivery form enforces). Only the postal code reads it. A blank postal code reads `fieldRequiredMessage` instead, never this. The message never contains the typed value. |
118
+ | `missingFieldsMessage` | `Fill in the postal code and the country of your billing address.` | Inline alert when the server refuses the address without a postal code or country (`MISSING_BILLING_ADDRESS_FIELDS`). |
119
+ | `invalidCountryMessage` | `Choose a valid country for your billing address.` | Inline alert when the server refuses the country (`INVALID_COUNTRY_CODE`). |
120
+ | `genericErrorMessage` | `Unable to save your billing address. Please try again.` | Inline alert for `MISSING_CART_CONTEXT`, `CART_NOT_FOUND` and `NETWORK_ERROR`. A code the package does not know (one a newer server added) shows it too and logs `message.unknown-code`. |
121
+
122
+ A field a library-backed descriptor adds with no label field here shows its canonical field name.
123
+
114
124
  **Data:** declares no fragment and no `fetchStrategy`, so it fetches no shopper data. It reads only the
115
125
  payment context (`requiresContext: 'payment'`): the selected method's validator and the shared payment
116
126
  draft. **Nothing prefills the custom-address form** — there is no server field that echoes back an
@@ -147,7 +157,7 @@ the blocking themselves; both stay exactly as advisory as described above.
147
157
  **A third notice, `billingMatchNoticeLabel`, is configuration-driven, not state-driven like the two
148
158
  above.** The required-note and the unsaved-notice each appear and disappear by runtime state (the
149
159
  selected method's validator; the form being open with nothing saved yet). This one does not: its
150
- presence is a pure function of `billingMatchNoticeLabel` and `billingMatchNoticeVisible` alone, and it
160
+ presence is a pure function of the `billingMatchNoticeLabel` message and `billingMatchNoticeVisible` alone, and it
151
161
  renders before the toggle field on every render — including the default state, where "same as delivery"
152
162
  stays checked and the shopper never opens the form. It never reacts to the toggle, to
153
163
  `billingAddressRequired`, to a saved address, or to order placement; a merchant switches it off with
@@ -158,10 +168,49 @@ static disclaimer, not a live region reacting to an event.
158
168
  **Focus on refusal:** while the custom-address form is open, it registers itself so that when `PlaceOrder` refuses an order because the address was never saved, keyboard focus moves into the form: to the first rendered required field that is still blank; if none is blank, to the first rendered field whose value fails its country's format (a postal code `123` for BRA); and only when every field is filled and well-formed, to the submit control. The field the focus lands on, blank or malformed, is marked touched, so its message (`required` for a blank field, `format` for a malformed one) shows with the focus and no blur is needed. The country selector is never the target, and a disabled field or a disabled submit control (for example while saving) takes no focus. The reason stays in `PlaceOrder`'s existing alert and this component's unsaved-address notice. Focus moves only on the refused click.
159
169
 
160
170
  **Country adaptivity is entirely data-driven**, reusing the same country descriptors the delivery
161
- address step uses: Brazil shows a neighborhood/bairro field, the United States does not, and adding a
162
- new country anywhere in this codebase is a data-only change that this component picks up automatically
163
- — never a code change here. The postal code's format is the same data: the descriptor's `rule.pattern`
164
- gates the submit button and the field error, so a country's format is defined once for both forms.
171
+ address step uses: Brazil shows a neighborhood/bairro field, the United States and Canada do not, Mexico
172
+ shows a neighborhood and a number, and adding a new country anywhere in this codebase is a data-only
173
+ change that this component picks up automatically — never a code change here. Brazil and the United
174
+ States are written in the descriptor table; Canada and Mexico are read from `@vtex/country-forms` when
175
+ the form mounts, so the selector lists them (Brazil, United States, Canada, Mexico) once they have
176
+ loaded. The postal code's format is the same data: the descriptor's `rule` (a pattern for Brazil and the
177
+ United States, the library's own verdict for Canada and Mexico) gates the submit button and the field
178
+ error, so a country's format is defined once for both forms. A Canadian or Mexican postal code is
179
+ submitted in the library's stored form (`K1A 0B1`), not as typed.
180
+
181
+ ### Countries and postal codes
182
+
183
+ The selector lists the same countries for every store. It is not filtered by the countries the store ships
184
+ to, because a card's billing country does not depend on where the store delivers.
185
+
186
+ Canada and Mexico take their field set and required flags from `@vtex/country-forms` (the pinned 1.14.0),
187
+ and the repository holds no regular expression, list or mask for either. Only the English copy is written
188
+ in `packages/faststore/src/matter/shipping-address/library-country-descriptors.ts`. Canada has no number
189
+ or neighborhood field, so a Canadian shopper types the house number inside the street. Mexico adds both,
190
+ and the neighborhood is required: every rendered field except the complement is, so a Mexican shopper
191
+ without one cannot save. The state is free text for both countries, although the library lists 13
192
+ provinces and 32 states.
193
+
194
+ The postal code rules are the library's. Canada refuses a first letter of D, F, I, O, Q, U or W and
195
+ ignores case and the space, but accepts a Z in first position and D, F, I, O, Q or U later in the code, so
196
+ it is looser than Canada Post's alphabet. Mexico takes five digits and refuses a value below `01000`.
197
+ Both judge the trimmed value, so ` 06600 ` passes. The Brazilian and US patterns test the raw value, so a
198
+ leading or trailing space fails them. The US pattern accepts a ZIP+4 with or without the hyphen
199
+ (`021011234`), and a Brazilian or US postal code is submitted exactly as typed.
200
+
201
+ Other countries need more than a data entry. The library covers `ARG`, `CHL`, `COL`, `ECU` and `PER` with a
202
+ select whose options depend on another field (a city or neighborhood chosen by state), which a descriptor
203
+ cannot express. A country with a flat field list joins by adding its ISO code to `LIBRARY_COUNTRIES` with a
204
+ copy row there.
205
+
206
+ If a country's chunk fails to load, it is left out of the selector, the form keeps working with the others,
207
+ nothing is shown about it, and the next mount retries it.
208
+
209
+ The server does not back the client rule. `paymentBillingAddressUpdate` checks only that `postalCode` and
210
+ `country` are present and that the country is three capital letters, so this verdict is the only postal
211
+ code guard for billing. Two answers were not measured on a live Canadian or Mexican account: which `state`
212
+ value the Checkout expects (`ON` or `Ontario`, `CMX` or `Ciudad de México`), and whether a card issuer's
213
+ address check wants the Canadian postal code with or without the space.
165
214
 
166
215
  ---
167
216
 
@@ -175,7 +224,25 @@ gates the submit button and the field error, so a country's format is defined on
175
224
  },
176
225
  "billing-address": {
177
226
  "type": "BillingAddress",
178
- "props": { "sameAsDeliveryLabel": "Billing address same as delivery address" },
227
+ "props": {
228
+ "sameAsDeliveryLabel": "Billing address same as delivery address",
229
+ "countryLabel": "Country",
230
+ "streetLabel": "Street",
231
+ "numberLabel": "Number",
232
+ "complementLabel": "Complement (optional)",
233
+ "neighborhoodLabel": "Neighborhood",
234
+ "cityLabel": "City",
235
+ "stateLabel": "State",
236
+ "postalCodeLabel": "Postal code",
237
+ "recipientNameLabel": "Recipient's name",
238
+ "submitLabel": "Save billing address",
239
+ "submitPendingLabel": "Saving...",
240
+ "requiredNoticeLabel": "This payment method requires a billing address.",
241
+ "unsavedAddressNoticeLabel": "No billing address has been saved yet — the delivery address will be used unless you save one below.",
242
+ "billingMatchNoticeLabel": "Your billing address must match the one on your card or bank statement, or your bank may decline the order.",
243
+ "fieldRequiredMessage": "This field is required.",
244
+ "postalCodeInvalidMessage": "Enter a valid postal code."
245
+ },
179
246
  "style": ["flex", "flex-col", "gap-3"]
180
247
  }
181
248
  }
@@ -229,13 +296,15 @@ while the box is unchecked, and an optional inline error.
229
296
  | Same as delivery (`data-fs-billing-address-same-as-delivery`) | Present on the root while the box is checked, absent while it is unchecked. It sits on the node the style array styles, so target it as `data-[fs-billing-address-same-as-delivery]:…`, never with a descendant variant | `data-[fs-billing-address-same-as-delivery]:gap-[8px]` |
230
297
  | Panel (`data-fs-billing-address-panel`) | Always present, right after the toggle field, and the toggle's `aria-controls` target. `hidden` and empty while the box is checked; holds the custom-form wrapper while unchecked. Never give it a display utility (`flex`, `grid`, `block`, …): one defeats `hidden` | none — style the form inside it |
231
298
  | Custom-form wrapper (`data-fs-billing-address-form`), inside the panel | Field grid | `grid grid-cols-2 gap-[8px]` |
232
- | Required-billing-address note (`data-fs-billing-address-required-note`) | De-emphasized helper text | `text-[12px] text-[#666666]` |
233
- | Unsaved-address notice (`data-fs-billing-address-unsaved-notice`) | De-emphasized, non-error helper text | `text-[12px] text-[#666666]` |
234
- | Billing-match disclaimer (`data-fs-billing-address-match-notice`) | De-emphasized helper text, first child of the root | `text-[12px] text-[#666666]` |
235
- | Field error (`data-fs-field-error`) | Per-field validation message, shown once a field is touched: a blank required field, or a non-blank postal code that fails the country's format (T38); a refused submit that focuses the field touches it without a blur | `text-[12px] font-medium text-[#B00020]` |
236
- | Inline error (`data-fs-billing-address-error`) | Warning-toned alert text | `text-[12px] font-medium text-[#B00020]` |
299
+ | Required-billing-address note (`data-fs-billing-address-required-note`) | De-emphasized helper text | `text-[12px] text-[color-mix(in_srgb,var(--color-ink)_60%,transparent)]` |
300
+ | Unsaved-address notice (`data-fs-billing-address-unsaved-notice`) | De-emphasized, non-error helper text | `text-[12px] text-[color-mix(in_srgb,var(--color-ink)_60%,transparent)]` |
301
+ | Billing-match disclaimer (`data-fs-billing-address-match-notice`) | De-emphasized helper text, first child of the root | `text-[12px] text-[color-mix(in_srgb,var(--color-ink)_60%,transparent)]` |
302
+ | Field error (`data-fs-field-error`) | Per-field validation message, shown once a field is touched: a blank required field, or a non-blank postal code that fails the country's format (T38); a refused submit that focuses the field touches it without a blur | `text-[12px] font-medium` |
303
+ | Inline error (`data-fs-billing-address-error`) | Warning-toned alert text | `text-[12px] font-medium` |
237
304
  | Placing (`data-fs-billing-address-placing`) | Present while an order-placement sequence is in flight (T28) — distinct from `data-fs-billing-address-pending`, which this component already emits for its own local submit dispatch; the root is also `inert` and `aria-disabled` while placing | `opacity-60 cursor-not-allowed` |
238
305
 
306
+ A status color is a `visualIdentity` feedback role of the foundation: when the store declares them, color the error row `text-[var(--color-feedback-danger)]`, the success row `text-[var(--color-feedback-success)]` and the notice row `text-[var(--color-feedback-warning)]`, never with a hex.
307
+
239
308
  Styled example:
240
309
 
241
310
  ```json