@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
@@ -35,11 +35,13 @@ anonymous state, so anything that must survive that state — the section headin
35
35
  The stored phone is E.164; the phone leaf's `country` (US/BR) selects the display mask, so the summary
36
36
  matches the edit form's masking, and a number belonging to another country renders as stored rather
37
37
  than being reformatted as a local one. Compose custom `children` to replace the default presentation —
38
- the leaves then carry their own props. `SelectedSummary`'s own `country` and badge-label props apply to
39
- the default composition only, and are not offered in the schema for that reason.
38
+ the leaves then carry their own props. `SelectedSummary`'s own `country` prop applies to the default
39
+ composition only, and is not offered in the schema for that reason. Its default badge has no labels of
40
+ its own: compose `IdentitySummaryBadge` and author its labels to show one.
40
41
  - **SignOutButton** — async/pessimistic: `data-fs-identity-summary-pending` is present while the
41
42
  mutation is in flight, the button is disabled to prevent double-dispatch, and any returned
42
- `userErrors` surface via `Error`. Renders composed `children` (e.g. an `Icon` + text) or `label`.
43
+ `userErrors` surface via `Error`. Renders composed `children` (e.g. an `Icon` + text) or its `label`
44
+ message.
43
45
  - **Summary/form swap** — `IdentityEditController` with its guards and triggers. The edit and cancel
44
46
  buttons are `IdentityEditButton` and `IdentityEditCancelButton`; a leading icon composes as their children.
45
47
  The controller moves only on those buttons — saving does not collapse the section — so neither this
@@ -49,8 +51,8 @@ anonymous state, so anything that must survive that state — the section headin
49
51
 
50
52
  `IdentitySummarySelectedSummary` is a **shortcut**: it renders the default order (badge, name, e-mail,
51
53
  phone, document) so a page wanting exactly that composes one element. It is not the only way, and it
52
- offers no props to the schema — configure the leaf, not the wrapper. Its `country` and badge-label props
53
- reach the default composition only, so composing children silently replaces whatever they would have set.
54
+ offers no props to the schema — configure the leaf, not the wrapper. Its `country` prop reaches the
55
+ default composition only, so composing children silently replaces whatever it would have set.
54
56
 
55
57
  Each line is its own component reading the same `IdentitySummaryRoot` context, so the order, the presence
56
58
  and anything interleaved between them are the page's decision (ADR-0011):
@@ -70,6 +72,17 @@ IdentitySummaryRoot
70
72
  └─ IdentitySummaryPhone country="BR"
71
73
  ```
72
74
 
75
+ ## Messages
76
+
77
+ ICU message fields, authored per element, with no package default. An unauthored field renders empty and
78
+ logs `message.missing`.
79
+
80
+ | Content type | Field | Source (English) |
81
+ |---|---|---|
82
+ | `identity-summary-root` | `signOutErrorMessage` | `Unable to sign out. Please try again.` — shown for every logout refusal (each `SessionErrorCode` and `NETWORK_ERROR`, none of which the shopper can act on) and for a logout that throws. A code it does not know (one a newer server added) shows it too and logs `message.unknown-code`; a blank message renders an empty alert and logs `message.missing` |
83
+ | `identity-summary-badge` | `identifiedLabel`, `loggedInLabel` | `Guest`, `Signed in` |
84
+ | `identity-summary-sign-out-button` | `label` | `Sign out` |
85
+
73
86
  ## Data attributes
74
87
 
75
88
  | Attribute | Element | When |
@@ -54,7 +54,7 @@ FooterRoot
54
54
 
55
55
  **A refused destination costs the anchor and nothing else.** No read-time gate enforces the model's `pattern`, so an authored `javascript:` value reaches the component intact; the same render-time allowlist `FooterLinkGroup` and the social particle use — `http:`, `https:`, `mailto:`, `tel:`, and single-slash paths — is what stands between it and an `href`. Where those two drop the entry, this one renders the item unlinked with its glyph and copy intact, because an unlinked item is this component's ordinary shape and losing a benefit over a bad destination would be the larger failure. The refusal logs the item's index and the reason, never the authored value.
56
56
 
57
- **Every predefined name must be registered.** An `icon` resolves to a sprite symbol the store's build has to include; the store's `global.json` writes the names out under `icons.include` — it is JSON, so it cannot import `INCENTIVE_ICON_NAMES`, and a test that derives the expected set from the exported constant is what keeps the two in step. A name the store never registered renders an empty `<svg>` — no build error and no runtime error, just a missing pictogram. All five names resolve in the default collection; a store on a different collection maps them with `icons.aliases`.
57
+ **Every predefined name must be registered.** An `icon` resolves to a sprite symbol the store's build has to include; the store's `foundation.json` writes the names out under `icons.include` — it is JSON, so it cannot import `INCENTIVE_ICON_NAMES`, and a test that derives the expected set from the exported constant is what keeps the two in step. A name the store never registered renders an empty `<svg>` — no build error and no runtime error, just a missing pictogram. All five names resolve in the default collection; a store on a different collection maps them with `icons.aliases`.
58
58
 
59
59
  ---
60
60
 
@@ -120,7 +120,7 @@ Size and box classes reach both paths, but **colour does not**. A predefined gly
120
120
  |---|---|---|
121
121
  | `Incentives` | The strip itself, wrapping on narrow screens | `flex flex-wrap gap-[32px] list-none p-0 m-0` |
122
122
  | `data-fs-incentive` | The block one benefit occupies | `flex flex-col items-center text-center gap-[4px] flex-1` |
123
- | `data-fs-incentive-link` | The anchor wrapping a linked block; absent on unlinked items, so style the layout on `data-fs-incentive` and only the link affordances here | `flex flex-col items-center gap-[4px] no-underline hover:text-brand` |
123
+ | `data-fs-incentive-link` | The anchor wrapping a linked block; absent on unlinked items, so style the layout on `data-fs-incentive` and only the link affordances here | `flex flex-col items-center gap-[4px] no-underline hover:text-primary` |
124
124
  | `data-fs-incentive-icon` | Both glyph paths, sized to match | `w-[32px] h-[32px] object-contain` |
125
125
  | `data-fs-incentive-title` | The bold benefit label | `text-[14px] font-bold text-[#1a1a1a]` |
126
126
  | `data-fs-incentive-description` | Each supporting line | `text-[12px] text-[#616161]` |
@@ -58,7 +58,7 @@ PaymentSectionRoot (or PaymentSectionController)
58
58
 
59
59
  Either component must be a descendant of `PaymentSectionRoot` or `PaymentSectionController` — each reads the shopper's in-progress card draft (`draft.bin`) and the currently selected method from that context. Place it as a **sibling** of `CardEntry` and `SavedCards`, never nested inside either: one instance serves both the new-card and saved-card paths, matched automatically from the same context data.
60
60
 
61
- Both self-gate to an empty state when nothing is selected yet, and to a loading state before their data resolves — safe to include speculatively inside any payment section, but for image-to-schema work only include one when the image actually shows a selectable installment control, and pick the variant (list vs. dropdown) the image actually shows.
61
+ Both render nothing until the shopper can act on them: for a new card, once the entry passes length, Luhn, expiration and security code (`CardEntry` publishes that verdict as a boolean; the holder name is not part of it); for a saved card, as soon as it is the selection. The new-card verdict is local state on the `payment` context (`draft.entryValid`). It comes from the same validation the blur and place-order checks run, changes only when the verdict changes, sends no request, and resets to false when `CardEntry` unmounts, so a selector does not outlive the form it describes (`card-entry.test.tsx`, `setDraftEntryValid`). Only the boolean crosses to this component; the card values stay in `CardEntry`. Once the data has resolved they also render nothing when no payment method the store offers carries a tier above 1x — a store without installments shows no selector, not a one-row group. The check is store-wide: a card whose own option is 1x-only still sees a one-row group while another method offers more. Before the data resolves, and with the entry valid, they render a loading wrapper. Past those two gates they self-gate to an empty state when nothing matches the current selection. Safe to include speculatively inside any payment section, but for image-to-schema work only include one when the image actually shows a selectable installment control, and pick the variant (list vs. dropdown) the image actually shows.
62
62
 
63
63
  Both render nothing while the card payment is collapsed — the persisted selection is a method that is not a card, or one the section does not serve, and a composed `PaymentMethodList` can bring the card form back (see [[payment]]) — and come back with it. A method's own installment options apply only when it is a card: over a persisted non-card method, card mode included, both read `empty` until a card is recorded, never that method's own tiers.
64
64
 
@@ -68,12 +68,15 @@ Both render nothing while the card payment is collapsed — the persisted select
68
68
 
69
69
  ### Installments
70
70
 
71
- | Prop | Type | Default | Notes |
72
- |------|------|---------|-------|
73
- | `installmentTemplate` | string | `"{count}x of {value}"` | Placeholders `{count}` / `{value}`, matching `PricingInstallment`'s convention. |
74
- | `interestFreeLabel` | string | `"interest-free"` | Appended when a row's interest rate is `0`. |
75
- | `interestTemplate` | string | `"{rate}% interest"` | Appended instead of `interestFreeLabel` when a row's interest rate is above `0`. `{rate}` is the order form's `interestRate`, which is in hundredths of a percent, divided by 100 and locale-formatted: `100` renders `1`. |
76
- | `legend` | string | `"Installments"` | The radio group's accessible name, rendered as a visible fieldset legend above the rows (T38). An authored empty or whitespace-only string falls back to this default rather than rendering a nameless group. |
71
+ No copy props.
72
+
73
+ **Content model** (`installments`):
74
+
75
+ - `installmentTemplate`: ICU message with `count` and `value` (the currency-formatted per-installment value) arguments, matching `PricingInstallment`'s convention.
76
+ - `interestFreeLabel`: appended when the API marks a row `interestFree`.
77
+ - `interestTemplate`: ICU message with a `rate` argument, appended instead of `interestFreeLabel` when the API marks a row not `interestFree`. A row whose rate the order form did not state (`interestRate` and `interestFree` both `null`) gets neither: just the count and the per-installment value. `{rate}` is the order form's `interestRate`, which is in hundredths of a percent, divided by 100 and locale-formatted: `100` renders `1`.
78
+ - `legend`: the radio group's accessible name, rendered as a visible fieldset legend above the rows (T38).
79
+ - `invalidInstallmentMessage`, `missingMethodMessage`, `genericErrorMessage`: the inline alert for a refused pick, keyed on its code. `INVALID_INSTALLMENT_COUNT` reads the first, `MISSING_PAYMENT_METHOD_SELECTION` the second, and `MISSING_CART_CONTEXT`, `CART_NOT_FOUND` and `NETWORK_ERROR` the generic one. A code the package does not know (one a newer server added) also shows `genericErrorMessage` and logs `message.unknown-code`.
77
80
 
78
81
  **Data:** declares its own `fragment InstallmentsData on Query` (selects `Query.payment.installmentOptions` and `Query.payment.selectedInstallment` — the compiler merges it into the page query alongside `PaymentSectionRoot`'s own, smaller `payment` selection; no explicit `dataSources` entry needed). `fetchStrategy: 'reactive'` — the option list updates live from the cache, no refetch.
79
82
 
@@ -81,19 +84,20 @@ Both render nothing while the card payment is collapsed — the persisted select
81
84
 
82
85
  **The 1x option:** the component renders exactly the tiers the matched option's own data carries. The API guarantees a `count: 1` tier is present in every projected `installmentOptions` entry — passed through untouched (including its interest rate) when upstream supplies one, synthesized from the option's own `value` with no interest when it does not — so a 1x row is always shown and selectable.
83
86
 
84
- **Selecting a row** dispatches the installment write action; on success the order total (interest-inclusive) updates elsewhere on the page with no further action from this component. On rejection, the first error message renders inline.
87
+ **Selecting a row** dispatches the installment write action. The mutation returns the cart, and the cart's `total` is the greater of the order form's value and the selected payment's value, so it includes the picked tier's interest; a `CartTotal` on the page reads it from the normalized cache. The rule lives in one place, `mapOrderFormToGqlCart` in the checkout module's `mappers.ts`, so every cart read and every mutation payload agrees, and the cart page shows the interest-inclusive total too. It gives the same answer whether or not upstream already folds interest into the order form's value, and it equals the value the order will be charged at. `installments-total-propagation.test.tsx` proves the path through a real Apollo cache, with an order value that differs from the tier's total. The totalizer lines do not include an interest line, so they may not add up to that total while an interest tier is selected. If the entry turns invalid after a pick, the selector disappears but the pick, and the total that includes its interest, stay until the entry is valid again. On rejection, the first error renders inline, worded from its code.
85
88
 
86
89
  ### InstallmentsSelect
87
90
 
88
- The collapsed sibling: same tiers, same matching, same write path, same `installmentTemplate`/`interestFreeLabel`/`interestTemplate` defaults as `Installments`, and the same formatting locale — the storefront context's, since neither component takes a `locale` prop — only the control itself differs (a Base UI Select instead of a radio group), plus two extra copy props for the closed control's own text.
91
+ The collapsed sibling: same tiers, same matching, same write path, same `installmentTemplate`/`interestFreeLabel`/`interestTemplate` messages as `Installments`, and the same formatting locale — the storefront context's, since neither component takes a `locale` prop — only the control itself differs (a Base UI Select instead of a radio group), plus two extra messages for the closed control's own text. No copy props.
92
+
93
+ **Content model** (`installments-select`):
89
94
 
90
- | Prop | Type | Default | Notes |
91
- |------|------|---------|-------|
92
- | `installmentTemplate` | string | `"{count}x of {value}"` | Same as `Installments`. |
93
- | `interestFreeLabel` | string | `"interest-free"` | Same as `Installments`. |
94
- | `interestTemplate` | string | `"{rate}% interest"` | Same as `Installments`: `{rate}` is the order form's hundredths-of-a-percent `interestRate` divided by 100. |
95
- | `label` | string | `"Installments"` | Accessible name for the control, rendered as the particle's own label element. Always renders — there is no mode that hides it; a store that already has its own heading suppresses it visually via its own `data-fs-installments-label` hook. An authored empty or whitespace-only string falls back to this default (T38) rather than rendering a nameless combobox. |
96
- | `placeholder` | string | `"Select an installment plan"` | Shown on the closed control when the bound count matches no tier in the currently matched option (a stale selection — see below). As of T31, every copy prop across both `Installments` and `InstallmentsSelect` defaults to en-US, while values and interest rates format in the storefront context's locale, which no prop overrides. A pt-BR store now authors every copy prop explicitly, not just these two. |
95
+ - `installmentTemplate`, `interestFreeLabel`, `interestTemplate`: same as `Installments`.
96
+ - `label`: accessible name for the control, rendered as the particle's own label element. Always renders — there is no mode that hides it; a store that already has its own heading suppresses it visually via its own `data-fs-installments-label` hook.
97
+ - `placeholder`: shown on the closed control when the bound count matches no tier in the currently matched option (a stale selection — see below).
98
+ - `invalidInstallmentMessage`, `missingMethodMessage`, `genericErrorMessage`: same as `Installments`.
99
+
100
+ Every message of both components is read only from `$content`; values and interest rates format in the storefront context's locale. A missing message renders empty and logs `message.missing`.
97
101
 
98
102
  **Data:** declares its own `fragment InstallmentsSelectData on Query`, with a selection set identical to `InstallmentsData` under a distinct name (two registered components on one page must not share a fragment name). Same `fetchStrategy: 'reactive'`.
99
103
 
@@ -134,7 +138,13 @@ Collapsed dropdown — same payment section, `InstallmentsSelect` in place of `I
134
138
  },
135
139
  "installments-select": {
136
140
  "type": "InstallmentsSelect",
137
- "props": { "label": "Parcelamento", "placeholder": "Selecione o parcelamento" }
141
+ "props": {
142
+ "installmentTemplate": "{count}x de {value}",
143
+ "interestFreeLabel": "sem juros",
144
+ "interestTemplate": "{rate}% de juros",
145
+ "label": "Parcelamento",
146
+ "placeholder": "Selecione o parcelamento"
147
+ }
138
148
  }
139
149
  }
140
150
  ```
@@ -149,7 +159,7 @@ Collapsed dropdown — same payment section, `InstallmentsSelect` in place of `I
149
159
  - **Using either component on a PDP.** A PDP's advertised plans are `Pricing`'s `PricingInstallments` / `PricingInstallmentPlans` — different data source, display-only, not reusable here.
150
160
  - **Using either component for a read-only recap.** A recap of the already-chosen installment (e.g. Order Review) is not `Installments` or `InstallmentsSelect`; both are selectors.
151
161
  - **Placing either component outside a payment section.** Both require a `PaymentSectionRoot`/`PaymentSectionController` ancestor and throw without one.
152
- - **Expecting a rendered order total.** Neither component ever shows a total — selecting an option updates the cart total elsewhere on the page through the normalized cache.
162
+ - **Expecting a rendered order total.** Neither component ever shows a total — selecting an option returns the cart, whose `total` includes the tier's interest, and `CartTotal` reads it from the normalized cache.
153
163
  - **Expecting a full card number or CVV field.** Both fragments structurally select neither — only installment counts, values, and interest rates.
154
164
  - **Expecting `InstallmentsSelect`'s option list to be styleable from the page's `style` array.** Its popup is portalled to `<body>` — see [Styling](#styling).
155
165
 
@@ -165,14 +175,16 @@ Single DOM root wrapping a list of selectable rows.
165
175
  |---|---|---|
166
176
  | `Installments` (root `div`) | Stacks the option rows | `flex flex-col gap-2` |
167
177
  | Fieldset (`data-fs-installments-fieldset`, native `<fieldset>`) | Wraps the legend and the radio rows (T38) — gives the group its visible, accessible name | usually left unstyled; a merchant border/padding choice |
168
- | Legend (`data-fs-fieldset-legend`, native `<legend>`) | The group's visible name, from `legend` | `text-[14px] font-medium text-[#1A1A1A]` |
169
- | Empty state (`data-fs-installments-state="empty"`) | Neutral placeholder sizing | `min-h-12 border border-dashed border-[#CCCCCC]` |
170
- | Loading state (`data-fs-installments-state="loading"`) | Skeleton affordance | `min-h-12 animate-pulse bg-[#F5F5F5]` |
178
+ | Legend (`data-fs-fieldset-legend`, native `<legend>`) | The group's visible name, from `legend` | `text-[14px] font-medium text-[var(--color-ink)]` |
179
+ | Empty state (`data-fs-installments-state="empty"`) | Neutral placeholder sizing | `min-h-12 border border-dashed border-[color-mix(in_srgb,var(--color-ink)_20%,transparent)]` |
180
+ | Loading state (`data-fs-installments-state="loading"`) | Skeleton affordance | `min-h-12 animate-pulse bg-[color-mix(in_srgb,var(--color-ink)_8%,transparent)]` |
171
181
  | Pending state (`data-fs-installments-state="pending"`) | Rows visible but disabled while the persisted BIN settles | `opacity-50 pointer-events-none` |
172
- | Inline error (`data-fs-installments-error`) | Warning-toned alert text | `text-[12px] font-medium text-[#B00020]` |
173
- | Option row label (`data-fs-installments-option-label`) | Row text | `text-[14px] text-[#1A1A1A]` |
182
+ | Inline error (`data-fs-installments-error`) | Warning-toned alert text | `text-[12px] font-medium` |
183
+ | Option row label (`data-fs-installments-option-label`) | Row text | `text-[14px] text-[var(--color-ink)]` |
174
184
  | Placing (`data-fs-installments-placing`) | Present while an order-placement sequence is in flight (T28) — distinct from the `pending` state above, which is this component's own BIN-confirmation wait; the root is also `inert` and `aria-disabled` at that point | `opacity-60 cursor-not-allowed` |
175
185
 
186
+ 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.
187
+
176
188
  Styled example:
177
189
 
178
190
  ```json
@@ -194,17 +206,19 @@ Root `div` plus a Base UI Select. Only the parts that stay inside the component
194
206
  |---|---|---|---|
195
207
  | `InstallmentsSelect` (root `div`, `data-fs-installments`) | Yes | Positions the label + trigger | `flex flex-col gap-1` |
196
208
  | `data-fs-installments-control="select"` | Yes | Discriminates this surface from the radio one when a store styles both from one shared selector | — |
197
- | Empty / loading state (`data-fs-installments-state`) | Yes | Same neutral/skeleton treatment as `Installments` | `min-h-12 border border-dashed border-[#CCCCCC]` / `min-h-12 animate-pulse bg-[#F5F5F5]` |
209
+ | Empty / loading state (`data-fs-installments-state`) | Yes | Same neutral/skeleton treatment as `Installments` | `min-h-12 border border-dashed border-[color-mix(in_srgb,var(--color-ink)_20%,transparent)]` / `min-h-12 animate-pulse bg-[color-mix(in_srgb,var(--color-ink)_8%,transparent)]` |
198
210
  | Pending state (`data-fs-installments-state="pending"`) | Yes | Trigger visible but disabled while the persisted BIN settles | `opacity-50 pointer-events-none` |
199
- | Inline error (`data-fs-installments-error`) | Yes | Warning-toned alert text | `text-[12px] font-medium text-[#B00020]` |
200
- | Label (`data-fs-installments-label`) | Yes | The accessible-name text above the trigger | `text-[12px] text-[#666666]`, or `sr-only` to hide it visually |
201
- | Trigger (`data-fs-installments-trigger`) | Yes | The closed control's own box | `flex items-center justify-between border border-[#CCCCCC] rounded px-3 py-2` |
202
- | Value (`data-fs-installments-value`) | Yes | The selected label / placeholder text | `text-[14px] text-[#1A1A1A]` |
203
- | Icon (`data-fs-installments-icon`) | Yes | The `▾` glyph | `text-[#666666]` |
211
+ | Inline error (`data-fs-installments-error`) | Yes | Warning-toned alert text | `text-[12px] font-medium` |
212
+ | Label (`data-fs-installments-label`) | Yes | The accessible-name text above the trigger | `text-[12px] text-[color-mix(in_srgb,var(--color-ink)_60%,transparent)]`, or `sr-only` to hide it visually |
213
+ | Trigger (`data-fs-installments-trigger`) | Yes | The closed control's own box | `flex items-center justify-between border border-[color-mix(in_srgb,var(--color-ink)_20%,transparent)] rounded px-3 py-2` |
214
+ | Value (`data-fs-installments-value`) | Yes | The selected label / placeholder text | `text-[14px] text-[var(--color-ink)]` |
215
+ | Icon (`data-fs-installments-icon`) | Yes | The `▾` glyph | `text-[color-mix(in_srgb,var(--color-ink)_60%,transparent)]` |
204
216
  | Option (`data-fs-installments-option`) | **No — portalled** | One row inside the open popup | not authorable from this page's `style` array today |
205
217
  | Option label (`data-fs-installments-option-label`) | **No — portalled** | An option's text | not authorable from this page's `style` array today |
206
218
  | Placing (`data-fs-installments-placing`) | Yes | Present while an order-placement sequence is in flight (T28) — the same hook and presence attribute name `Installments` uses (both surfaces read the shared engine's own `placing`); the root is also `inert` and `aria-disabled` at that point | `opacity-60 cursor-not-allowed` |
207
219
 
220
+ 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.
221
+
208
222
  Styled example (only the reachable parts):
209
223
 
210
224
  ```json
@@ -223,9 +237,9 @@ The popup's own visual defaults (spacing, hover, the selected-row treatment) com
223
237
  ## Accessibility Contract
224
238
 
225
239
  **What the platform promises:** `Installments`' radio group and `InstallmentsSelect`'s combobox each
226
- carry a visible, programmatic accessible name (`legend`/`label`, both defaulting to `"Installments"`) —
227
- a screen-reader user hears what the rows are a choice *between*. An authored empty or whitespace-only
228
- value on either falls back to the default rather than shipping a nameless control. Each tier keeps its
240
+ carry a visible, programmatic accessible name (the `legend`/`label` messages) — a screen-reader user
241
+ hears what the rows are a choice *between*. A store that leaves either message unauthored ships a
242
+ nameless control, and the formatter logs `message.missing`. Each tier keeps its
229
243
  own accessible name/text from `installmentLabel`. `Installments`' group is a native `<fieldset>`/
230
244
  `<legend>` pair, visible to sighted and low-vision shoppers, not only `aria-label`. Keyboard:
231
245
  `Installments`' group is one Tab stop — Tab lands on the checked row, and the arrow keys move the
package/dist/docs/logo.md CHANGED
@@ -117,7 +117,7 @@ Bound to a CMS entry, the element authors no content props at all — the entry
117
117
  ```
118
118
 
119
119
  The image carries no size of its own, so the width above only constrains the mark once the store tells it
120
- to fill the wrapper. Author that once per store as the `Logo` base swatch in `global.json → styles`:
120
+ to fill the wrapper. Author that once per store as the `Logo` base swatch in `foundation.json → styles`:
121
121
 
122
122
  ```json
123
123
  {
@@ -23,7 +23,7 @@ Use `MyAccountProfile` (not a hand-assembled combination of ad-hoc state) whenev
23
23
  ## When NOT to use
24
24
 
25
25
  - Rendering an individual profile field's presentation or input directly on the Root — that is each field Control's job. This Root owns no field's formatting or masking; the Controls delegate that to the `Field`, `PhoneField`, `DocumentField`, `Input`, and `Select` particles.
26
- - The signed-out prompt — compose the existing `SignInForm` alongside a `SessionGuard` in the store topology; this Root renders nothing for that audience.
26
+ - The signed-out prompt — compose the sign-in surface (`SignInRoot` with `SignInEmailControl` and the method components under it) inside a `SessionGuard` in the store topology; this Root renders nothing for that audience.
27
27
  - Editing the email — it is the login identifier and is read-only by construction; there is no edit-state rendering for it.
28
28
 
29
29
  ---
@@ -58,31 +58,35 @@ A field Control is absent from the composition means absent from both states and
58
58
  - **Field registration, not enumeration**: a Control calls `registerField({ key, validate?, normalize? })` in an effect on mount and unregisters on cleanup. The Root validates, batches, and focuses only over the live registry — it never names a field itself (Decision 1).
59
59
  - **Dirty is value comparison, not a touched flag**: `dirty(key) === draft[key] !== savedValues[key]`. Retyping a field back to its saved value makes Save a no-op for it, for free.
60
60
  - **Absent and empty are different instructions**: a dirty field cleared to `''` erases upstream; a field the shopper never touched is omitted from the payload entirely.
61
- - **Save order**: compute dirtiness first → nothing dirty raises the saved toast without dispatching → otherwise validate only the dirty registered fields' current draft values (Decision 9) → any error blocks the dispatch and focuses the first invalid field in rendered DOM order → otherwise normalize dirty values and dispatch one `$actions.identity.customerProfileUpdate` → a `userError` raises an error toast and keeps the edit state with the draft intact → success returns to the view state and raises a success toast (Decision 10). A field the shopper never touched is neither validated nor sent.
61
+ - **Save order**: compute dirtiness first → nothing dirty raises the saved toast without dispatching → otherwise validate only the dirty registered fields' current draft values (Decision 9) → any error blocks the dispatch and focuses the first invalid field in rendered DOM order → otherwise normalize dirty values and dispatch one `$actions.identity.customerProfileUpdate` → a `userError` raises an error toast worded by its `code` and keeps the edit state with the draft intact → success returns to the view state and raises a success toast (Decision 10). A field the shopper never touched is neither validated nor sent.
62
62
  - **Edit always opens from the latest saved values**: pressing Edit re-seeds the draft from `savedValues` before switching modes, so a value the server normalized on a previous save (not this task's concern, but a sibling Control's) is what the shopper sees, not a stale local draft.
63
63
  - **Background re-delivery**: when `$data` delivers new values while editing, a field re-seeds only if its draft still equals the previously saved value; a dirty field is never clobbered.
64
64
  - **Self-gate**: renders nothing outside `state === 'loggedIn'`, even if the topology's `SessionGuard` is missing. Renders `MyAccountProfileSkeleton` while `$data` is unresolved and the shopper is logged in — never an empty summary. `customerProfile` is nullable, so `$data` is also `null` for an anonymous session (the self-gate renders nothing) and for a logged-in shopper whose read failed (the skeleton stays).
65
- - **PII**: no profile value appears in any log line. A write that throws (rather than resolving `userErrors`) logs only the error's name; the message shown to the shopper is the `saveFailedMessage` schema prop.
65
+ - **PII**: no profile value appears in any log line. A write that throws (rather than resolving `userErrors`) logs only the error's name; the message shown to the shopper is the `saveFailedMessage` message.
66
66
 
67
67
  ---
68
68
 
69
69
  ## Props
70
70
 
71
- **`MyAccountProfile.Root`** — `documentType` (string, e.g. `'CPF'`; the store-configured fallback used when the saved `documentType` is not a registered type), `savedMessage` (string, default `'Your profile has been saved.'`; the toast title on a successful Save), `saveFailedMessage` (string, default `'Unable to save your profile. Please try again.'`; the toast title on a failed Save). Declares `actions: { identity: ['customerProfileUpdate'] }`, `requiresContext: 'session'`, `providesContext: 'my-account-profile'`, `fetchStrategy: 'reactive'`.
71
+ Every message below is an ICU message field on the part's own content type (`my-account-profile-root`,
72
+ `-edit`, `-save`, `-cancel`, `-first-name`, `-last-name`, `-phone`, `-tax-id`, `-birth-date`, `-gender`),
73
+ with no package default: an unauthored one renders empty and logs `message.missing`.
72
74
 
73
- **`.EditButton` / `.SaveButton` / `.CancelButton`** — `label` (sensible default) or composed `children`.
75
+ **`MyAccountProfile.Root`** — `documentType` (string, e.g. `'CPF'`; the store-configured fallback used when the saved `documentType` is not a registered type), and the messages `savedMessage` (source `Your profile has been saved.`; the toast title on a successful Save) and `saveFailedMessage` (source `Unable to save your profile. Please try again.`; the toast title on a failed Save). A refused Save's toast title is keyed on the refusal's `code`: `INVALID_VALUE` → `invalidValueMessage` (source `Some of your details were not accepted. Check them and try again.`; the account names no field), `UNAUTHORIZED` → `sessionExpiredMessage` (source `Your session has expired. Please sign in again.`), and `NETWORK_ERROR`, a write that throws or a missing action → `saveFailedMessage`. A code none of these words (one a newer server added) shows `saveFailedMessage` and logs `message.unknown-code`; a blank field raises an empty toast and logs `message.missing`. Declares `actions: { identity: ['customerProfileUpdate'] }`, `requiresContext: 'session'`, `providesContext: 'my-account-profile'`, `fetchStrategy: 'reactive'`.
76
+
77
+ **`.EditButton` / `.SaveButton` / `.CancelButton`** — the `label` message (source `Edit` / `Save` / `Cancel`) or composed `children`.
74
78
 
75
79
  **`.Email` / `.Skeleton`** — no props beyond `className`.
76
80
 
77
- **`.FirstNameControl` / `.LastNameControl`** — `label` (default `'First name'` / `'Last name'`), `requiredMessage` (shown when Save is blocked on an empty value).
81
+ **`.FirstNameControl` / `.LastNameControl`** — the messages `label` (source `First name` / `Last name`) and `requiredMessage` (source `First name is required.` / `Last name is required.`; shown when Save is blocked on an empty value).
78
82
 
79
- **`.PhoneControl`** — `field` (`'homePhone' | 'mobilePhone'`, default `'mobilePhone'`; compose the Control twice to expose both numbers), `country` (`'US' | 'BR'`, default `'US'`), `label`, `invalidMessage`.
83
+ **`.PhoneControl`** — `field` (`'homePhone' | 'mobilePhone'`, default `'mobilePhone'`; compose the Control twice to expose both numbers), `country` (`'US' | 'BR'`, default `'US'`), and the messages `label` (source `Phone`) and `invalidMessage` (source `Invalid phone number`), which it formats and hands to `PhoneField`.
80
84
 
81
- **`.TaxIdControl`** — `label` (default `'National tax ID'`), `invalidMessage`, `lockedReason` (the inline copy shown beside the disabled input when a document is already saved). The control masks, validates and normalizes with the active document type: CPF, SSN, SIN or RFC. It sends `document` only (never `documentType`): digits for CPF, SSN and SIN, letters kept for RFC.
85
+ **`.TaxIdControl`** — the messages `label` (source `National tax ID`), `invalidMessage` (source `Invalid document number.`), `lockedReason` (source `Your document ID can't be edited.`; the inline copy shown beside the disabled input when a document is already saved). The control masks, validates and normalizes with the active document type: CPF, SSN, SIN or RFC. It sends `document` only (never `documentType`): digits for CPF, SSN and SIN, letters kept for RFC.
82
86
 
83
- **`.BirthDateControl`** — `label` (default `'Birth date'`).
87
+ **`.BirthDateControl`** — the `label` message (source `Birth date`).
84
88
 
85
- **`.GenderControl`** — `label` (default `'Gender'`), `placeholder`, `clearLabel` (default `'Clear'`; the button shown once a draft value is set, since the Select itself offers no way back to empty), `options` (`{ value, label }[]`, defaults to a sensible set: female / male / other / prefer not to say).
89
+ **`.GenderControl`** — the messages `label` (source `Gender`), `placeholder` (source `Select`), `clearLabel` (source `Clear`; the button shown once a draft value is set, since the Select itself offers no way back to empty), `options` (`{ value, label }[]`; an authored list keeps its own labels. Unset, the control offers female / male / other / prefer not to say, labelled by the messages `femaleLabel`, `maleLabel`, `otherLabel` and `preferNotToSayLabel`, sources `Female`, `Male`, `Other`, `Prefer not to say`).
86
90
 
87
91
  ---
88
92
 
@@ -159,13 +163,14 @@ The `data-fs-my-account-profile-field="<key>"` attribute on each Control's own w
159
163
  }
160
164
  ```
161
165
 
162
- Add each field Control id to `profile-root`'s `children` array for the fields the store exposes. A sibling `SignInForm`, gated by a `SessionGuard` with `when: ["anonymous", "identified"]`, composes next to `profile-guard` for the signed-out audience.
166
+ Add each field Control id to `profile-root`'s `children` array for the fields the store exposes. For the signed-out audience, a sibling `SessionGuard` with `when: ["anonymous", "identified"]` composes next to `profile-guard` and holds a `SignInRoot` with `SignInEmailControl` and the method components (`SignInForm`, the access-code family) under it, so the branch follows the account's enabled sign-in methods; a store that hosts `SignInRoot` in its shared layout needs only the guard and the method components.
163
167
 
164
168
  ---
165
169
 
166
170
  ## Common mistakes
167
171
 
168
172
  - **Rendering `MyAccountProfile.Root` outside `SessionRoot`.** `useSession()` throws; the page must host a `SessionRoot`.
173
+ - **Composing `SignInForm` in the signed-out branch without a `SignInRoot` ancestor.** The page fails the **build**, not the render: sukima rejects it with the diagnostic code `context-constraint-violation`, because `SignInForm` `requiresContext: 'sign-in'` and nothing above it provides it. Compose `SignInRoot` (with `SignInEmailControl`) around the method components in the branch, unless the store's shared layout already hosts it.
169
174
  - **Rendering `MyAccountProfile.Root` outside a `ToastProvider`.** Save calls `useToast()` (Decision 10); without a `ToastProvider` ancestor that call throws.
170
175
  - **Expecting the email to be editable.** It is always read-only; there is no edit-state rendering for it anywhere in this compound.
171
176
  - **Composing a field Control without an unmount cleanup on its `registerField` effect.** A Control that never unregisters leaks a stale validator into the registry after it stops rendering — every shipped Control returns the unregister function from its effect; keep that pattern in a custom Control.
@@ -126,7 +126,7 @@ When you author `target: "_blank"`, write the "(opens in new tab)" cue into `chi
126
126
 
127
127
  | Component | What you style | Plausible classes |
128
128
  |---|---|---|
129
- | `NavigationLink` | The label — typography, color, and hover affordance | `text-[14px] leading-[1.4] font-medium text-[#1A1A1A] no-underline hover:underline` |
129
+ | `NavigationLink` | The label — typography, color, and hover affordance | `text-[14px] leading-[1.4] font-medium text-[var(--color-text)] no-underline hover:underline` |
130
130
 
131
131
  The spacing between links belongs to the parent that groups them, not to the link. Give that parent the `flex` and `gap-[*]` classes and keep each link to typography and color.
132
132
 
@@ -142,16 +142,18 @@ Styled example of a row of links:
142
142
  "nav-sale": {
143
143
  "type": "NavigationLink",
144
144
  "props": { "href": "/collection/sale", "children": "Sale" },
145
- "style": ["text-[14px]", "leading-[1.4]", "font-medium", "text-[#1A1A1A]", "no-underline", "hover:underline"]
145
+ "style": ["text-[14px]", "leading-[1.4]", "font-medium", "text-[var(--color-text)]", "no-underline", "hover:underline"]
146
146
  },
147
147
  "nav-new": {
148
148
  "type": "NavigationLink",
149
149
  "props": { "href": "/collection/new-in", "children": "New in" },
150
- "style": ["text-[14px]", "leading-[1.4]", "font-medium", "text-[#1A1A1A]", "no-underline", "hover:underline"]
150
+ "style": ["text-[14px]", "leading-[1.4]", "font-medium", "text-[var(--color-text)]", "no-underline", "hover:underline"]
151
151
  }
152
152
  }
153
153
  ```
154
154
 
155
+ The colors that several elements share are variables of the page or layout `theme`, which declares them: `{"--color-text": "#1A1A1A"}`. A color used once stays a hex.
156
+
155
157
  ---
156
158
 
157
159
  ## Related
@@ -36,7 +36,9 @@ The dialog, the reason list, and the acknowledgement are inside this matter.
36
36
 
37
37
  ### OrderCancel
38
38
 
39
- No authoring props. The page query passes the order. Reasons and sentences come from the `order-cancel` content model.
39
+ No authoring props. The page query passes the order. Reasons and sentences come from the `order-cancel` content model. Its sentences are ICU messages; a missing one renders empty and logs. Without authored `reasons`, the dialog offers `reasonChangedMind`, `reasonBoughtByMistake`, `reasonBetterPrice`, and `reasonSlowDelivery`, in that order. Authored `reasons` replace them, and their labels stay plain text.
40
+
41
+ A refused cancellation is worded from content by its code: `ORDER_NOT_CANCELLABLE` shows `notCancellableMessage`, `NOT_FOUND` shows `notFoundMessage`, and a transport failure (`NETWORK_ERROR`) shows `failure`. A code this component does not know, one a newer server added, also shows `failure` and logs `message.unknown-code`.
40
42
 
41
43
  ## Styling
42
44
 
@@ -38,12 +38,14 @@ OrderDeliveryGroup
38
38
 
39
39
  ### OrderDeliveryAddress
40
40
 
41
- | Prop | Type | Default | Description |
42
- |---|---|---|---|
43
- | deliveryLabel | string | catalogue `fs/order-delivery-address.delivery` | Caption above a delivery address |
44
- | storeLabel | string | catalogue `fs/order-delivery-address.store` | Caption above a pickup store address |
41
+ No schema props. The captions are ICU messages in content (`order-delivery-address`):
45
42
 
46
- Content model `order-delivery-address` with `deliveryLabel` and `storeLabel`. Content wins over the prop, and the prop wins over the catalogue. A blank value falls through.
43
+ | Content field | Description |
44
+ |---|---|
45
+ | deliveryLabel | Caption above a delivery address |
46
+ | storeLabel | Caption above a pickup store address |
47
+
48
+ A missing message renders empty and logs.
47
49
 
48
50
  ## Data
49
51
 
@@ -41,9 +41,7 @@ The group order is the order of `deliveryOptions`.
41
41
 
42
42
  ### OrderDeliveryGroup
43
43
 
44
- | Prop | Type | Default | Description |
45
- |---|---|---|---|
46
- | label | string | content, then catalogue `fs/order-delivery-group.label` | Accessible name of the section. The other fixed labels are content too (`order-delivery-group`). Item counts keep `{count}`. |
44
+ No schema props. The accessible name of the section (`label`) and the other fixed labels are ICU messages in content (`order-delivery-group`). The item count `items` takes a `count` argument (`{count, plural, one {# item} other {# items}}`). A missing message renders empty and logs.
47
45
 
48
46
  The initial open state is not a prop. One option opens; two or more start closed.
49
47
 
@@ -34,7 +34,7 @@ OrderDetailsBack
34
34
 
35
35
  | Prop | Type | Default | Purpose |
36
36
  |---|---|---|---|
37
- | — | — | — | No schema props. The label is content (`order-details-back`); a blank field keeps `fs/order.back-to-orders`. The href is `/pvt/orders`. |
37
+ | — | — | — | No schema props. The label is an ICU message in content (`order-details-back.label`); a missing one renders empty and logs. The href is `/pvt/orders`. |
38
38
 
39
39
  ## Styling hooks
40
40
 
@@ -37,11 +37,8 @@ OrderDetailsHeader
37
37
  | Prop | Type | Default | Purpose |
38
38
  |---|---|---|---|
39
39
  | `$data` | `{ id, completion } \| null` | — | The `customerOrder` the generator passes. Null renders nothing. |
40
- | `prefix` | string | `Order #` | Copy before the number. Content wins. An empty string, with no content, omits the prefix. |
41
- | `copyLabel` | string | `Copy` | Visible label of the copy action. Content wins. |
42
- | `copyAccessibleName` | string | `Copy order number` | Accessible name of the copy action. Content wins. |
43
40
 
44
- Content id `order-details-header` also carries the copy acknowledgement (`copyCopied`, `copyFailure`, `copyDismiss`) and one field per status sentence (`statusInProgress`, `statusCancellationRequested`, `statusCancelled`, `statusDelivered`, `statusShipped`, `statusReadyForPickup`, `statusCollected`, `statusPlaceholder`). A blank field keeps the catalogue. The list page does not read this entry.
41
+ No schema props. Content id `order-details-header` carries the copy before the number (`prefix`), the copy action (`copyLabel`, `copyAccessibleName`), its acknowledgement (`copyCopied`, `copyFailure`, `copyDismiss`), and one field per status sentence (`statusInProgress`, `statusCancellationRequested`, `statusCancelled`, `statusDelivered`, `statusShipped`, `statusReadyForPickup`, `statusCollected`, `statusPlaceholder`). Every field is an ICU message. The header formats them and passes them to `CopyText` and `OrderStatusBadge`. A missing message renders empty and logs; a missing `prefix` also omits the prefix element. The list page does not read this entry.
45
42
 
46
43
  ## Styling hooks
47
44
 
@@ -0,0 +1,60 @@
1
+ # OrderInvoiceDownload
2
+
3
+ **Category:** action
4
+ **Purpose:** Offers every invoice file the order kept, so the shopper can download them.
5
+
6
+ ---
7
+
8
+ ## Visual cues (how to identify in an image)
9
+
10
+ - A "Download invoice" button on the order page, usually beside the cancel action.
11
+ - With several files, the button opens a dialog with a short sentence and one entry per invoice ("Invoice 1 of 2").
12
+ - No status, no money, no product.
13
+
14
+ The image is the source of truth for layout.
15
+
16
+ ## When to use
17
+
18
+ - On the order details page, for an order the merchant has invoiced.
19
+
20
+ ## When NOT to use
21
+
22
+ - For a printable bank slip → `OrderPayment` owns that action.
23
+ - For the order list → each row has no invoice control.
24
+
25
+ ---
26
+
27
+ ## Composition
28
+
29
+ Standalone. Place it anywhere under the order details page. It does not choose its place.
30
+
31
+ ```text
32
+ OrderInvoiceDownload
33
+ ```
34
+
35
+ The dialog and the invoice list are inside this matter. The dialog portals into this root so its styling hooks stay reachable.
36
+
37
+ ## Data
38
+
39
+ Fragment on `Query`: `customerOrder(id: $orderId) { progress { cancelled } invoices { url issuedAt kind } }`. The generator binds `$data` to that root field.
40
+
41
+ - One file navigates to the merchant address. No dialog opens.
42
+ - Several files open a dialog. The list stays mounted until the browser leaves the page, so it stays open only when the merchant serves the file as an attachment.
43
+ - An address the browser would execute (`javascript:`) is dropped before the one-or-many choice.
44
+ - The component renders nothing when the order is cancelled or no file remains.
45
+
46
+ ## Components
47
+
48
+ ### OrderInvoiceDownload
49
+
50
+ No schema props. Every label is an ICU message in the `order-invoice-download` content model: `downloadLabel`, `entryLabel` (arguments `n` and `total`), `description`, and `closeLabel`. A missing one renders empty and logs.
51
+
52
+ ## Styling
53
+
54
+ - `data-fs-order-invoice-download` — the root.
55
+ - `data-fs-order-invoice-download-control` — the button that downloads, or opens the dialog.
56
+ - `data-fs-dialog-backdrop`, `data-fs-dialog-viewport`, `data-fs-dialog-popup`, `data-fs-dialog-title`, `data-fs-dialog-description` — the overlay.
57
+ - `data-fs-order-invoice-download-header` — the title and close row. `data-fs-order-invoice-download-dismiss` is the close mark.
58
+ - `data-fs-order-invoice-download-list` — the invoice list.
59
+ - `data-fs-order-invoice-download-entry` — one invoice button.
60
+ - `data-fs-order-invoice-download-skeleton` — the loading placeholder.
@@ -35,7 +35,7 @@ OrderList
35
35
 
36
36
  ### OrderListRow
37
37
 
38
- No props. The list passes the order.
38
+ No schema props. The list passes the order and `statusMessages`, the status sentences it formats from its own `status*` messages. The row has no content of its own.
39
39
 
40
40
  ## Styling
41
41
 
@@ -38,25 +38,18 @@ OrderListSearch
38
38
 
39
39
  ### OrderListSearch
40
40
 
41
- | Prop | Type | Default | Notes |
42
- |------|------|---------|-------|
43
- | `label` | string | `Order number` | Visible label of the text field. |
44
- | `fromLabel` | string | `Placed from` | Visible label of the from day. |
45
- | `toLabel` | string | `Placed to` | Visible label of the to day. |
46
- | `submitLabel` | string | `Search` | Submit button. |
47
- | `clearLabel` | string | `Clear search` | Clear link. Rendered only when the URL already has a criterion. |
48
- | `invalidRangeMessage` | string | `The start date is after the end date.` | Shown when the from day is after the to day. |
41
+ No props of its own.
49
42
 
50
- Content model (`order-list-search`) fields, edited in the CMS. A non-blank field wins over the matching prop. A blank field falls through to the prop, then to the default. A blank field does not remove a control.
43
+ Content model (`order-list-search`) fields, all ICU messages. A store without CMS authors them on the element; a CMS-bound store keeps them in content. An unauthored field renders empty and logs `message.missing`; it does not remove a control.
51
44
 
52
45
  | Field | Type | Required | Notes |
53
46
  |-------|------|----------|-------|
54
- | `label` | string | no | Maps to `label`. |
55
- | `from` | string | no | Maps to `fromLabel`. |
56
- | `to` | string | no | Maps to `toLabel`. |
57
- | `submit` | string | no | Maps to `submitLabel`. |
58
- | `clear` | string | no | Maps to `clearLabel`. |
59
- | `invalidRange` | string | no | Maps to `invalidRangeMessage`. |
47
+ | `label` | string | no | Visible label of the text field. Source: `Order number`. |
48
+ | `from` | string | no | Visible label of the from day. Source: `Placed from`. |
49
+ | `to` | string | no | Visible label of the to day. Source: `Placed to`. |
50
+ | `submit` | string | no | Submit button. Source: `Search`. |
51
+ | `clear` | string | no | Clear link, rendered only when the URL already has a criterion. Source: `Clear search`. |
52
+ | `invalidRange` | string | no | Shown when the from day is after the to day. Source: `The start date is after the end date.` |
60
53
 
61
54
  **The param keys are fixed.** The term is `search`. The days are `placedFrom` and `placedTo`, as RFC 3339 UTC instants of the local start and the local end of the picked days. Renaming a label does not change the keys. Submit and clear delete `after` and keep `view`.
62
55
 
@@ -74,11 +67,11 @@ Content model (`order-list-search`) fields, edited in the CMS. A non-blank field
74
67
  "type": "OrderListSearch",
75
68
  "props": {
76
69
  "label": "Order number",
77
- "fromLabel": "Placed from",
78
- "toLabel": "Placed to",
79
- "submitLabel": "Search",
80
- "clearLabel": "Clear search",
81
- "invalidRangeMessage": "The start date is after the end date."
70
+ "from": "Placed from",
71
+ "to": "Placed to",
72
+ "submit": "Search",
73
+ "clear": "Clear search",
74
+ "invalidRange": "The start date is after the end date."
82
75
  },
83
76
  "children": [],
84
77
  "style": ["flex flex-wrap items-end gap-[12px]"]
@@ -38,23 +38,17 @@ OrderListViews
38
38
 
39
39
  ### OrderListViews
40
40
 
41
- | Prop | Type | Default | Notes |
42
- |------|------|---------|-------|
43
- | `label` | string | `Order views` | Accessible name of the navigation landmark. |
44
- | `allLabel` | string | `All orders` | Visible name of the all-orders choice. |
45
- | `ongoingLabel` | string | `Ongoing` | Visible name of the ongoing choice. |
46
- | `completedLabel` | string | `Completed` | Visible name of the completed choice. |
47
- | `cancelledLabel` | string | `Cancelled` | Visible name of the cancelled choice. |
41
+ No props of its own.
48
42
 
49
- Content model (`order-list-views`) fields, edited in the CMS. A non-blank field wins over the matching prop. A blank field falls through to the prop, then to the default. A blank field does not remove a choice.
43
+ Content model (`order-list-views`) fields, all ICU messages. A store without CMS authors them on the element; a CMS-bound store keeps them in content. An unauthored field renders empty and logs `message.missing`; it does not remove a choice.
50
44
 
51
45
  | Field | Type | Required | Notes |
52
46
  |-------|------|----------|-------|
53
- | `label` | string | no | Accessible name. Maps to `label`. |
54
- | `all` | string | no | Maps to `allLabel`. |
55
- | `ongoing` | string | no | Maps to `ongoingLabel`. |
56
- | `completed` | string | no | Maps to `completedLabel`. |
57
- | `cancelled` | string | no | Maps to `cancelledLabel`. |
47
+ | `label` | string | no | Accessible name of the navigation landmark. Source: `Order views`. |
48
+ | `all` | string | no | Name of the all-orders choice. Source: `All orders`. |
49
+ | `ongoing` | string | no | Name of the ongoing choice. Source: `Ongoing`. |
50
+ | `completed` | string | no | Name of the completed choice. Source: `Completed`. |
51
+ | `cancelled` | string | no | Name of the cancelled choice. Source: `Cancelled`. |
58
52
 
59
53
  **The href values are fixed.** All orders omits `view`. The other three set `view` to `ongoing`, `completed`, or `cancelled`. Renaming a label does not change the param. The switch also deletes `after` and keeps every other search param, including `search`, `placedFrom`, and `placedTo`.
60
54
 
@@ -72,10 +66,10 @@ Content model (`order-list-views`) fields, edited in the CMS. A non-blank field
72
66
  "type": "OrderListViews",
73
67
  "props": {
74
68
  "label": "Order views",
75
- "allLabel": "All orders",
76
- "ongoingLabel": "Ongoing",
77
- "completedLabel": "Completed",
78
- "cancelledLabel": "Cancelled"
69
+ "all": "All orders",
70
+ "ongoing": "Ongoing",
71
+ "completed": "Completed",
72
+ "cancelled": "Cancelled"
79
73
  },
80
74
  "children": [],
81
75
  "style": ["flex flex-wrap gap-[8px]"]