@vtex/faststore 0.0.4 → 0.0.6

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 (306) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/dist/actions.json +181 -0
  3. package/dist/catalog.json +1595 -481
  4. package/dist/client.d.ts +2 -1
  5. package/dist/client.js +2 -1
  6. package/dist/components.d.ts +31 -7
  7. package/dist/components.js +35 -13
  8. package/dist/content-types.json +73 -0
  9. package/dist/docs/access-code-sign-in.md +1 -1
  10. package/dist/docs/account-access-gate.md +153 -0
  11. package/dist/docs/account-entry-point.md +1 -2
  12. package/dist/docs/account-menu.md +164 -0
  13. package/dist/docs/address-summary.md +24 -3
  14. package/dist/docs/alert-dialog.md +204 -0
  15. package/dist/docs/billing-address.md +284 -0
  16. package/dist/docs/buy-button.md +1 -1
  17. package/dist/docs/card-entry.md +250 -0
  18. package/dist/docs/cardholder-document.md +142 -0
  19. package/dist/docs/cart.md +1 -1
  20. package/dist/docs/client-preferences-fieldset.md +148 -0
  21. package/dist/docs/client-preferences.md +2 -1
  22. package/dist/docs/client-profile-fieldset.md +184 -0
  23. package/dist/docs/client-profile.md +1 -1
  24. package/dist/docs/document-field.md +58 -4
  25. package/dist/docs/field.md +317 -0
  26. package/dist/docs/form.md +307 -0
  27. package/dist/docs/identity-edit.md +6 -6
  28. package/dist/docs/identity-summary.md +5 -5
  29. package/dist/docs/installments.md +248 -0
  30. package/dist/docs/my-account-profile.md +1 -0
  31. package/dist/docs/order-placed-payment-summary.md +138 -0
  32. package/dist/docs/payment-method-badges.md +232 -0
  33. package/dist/docs/payment-methods.md +1 -0
  34. package/dist/docs/payment.md +218 -0
  35. package/dist/docs/phone-field.md +58 -4
  36. package/dist/docs/place-order.md +157 -0
  37. package/dist/docs/save-card.md +186 -0
  38. package/dist/docs/saved-cards.md +218 -0
  39. package/dist/docs/select.md +465 -0
  40. package/dist/docs/session.md +1 -1
  41. package/dist/docs/shipping-address.md +110 -258
  42. package/dist/docs/sign-in-redirect.md +1 -1
  43. package/dist/index.d.ts +4 -1
  44. package/dist/internal/client.d.ts +3 -1
  45. package/dist/internal/client.js +3 -1
  46. package/dist/matter/access-code-sign-in/access-code-sign-in.js +9 -8
  47. package/dist/matter/access-code-sign-in/access-code-sign-in.js.map +1 -1
  48. package/dist/matter/account-access-gate/account-access-gate.d.ts +86 -0
  49. package/dist/matter/account-access-gate/account-access-gate.js +283 -0
  50. package/dist/matter/account-access-gate/account-access-gate.js.map +1 -0
  51. package/dist/matter/account-access-gate/sign-out-intent.d.ts +17 -0
  52. package/dist/matter/account-access-gate/sign-out-intent.js +62 -0
  53. package/dist/matter/account-access-gate/sign-out-intent.js.map +1 -0
  54. package/dist/matter/account-entry-point/account-entry-point.js +2 -2
  55. package/dist/matter/account-entry-point/account-entry-point.js.map +1 -1
  56. package/dist/matter/account-menu/account-menu.d.ts +88 -0
  57. package/dist/matter/account-menu/account-menu.js +246 -0
  58. package/dist/matter/account-menu/account-menu.js.map +1 -0
  59. package/dist/matter/billing-address/billing-address.d.ts +165 -0
  60. package/dist/matter/billing-address/billing-address.js +408 -0
  61. package/dist/matter/billing-address/billing-address.js.map +1 -0
  62. package/dist/matter/card-entry/card-capture.d.ts +25 -0
  63. package/dist/matter/card-entry/card-capture.js +25 -0
  64. package/dist/matter/card-entry/card-capture.js.map +1 -0
  65. package/dist/matter/card-entry/card-entry.d.ts +120 -0
  66. package/dist/matter/card-entry/card-entry.js +832 -0
  67. package/dist/matter/card-entry/card-entry.js.map +1 -0
  68. package/dist/matter/cardholder-document/cardholder-document.d.ts +45 -0
  69. package/dist/matter/cardholder-document/cardholder-document.js +70 -0
  70. package/dist/matter/cardholder-document/cardholder-document.js.map +1 -0
  71. package/dist/matter/cart/cart.d.ts +1 -1
  72. package/dist/matter/cart/cart.js +2 -2
  73. package/dist/matter/cart/cart.js.map +1 -1
  74. package/dist/matter/client-preferences/client-preferences-fieldset.d.ts +77 -0
  75. package/dist/matter/client-preferences/client-preferences-fieldset.js +299 -0
  76. package/dist/matter/client-preferences/client-preferences-fieldset.js.map +1 -0
  77. package/dist/matter/client-preferences/client-preferences.d.ts +3 -5
  78. package/dist/matter/client-preferences/client-preferences.js +6 -6
  79. package/dist/matter/client-preferences/client-preferences.js.map +1 -1
  80. package/dist/matter/client-profile/client-profile.d.ts +4 -6
  81. package/dist/matter/client-profile/client-profile.js +9 -6
  82. package/dist/matter/client-profile/client-profile.js.map +1 -1
  83. package/dist/matter/client-profile-form/client-profile-fieldset.d.ts +119 -0
  84. package/dist/matter/client-profile-form/client-profile-fieldset.js +488 -0
  85. package/dist/matter/client-profile-form/client-profile-fieldset.js.map +1 -0
  86. package/dist/matter/delivery-options/delivery-options.js.map +1 -1
  87. package/dist/matter/identity-edit/identity-edit.js +2 -2
  88. package/dist/matter/identity-edit/identity-edit.js.map +1 -1
  89. package/dist/matter/identity-summary/identity-summary.js +2 -2
  90. package/dist/matter/identity-summary/identity-summary.js.map +1 -1
  91. package/dist/matter/installments/installments-select.d.ts +42 -0
  92. package/dist/matter/installments/installments-select.js +167 -0
  93. package/dist/matter/installments/installments-select.js.map +1 -0
  94. package/dist/matter/installments/installments.d.ts +58 -0
  95. package/dist/matter/installments/installments.js +176 -0
  96. package/dist/matter/installments/installments.js.map +1 -0
  97. package/dist/matter/installments/use-installments-selection.d.ts +29 -0
  98. package/dist/matter/installments/use-installments-selection.js +95 -0
  99. package/dist/matter/installments/use-installments-selection.js.map +1 -0
  100. package/dist/matter/my-account-profile/my-account-profile.js +5 -5
  101. package/dist/matter/my-account-profile/my-account-profile.js.map +1 -1
  102. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.d.ts +63 -0
  103. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js +305 -0
  104. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js.map +1 -0
  105. package/dist/matter/payment/payment-card-capture.d.ts +19 -0
  106. package/dist/matter/payment/payment-card-capture.js +129 -0
  107. package/dist/matter/payment/payment-card-capture.js.map +1 -0
  108. package/dist/matter/payment/payment-controller.d.ts +24 -0
  109. package/dist/matter/payment/payment-controller.js +107 -0
  110. package/dist/matter/payment/payment-controller.js.map +1 -0
  111. package/dist/matter/payment/payment-method-badges.d.ts +57 -0
  112. package/dist/matter/payment/payment-method-badges.js +192 -0
  113. package/dist/matter/payment/payment-method-badges.js.map +1 -0
  114. package/dist/matter/payment/payment.d.ts +89 -0
  115. package/dist/matter/payment/payment.js +263 -0
  116. package/dist/matter/payment/payment.js.map +1 -0
  117. package/dist/matter/payment/use-payment-method-selection.d.ts +302 -0
  118. package/dist/matter/payment/use-payment-method-selection.js +458 -0
  119. package/dist/matter/payment/use-payment-method-selection.js.map +1 -0
  120. package/dist/matter/payment/use-payment-submit-gate.d.ts +111 -0
  121. package/dist/matter/payment/use-payment-submit-gate.js +144 -0
  122. package/dist/matter/payment/use-payment-submit-gate.js.map +1 -0
  123. package/dist/matter/place-order/place-order.d.ts +74 -0
  124. package/dist/matter/place-order/place-order.js +379 -0
  125. package/dist/matter/place-order/place-order.js.map +1 -0
  126. package/dist/matter/product-list/product-list.d.ts +1 -0
  127. package/dist/matter/product-list/product-list.js.map +1 -1
  128. package/dist/matter/product-shelf/product-shelf.d.ts +1 -0
  129. package/dist/matter/product-shelf/product-shelf.js +2 -0
  130. package/dist/matter/product-shelf/product-shelf.js.map +1 -1
  131. package/dist/matter/region/region.js +1 -1
  132. package/dist/matter/region/region.js.map +1 -1
  133. package/dist/matter/save-card/save-card.d.ts +49 -0
  134. package/dist/matter/save-card/save-card.js +188 -0
  135. package/dist/matter/save-card/save-card.js.map +1 -0
  136. package/dist/matter/saved-cards/saved-cards.d.ts +79 -0
  137. package/dist/matter/saved-cards/saved-cards.js +387 -0
  138. package/dist/matter/saved-cards/saved-cards.js.map +1 -0
  139. package/dist/matter/shipping-address/country-descriptors.js +20 -10
  140. package/dist/matter/shipping-address/country-descriptors.js.map +1 -1
  141. package/dist/matter/shipping-address/shipping-address.d.ts +113 -174
  142. package/dist/matter/shipping-address/shipping-address.js +481 -792
  143. package/dist/matter/shipping-address/shipping-address.js.map +1 -1
  144. package/dist/matter/shipping-simulator/shipping-simulator.js.map +1 -1
  145. package/dist/matter/variant-selector/variant-selector.js +1 -1
  146. package/dist/particles/address-summary/address-summary.d.ts +24 -0
  147. package/dist/particles/address-summary/address-summary.js +83 -2
  148. package/dist/particles/address-summary/address-summary.js.map +1 -1
  149. package/dist/particles/alert-dialog/alert-dialog.d.ts +68 -0
  150. package/dist/particles/alert-dialog/alert-dialog.js +187 -0
  151. package/dist/particles/alert-dialog/alert-dialog.js.map +1 -0
  152. package/dist/particles/checkbox/checkbox.d.ts +7 -3
  153. package/dist/particles/checkbox/checkbox.js +4 -1
  154. package/dist/particles/checkbox/checkbox.js.map +1 -1
  155. package/dist/particles/document-field/document-field.d.ts +48 -5
  156. package/dist/particles/document-field/document-field.js +189 -32
  157. package/dist/particles/document-field/document-field.js.map +1 -1
  158. package/dist/particles/field/bound-field-registry.js +52 -0
  159. package/dist/particles/field/bound-field-registry.js.map +1 -0
  160. package/dist/particles/field/field.d.ts +116 -0
  161. package/dist/particles/field/field.js +497 -6
  162. package/dist/particles/field/field.js.map +1 -1
  163. package/dist/particles/fieldset/fieldset.js +2 -2
  164. package/dist/particles/fieldset/fieldset.js.map +1 -1
  165. package/dist/particles/footer-social/footer-social.js +1 -1
  166. package/dist/particles/form/form.d.ts +104 -0
  167. package/dist/particles/form/form.js +485 -0
  168. package/dist/particles/form/form.js.map +1 -0
  169. package/dist/particles/incentives/incentives.js +1 -1
  170. package/dist/particles/phone-field/phone-field.d.ts +38 -10
  171. package/dist/particles/phone-field/phone-field.js +183 -39
  172. package/dist/particles/phone-field/phone-field.js.map +1 -1
  173. package/dist/particles/postal-code-field/postal-code-field.js +2 -2
  174. package/dist/particles/postal-code-field/postal-code-field.js.map +1 -1
  175. package/dist/particles/select/field-select.d.ts +43 -0
  176. package/dist/particles/select/field-select.js +150 -0
  177. package/dist/particles/select/field-select.js.map +1 -0
  178. package/dist/particles/select/select.d.ts +2 -0
  179. package/dist/particles/select/select.js.map +1 -1
  180. package/dist/particles/shared/compose-refs.js +21 -0
  181. package/dist/particles/shared/compose-refs.js.map +1 -0
  182. package/dist/schema.graphql +701 -2
  183. package/dist/sdk/actions/analytics-action-provider.d.ts +15 -0
  184. package/dist/sdk/actions/analytics-action-provider.js +19 -0
  185. package/dist/sdk/actions/analytics-action-provider.js.map +1 -0
  186. package/dist/sdk/actions/cart-action-provider.d.ts +1 -1
  187. package/dist/sdk/actions/cart-action-provider.js +1 -1
  188. package/dist/sdk/actions/cart-action-provider.js.map +1 -1
  189. package/dist/sdk/actions/index.d.ts +3 -1
  190. package/dist/sdk/actions/index.js +3 -1
  191. package/dist/sdk/actions/payment-action-provider.d.ts +22 -0
  192. package/dist/sdk/actions/payment-action-provider.js +26 -0
  193. package/dist/sdk/actions/payment-action-provider.js.map +1 -0
  194. package/dist/sdk/actions/session-action-provider.d.ts +1 -1
  195. package/dist/sdk/actions/session-action-provider.js +1 -1
  196. package/dist/sdk/actions/session-action-provider.js.map +1 -1
  197. package/dist/sdk/actions/shipping-action-provider.d.ts +1 -1
  198. package/dist/sdk/actions/shipping-action-provider.js +1 -1
  199. package/dist/sdk/actions/shipping-action-provider.js.map +1 -1
  200. package/dist/sdk/actions/types.d.ts +6 -2
  201. package/dist/sdk/analytics/analytics-destination.d.ts +43 -0
  202. package/dist/sdk/analytics/analytics-destination.js +90 -0
  203. package/dist/sdk/analytics/analytics-destination.js.map +1 -0
  204. package/dist/sdk/analytics/use-analytics-actions.d.ts +57 -0
  205. package/dist/sdk/analytics/use-analytics-actions.js +108 -0
  206. package/dist/sdk/analytics/use-analytics-actions.js.map +1 -0
  207. package/dist/sdk/cache/storefront-cache.js +1 -1
  208. package/dist/sdk/cache/storefront-cache.js.map +1 -1
  209. package/dist/sdk/cart/operations.d.ts +4 -4
  210. package/dist/sdk/cart/operations.js +1 -1
  211. package/dist/sdk/cart/operations.js.map +1 -1
  212. package/dist/sdk/cart/optimistic.js +1 -1
  213. package/dist/sdk/cart/optimistic.js.map +1 -1
  214. package/dist/sdk/cart/use-cart-actions.d.ts +1 -1
  215. package/dist/sdk/cart/use-cart-actions.js +4 -4
  216. package/dist/sdk/cart/use-cart-actions.js.map +1 -1
  217. package/dist/sdk/cart/use-cart-validate-on-open.js +1 -1
  218. package/dist/sdk/cart/use-cart-validate-on-open.js.map +1 -1
  219. package/dist/sdk/cart/write-gate.js +1 -1
  220. package/dist/sdk/cart/write-gate.js.map +1 -1
  221. package/dist/sdk/data/entity-resolution-context.js +31 -0
  222. package/dist/sdk/data/entity-resolution-context.js.map +1 -0
  223. package/dist/sdk/data/entity-subscriber.js +18 -8
  224. package/dist/sdk/data/entity-subscriber.js.map +1 -1
  225. package/dist/sdk/data/index.js +1 -0
  226. package/dist/sdk/data/page-reactive-data-root.d.ts +38 -2
  227. package/dist/sdk/data/page-reactive-data-root.js +4 -2
  228. package/dist/sdk/data/page-reactive-data-root.js.map +1 -1
  229. package/dist/sdk/data/reactive-data-provider.d.ts +1 -1
  230. package/dist/sdk/data/reactive-data-provider.js +8 -4
  231. package/dist/sdk/data/reactive-data-provider.js.map +1 -1
  232. package/dist/sdk/data/reactive-list-item-data-provider.d.ts +1 -1
  233. package/dist/sdk/data/reactive-list-item-data-provider.js +13 -5
  234. package/dist/sdk/data/reactive-list-item-data-provider.js.map +1 -1
  235. package/dist/sdk/data/use-reactive-data-settled.js +39 -0
  236. package/dist/sdk/data/use-reactive-data-settled.js.map +1 -0
  237. package/dist/sdk/data/use-reactive-entity.js +6 -2
  238. package/dist/sdk/data/use-reactive-entity.js.map +1 -1
  239. package/dist/sdk/generated/fragment-types.js +2 -0
  240. package/dist/sdk/generated/fragment-types.js.map +1 -1
  241. package/dist/sdk/generated/gql.js +2 -1
  242. package/dist/sdk/generated/gql.js.map +1 -1
  243. package/dist/sdk/generated/graphql.js +85 -1
  244. package/dist/sdk/generated/graphql.js.map +1 -1
  245. package/dist/sdk/i18n/messages/en-US.js +3 -0
  246. package/dist/sdk/i18n/messages/en-US.json +3 -0
  247. package/dist/sdk/i18n/messages/en-US.json.d.ts +3 -0
  248. package/dist/sdk/i18n/messages/es-ES.js +3 -0
  249. package/dist/sdk/i18n/messages/es-ES.json +3 -0
  250. package/dist/sdk/i18n/messages/pt-BR.js +3 -0
  251. package/dist/sdk/i18n/messages/pt-BR.json +3 -0
  252. package/dist/sdk/identity/operations.js.map +1 -1
  253. package/dist/sdk/identity/use-identity-actions.d.ts +1 -1
  254. package/dist/sdk/identity/use-identity-actions.js +3 -2
  255. package/dist/sdk/identity/use-identity-actions.js.map +1 -1
  256. package/dist/sdk/payment/gateway-origin.js +35 -0
  257. package/dist/sdk/payment/gateway-origin.js.map +1 -0
  258. package/dist/sdk/payment/gateway.d.ts +85 -0
  259. package/dist/sdk/payment/gateway.js +183 -0
  260. package/dist/sdk/payment/gateway.js.map +1 -0
  261. package/dist/sdk/payment/operations.d.ts +52 -0
  262. package/dist/sdk/payment/operations.js +223 -0
  263. package/dist/sdk/payment/operations.js.map +1 -0
  264. package/dist/sdk/payment/security-code-mask.js +71 -0
  265. package/dist/sdk/payment/security-code-mask.js.map +1 -0
  266. package/dist/sdk/payment/submission-registry.d.ts +33 -0
  267. package/dist/sdk/payment/submission-registry.js +58 -0
  268. package/dist/sdk/payment/submission-registry.js.map +1 -0
  269. package/dist/sdk/payment/use-payment-actions.d.ts +78 -0
  270. package/dist/sdk/payment/use-payment-actions.js +276 -0
  271. package/dist/sdk/payment/use-payment-actions.js.map +1 -0
  272. package/dist/sdk/payment/use-place-order.d.ts +65 -0
  273. package/dist/sdk/payment/use-place-order.js +640 -0
  274. package/dist/sdk/payment/use-place-order.js.map +1 -0
  275. package/dist/sdk/session/auth-operations.d.ts +1 -1
  276. package/dist/sdk/session/auth-operations.js.map +1 -1
  277. package/dist/sdk/session/use-session-actions.d.ts +1 -1
  278. package/dist/sdk/session/use-session-actions.js.map +1 -1
  279. package/dist/sdk/session/use-session-revalidation.js +65 -0
  280. package/dist/sdk/session/use-session-revalidation.js.map +1 -0
  281. package/dist/sdk/shipping/option-select-operations.d.ts +1 -1
  282. package/dist/sdk/shipping/option-select-operations.js.map +1 -1
  283. package/dist/sdk/shipping/request-timeout.js +1 -1
  284. package/dist/sdk/shipping/request-timeout.js.map +1 -1
  285. package/dist/sdk/shipping/shipping-operations.d.ts +1 -1
  286. package/dist/sdk/shipping/shipping-operations.js.map +1 -1
  287. package/dist/sdk/shipping/use-shipping-actions.d.ts +2 -2
  288. package/dist/sdk/shipping/use-shipping-actions.js +1 -1
  289. package/dist/sdk/shipping/use-shipping-actions.js.map +1 -1
  290. package/dist/sdk/state/cart.d.ts +3 -4
  291. package/dist/sdk/state/cart.js +6 -7
  292. package/dist/sdk/state/cart.js.map +1 -1
  293. package/dist/utils/loggable-error-name.js +49 -0
  294. package/dist/utils/loggable-error-name.js.map +1 -0
  295. package/dist/utils/resolve-authored-copy.js +18 -0
  296. package/dist/utils/resolve-authored-copy.js.map +1 -0
  297. package/dist/utils/safe-href.js +3 -3
  298. package/dist/utils/safe-href.js.map +1 -1
  299. package/dist/utils/substitute-template.js +33 -0
  300. package/dist/utils/substitute-template.js.map +1 -0
  301. package/package.json +2 -1
  302. package/src/styles/tailwind.css +34 -0
  303. package/dist/docs/client-profile-form.md +0 -192
  304. package/dist/matter/client-profile-form/client-profile-form.d.ts +0 -126
  305. package/dist/matter/client-profile-form/client-profile-form.js +0 -662
  306. package/dist/matter/client-profile-form/client-profile-form.js.map +0 -1
package/dist/catalog.json CHANGED
@@ -144,7 +144,7 @@
144
144
  "category": "content"
145
145
  },
146
146
  "schema": {},
147
- "guideline": "The address block: recipient, street line, locality line, in that order by default. Compose AddressSummaryRecipient / Street / Locality as children to choose the order or drop a line; the wrapper, and any styling on it, is the same either way. Must be a descendant of AddressSummaryRoot.",
147
+ "guideline": "The address block: recipient, street line, locality line, in that order by default. Compose AddressSummaryRecipient / Street / Locality as children to choose the order or drop a line; the wrapper, and any styling on it, is the same either way. AddressSummaryName, AddressSummaryCountry and AddressSummaryField are also available for a custom composition — none of them join the default. Must be a descendant of AddressSummaryRoot.",
148
148
  "docPath": "src/particles/address-summary/address-summary.md"
149
149
  },
150
150
  "AddressSummaryRecipient": {
@@ -183,6 +183,158 @@
183
183
  "guideline": "Neighborhood, city, state and postal code on one line, or nothing when all are absent. Must be a descendant of AddressSummaryRoot.",
184
184
  "docPath": "src/particles/address-summary/address-summary.md"
185
185
  },
186
+ "AddressSummaryName": {
187
+ "name": "AddressSummaryName",
188
+ "importPath": "@vtex/faststore/components",
189
+ "requiresContext": "address-summary",
190
+ "editor": {
191
+ "label": "Address Summary Name",
192
+ "category": "content"
193
+ },
194
+ "schema": {},
195
+ "guideline": "The shopper's own label for the address, or nothing when there is none. An unnamed address is identified by its contents. Must be a descendant of AddressSummaryRoot.",
196
+ "docPath": "src/particles/address-summary/address-summary.md"
197
+ },
198
+ "AddressSummaryCountry": {
199
+ "name": "AddressSummaryCountry",
200
+ "importPath": "@vtex/faststore/components",
201
+ "requiresContext": "address-summary",
202
+ "editor": {
203
+ "label": "Address Summary Country",
204
+ "category": "content"
205
+ },
206
+ "schema": {},
207
+ "guideline": "The address's country, shown exactly as provided, or nothing when there is none. Provide a display name, not a raw code: the address stores an ISO alpha-3 code, which Intl.DisplayNames rejects. Must be a descendant of AddressSummaryRoot.",
208
+ "docPath": "src/particles/address-summary/address-summary.md"
209
+ },
210
+ "AddressSummaryField": {
211
+ "name": "AddressSummaryField",
212
+ "importPath": "@vtex/faststore/components",
213
+ "requiresContext": "address-summary",
214
+ "editor": {
215
+ "label": "Address Summary Field",
216
+ "category": "content"
217
+ },
218
+ "schema": {
219
+ "field": {
220
+ "type": [
221
+ "recipientName",
222
+ "name",
223
+ "street",
224
+ "number",
225
+ "complement",
226
+ "neighborhood",
227
+ "city",
228
+ "state",
229
+ "postalCode",
230
+ "country",
231
+ "reference"
232
+ ],
233
+ "label": "Field"
234
+ }
235
+ },
236
+ "guideline": "One address field, rendered inline, or nothing when it is empty. Compose several to build a line in a country's own order (e.g. number before street), with the separators the composition supplies; a separator beside a field that turns out empty is the composition's to drop. Must be a descendant of AddressSummaryRoot.",
237
+ "docPath": "src/particles/address-summary/address-summary.md"
238
+ },
239
+ "AlertDialogRoot": {
240
+ "name": "AlertDialogRoot",
241
+ "importPath": "@vtex/faststore/components",
242
+ "editor": {
243
+ "label": "Alert Dialog Root",
244
+ "category": "layout"
245
+ },
246
+ "schema": {},
247
+ "guideline": "Root of a confirmation prompt for an irreversible action. Compose as: AlertDialogRoot > (AlertDialogTrigger + AlertDialogPortal > (AlertDialogBackdrop + AlertDialogViewport > AlertDialogPopup > (AlertDialogTitle + AlertDialogDescription + AlertDialogClose + your confirm Button))). Always modal and never closes on an outside click; only Escape or an AlertDialogClose dismisses it. Use Dialog instead when a stray click may close the overlay.",
248
+ "docPath": "src/particles/alert-dialog/alert-dialog.md"
249
+ },
250
+ "AlertDialogTrigger": {
251
+ "name": "AlertDialogTrigger",
252
+ "importPath": "@vtex/faststore/components",
253
+ "editor": {
254
+ "label": "Alert Dialog Trigger",
255
+ "category": "action"
256
+ },
257
+ "schema": {},
258
+ "guideline": "Opens the alert dialog when clicked. Direct child of AlertDialogRoot. Accepts any children (text, Icon). Base UI connects it to AlertDialogRoot via context — no explicit wiring needed.",
259
+ "docPath": "src/particles/alert-dialog/alert-dialog.md"
260
+ },
261
+ "AlertDialogPortal": {
262
+ "name": "AlertDialogPortal",
263
+ "importPath": "@vtex/faststore/components",
264
+ "editor": {
265
+ "label": "Alert Dialog Portal",
266
+ "category": "layout"
267
+ },
268
+ "schema": {},
269
+ "guideline": "Renders its children outside the DOM tree (into document.body). Place AlertDialogBackdrop and AlertDialogViewport as direct children, in that order.",
270
+ "docPath": "src/particles/alert-dialog/alert-dialog.md"
271
+ },
272
+ "AlertDialogBackdrop": {
273
+ "name": "AlertDialogBackdrop",
274
+ "importPath": "@vtex/faststore/components",
275
+ "editor": {
276
+ "label": "Alert Dialog Backdrop",
277
+ "category": "layout"
278
+ },
279
+ "schema": {},
280
+ "guideline": "Semi-transparent overlay behind the popup. Direct child of AlertDialogPortal, before AlertDialogViewport. Clicking it does not close the alert dialog.",
281
+ "docPath": "src/particles/alert-dialog/alert-dialog.md"
282
+ },
283
+ "AlertDialogViewport": {
284
+ "name": "AlertDialogViewport",
285
+ "importPath": "@vtex/faststore/components",
286
+ "editor": {
287
+ "label": "Alert Dialog Viewport",
288
+ "category": "layout"
289
+ },
290
+ "schema": {},
291
+ "guideline": "Positioning container for AlertDialogPopup. Direct child of AlertDialogPortal, after AlertDialogBackdrop. Apply fixed positioning and centering here (e.g. fixed inset-0 flex items-center justify-center). Place AlertDialogPopup inside.",
292
+ "docPath": "src/particles/alert-dialog/alert-dialog.md"
293
+ },
294
+ "AlertDialogPopup": {
295
+ "name": "AlertDialogPopup",
296
+ "importPath": "@vtex/faststore/components",
297
+ "editor": {
298
+ "label": "Alert Dialog Popup",
299
+ "category": "layout"
300
+ },
301
+ "schema": {},
302
+ "guideline": "The visible prompt, inside AlertDialogViewport, with role alertdialog. Place AlertDialogTitle (required), AlertDialogDescription, an AlertDialogClose for cancel, and a confirm Button inside. Focus starts on the first focusable element, except when opened by touch, where Base UI focuses the popup itself: put the cancel control first, and pass initialFocus (a ref) when Cancel must receive focus for every kind of interaction.",
303
+ "docPath": "src/particles/alert-dialog/alert-dialog.md"
304
+ },
305
+ "AlertDialogTitle": {
306
+ "name": "AlertDialogTitle",
307
+ "importPath": "@vtex/faststore/components",
308
+ "editor": {
309
+ "label": "Alert Dialog Title",
310
+ "category": "layout"
311
+ },
312
+ "schema": {},
313
+ "guideline": "Required heading inside AlertDialogPopup — sets the accessible name of the alert dialog for screen readers. State the question, e.g. \"Delete this address?\".",
314
+ "docPath": "src/particles/alert-dialog/alert-dialog.md"
315
+ },
316
+ "AlertDialogDescription": {
317
+ "name": "AlertDialogDescription",
318
+ "importPath": "@vtex/faststore/components",
319
+ "editor": {
320
+ "label": "Alert Dialog Description",
321
+ "category": "layout"
322
+ },
323
+ "schema": {},
324
+ "guideline": "Description inside AlertDialogPopup, after AlertDialogTitle. Screen readers announce it with the prompt, so use it to state the consequence of confirming.",
325
+ "docPath": "src/particles/alert-dialog/alert-dialog.md"
326
+ },
327
+ "AlertDialogClose": {
328
+ "name": "AlertDialogClose",
329
+ "importPath": "@vtex/faststore/components",
330
+ "editor": {
331
+ "label": "Alert Dialog Close",
332
+ "category": "action"
333
+ },
334
+ "schema": {},
335
+ "guideline": "Closes the alert dialog when clicked. Use it for the cancel control inside AlertDialogPopup. The confirm control is a separate Button that runs the consumer action.",
336
+ "docPath": "src/particles/alert-dialog/alert-dialog.md"
337
+ },
186
338
  "Badge": {
187
339
  "name": "Badge",
188
340
  "importPath": "@vtex/faststore/components",
@@ -442,6 +594,7 @@
442
594
  "DocumentField": {
443
595
  "name": "DocumentField",
444
596
  "importPath": "@vtex/faststore/components",
597
+ "providesContext": "document-field",
445
598
  "editor": {
446
599
  "label": "Document Field",
447
600
  "category": "content"
@@ -464,10 +617,12 @@
464
617
  "default": "CPF",
465
618
  "label": "Document type"
466
619
  },
467
- "required": {
468
- "type": "boolean",
469
- "default": false,
470
- "label": "Required"
620
+ "requirement": {
621
+ "type": [
622
+ "mandatory",
623
+ "optional"
624
+ ],
625
+ "label": "Requirement"
471
626
  },
472
627
  "disabled": {
473
628
  "type": "boolean",
@@ -475,7 +630,19 @@
475
630
  "label": "Disabled"
476
631
  }
477
632
  },
478
- "guideline": "Presentational tax-document input composing the Field particle; applies the locale mask on change and runs check-digit validation on blur/submit. Data-agnostic (value/defaultValue/onValueChange); a host wires it to the shopper profile. CPF is optional by default.",
633
+ "guideline": "Presentational tax-document input composing the Field particle; applies the locale mask on change and runs check-digit validation on blur/submit. Data-agnostic (value/defaultValue/onValueChange); a host wires it to the shopper profile. CPF is optional by default: requirement only ever raises the field to required, announced as aria-required, and bound to a fieldset whose rule already says required it cannot lower it back. Recomposable (RFC:503): given children, they replace the default Field.Label + DocumentFieldInput + Field.Error anatomy, in any order.",
634
+ "docPath": "src/particles/document-field/document-field.md"
635
+ },
636
+ "DocumentFieldInput": {
637
+ "name": "DocumentFieldInput",
638
+ "importPath": "@vtex/faststore/components",
639
+ "requiresContext": "document-field",
640
+ "editor": {
641
+ "label": "Document Field Input",
642
+ "category": "action"
643
+ },
644
+ "schema": {},
645
+ "guideline": "The masked document <input> DocumentField owns. Must sit inside DocumentField, in either the default anatomy or an author's composed children. Carries the locale mask, the composed ref, and DocumentField's own onChange/onBlur — a composed Field.Control here instead re-registers the field with react-hook-form and loses the mask (unsupported, RFC's named double-binder hole).",
479
646
  "docPath": "src/particles/document-field/document-field.md"
480
647
  },
481
648
  "DrawerRoot": {
@@ -611,6 +778,7 @@
611
778
  "FieldRoot": {
612
779
  "name": "FieldRoot",
613
780
  "importPath": "@vtex/faststore/components",
781
+ "providesContext": "field",
614
782
  "editor": {
615
783
  "label": "Field Root",
616
784
  "category": "layout"
@@ -622,57 +790,80 @@
622
790
  "label": "Disabled"
623
791
  }
624
792
  },
625
- "guideline": "Form field container that connects a label, input, and validation messages via ARIA. Use Field.Control as the input element, or place a compatible Base UI input (Input, Checkbox, Select) as a direct child. Set invalid=true to trigger Field.Error display."
793
+ "guideline": "Form field container that connects a label, input, and validation messages via ARIA. Use Field.Control as the input element, or place a compatible Base UI input (Input, Checkbox, Select) as a direct child. Set invalid=true to trigger Field.Error display. Wrapping a bound Control feeds invalid/dirty/touched from react-hook-form automatically.",
794
+ "docPath": "src/particles/field/field.md"
626
795
  },
627
796
  "FieldLabel": {
628
797
  "name": "FieldLabel",
629
798
  "importPath": "@vtex/faststore/components",
799
+ "requiresContext": "field",
630
800
  "editor": {
631
801
  "label": "Field Label",
632
802
  "category": "layout"
633
803
  },
634
804
  "schema": {},
635
- "guideline": "Accessible label inside Field.Root. Automatically associated with Field.Control's input via ARIA. Place before Field.Control in the DOM."
805
+ "guideline": "Accessible label inside Field.Root. Automatically associated with Field.Control's input via ARIA. Place before Field.Control in the DOM. Under a bound Control, a childless Field.Label renders the field contract's label.",
806
+ "docPath": "src/particles/field/field.md"
636
807
  },
637
808
  "FieldControl": {
638
809
  "name": "FieldControl",
639
810
  "importPath": "@vtex/faststore/components",
811
+ "requiresContext": "field",
640
812
  "editor": {
641
813
  "label": "Field Control",
642
814
  "category": "layout"
643
815
  },
644
816
  "schema": {},
645
- "guideline": "Renders a native `<input>` element directly. It IS the input — do not place any child inside it. Pass input attributes (type, placeholder, required, etc.) directly as props. It is automatically linked to Field.Label and Field.Error via ARIA."
817
+ "guideline": "Renders a native `<input>` element directly. It IS the input — do not place any child inside it. Pass input attributes (type, placeholder, required, etc.) directly as props. It is automatically linked to Field.Label and Field.Error via ARIA. Under a bound Control, it registers with react-hook-form using the field contract's name, seed value, and validation rule.",
818
+ "docPath": "src/particles/field/field.md"
646
819
  },
647
820
  "FieldDescription": {
648
821
  "name": "FieldDescription",
649
822
  "importPath": "@vtex/faststore/components",
823
+ "requiresContext": "field",
650
824
  "editor": {
651
825
  "label": "Field Description",
652
826
  "category": "layout"
653
827
  },
654
828
  "schema": {},
655
- "guideline": "Helper text inside Field.Root. Automatically linked to the control via aria-describedby. Always visible regardless of validation state."
829
+ "guideline": "Helper text inside Field.Root. Automatically linked to the control via aria-describedby. Always visible regardless of validation state.",
830
+ "docPath": "src/particles/field/field.md"
656
831
  },
657
832
  "FieldError": {
658
833
  "name": "FieldError",
659
834
  "importPath": "@vtex/faststore/components",
835
+ "requiresContext": "field",
660
836
  "editor": {
661
837
  "label": "Field Error",
662
838
  "category": "layout"
663
839
  },
664
840
  "schema": {},
665
- "guideline": "Validation error message inside Field.Root. Shown when the field is in an invalid state. Linked to the control via aria-describedby."
841
+ "guideline": "Validation error message inside Field.Root. Shown when the field is in an invalid state. Linked to the control via aria-describedby. Under a bound Control, it renders react-hook-form's error message for the field contract's name.",
842
+ "docPath": "src/particles/field/field.md"
666
843
  },
667
844
  "FieldValidity": {
668
845
  "name": "FieldValidity",
669
846
  "importPath": "@vtex/faststore/components",
847
+ "requiresContext": "field",
670
848
  "editor": {
671
849
  "label": "Field Validity",
672
850
  "category": "layout"
673
851
  },
674
852
  "schema": {},
675
- "guideline": "Validation feedback slot using a render prop for custom messages derived from the field's validity state. Use for dynamic messages when Field.Error text is not fixed."
853
+ "guideline": "Validation feedback slot using a render prop for custom messages derived from the field's validity state. Use for dynamic messages when Field.Error text is not fixed.",
854
+ "docPath": "src/particles/field/field.md"
855
+ },
856
+ "FieldCheckbox": {
857
+ "name": "FieldCheckbox",
858
+ "importPath": "@vtex/faststore/components",
859
+ "requiresContext": "field",
860
+ "editor": {
861
+ "label": "Field Checkbox",
862
+ "category": "action"
863
+ },
864
+ "schema": {},
865
+ "guideline": "Bound boolean control over the shipped Checkbox particle: reads the enclosing field contract and drives Checkbox.Root through react-hook-form. Compose Checkbox.Indicator as a child for the visual check mark. Place inside Field.Root, the only ancestor that provides the field context it requires today — a bound Control will satisfy it too, once one ships.",
866
+ "docPath": "src/particles/field/field.md"
676
867
  },
677
868
  "FieldsetRoot": {
678
869
  "name": "FieldsetRoot",
@@ -682,7 +873,7 @@
682
873
  "category": "layout"
683
874
  },
684
875
  "schema": {},
685
- "guideline": "Root of an accessible fieldset for grouping related form controls. Compose as: FieldsetRoot > FieldsetLegend + [form controls]. Set disabled on the root to disable all contained inputs."
876
+ "guideline": "Root of an accessible fieldset for grouping related form controls. Compose as: FieldsetRoot > FieldsetLegend + [form controls]. `disabled` marks the group with `data-disabled` and disables Field-family descendants through context — it does not set the native `fieldset[disabled]` attribute, so plain inputs, `CheckboxRoot` and `RadioGroup` inside it stay interactive."
686
877
  },
687
878
  "FieldsetLegend": {
688
879
  "name": "FieldsetLegend",
@@ -692,7 +883,7 @@
692
883
  "category": "layout"
693
884
  },
694
885
  "schema": {},
695
- "guideline": "Visible title for a Fieldset.Root. Renders as a styled <legend> element."
886
+ "guideline": "Visible title for a `FieldsetRoot`. Renders a `div` — not a native `<legend>` — and names the enclosing fieldset through `aria-labelledby`, so it must sit inside a `FieldsetRoot` to label anything; when two are composed, the last one wins."
696
887
  },
697
888
  "FooterCopyright": {
698
889
  "name": "FooterCopyright",
@@ -764,6 +955,103 @@
764
955
  "guideline": "The store's official social profiles as a row of icon links, both the heading and the list CMS-editable. Every link opens in a new tab. Every predefined platform name must be listed in the store's icons.include. See footer-social.md.",
765
956
  "docPath": "src/particles/footer-social/footer-social.md"
766
957
  },
958
+ "FormRoot": {
959
+ "name": "FormRoot",
960
+ "importPath": "@vtex/faststore/components",
961
+ "providesContext": "form",
962
+ "editor": {
963
+ "label": "Form",
964
+ "category": "action"
965
+ },
966
+ "schema": {},
967
+ "guideline": "The only <form> its own fieldset registry dispatches from — a composed CartCouponForm, ShippingSimulatorForm or RegionForm renders its own, and a submit-origin check keeps theirs out of this one. Calls react-hook-form's useForm() once and holds the registry a submit dispatches in registration order. Compose FormSubmit/FormEnterSubmit/FormError/FormClear/FormReset anywhere inside it, and a fieldset as a descendant to give the submit something to persist — FormRoot itself declares no actions.",
968
+ "docPath": "src/particles/form/form.md"
969
+ },
970
+ "FormSubmit": {
971
+ "name": "FormSubmit",
972
+ "importPath": "@vtex/faststore/components",
973
+ "requiresContext": "form",
974
+ "editor": {
975
+ "label": "Form Submit",
976
+ "category": "action"
977
+ },
978
+ "schema": {
979
+ "label": {
980
+ "type": "string",
981
+ "label": "Label"
982
+ }
983
+ },
984
+ "guideline": "Submits every registered fieldset the shopper changed, in registration order, and disables itself while a write is in flight. Renders children, then label, then the message catalog (fs/form.submit) — never a hard-coded English default. A fieldset with nothing changed contributes no request; an invalid field blocks every dispatch and moves focus to it instead of submitting. Enter in a text input does not submit — see FormEnterSubmit for a form where it does.",
985
+ "docPath": "src/particles/form/form.md"
986
+ },
987
+ "FormEnterSubmit": {
988
+ "name": "FormEnterSubmit",
989
+ "importPath": "@vtex/faststore/components",
990
+ "requiresContext": "form",
991
+ "editor": {
992
+ "label": "Form Enter Submit",
993
+ "category": "action"
994
+ },
995
+ "schema": {
996
+ "label": {
997
+ "type": "string",
998
+ "label": "Label"
999
+ }
1000
+ },
1001
+ "guideline": "Renders the same button as FormSubmit, sharing its children/label/fs/form.submit resolution, and additionally allows Enter to submit this form from any text-entry input while mounted. The allowance is form-scoped: placed inside one fieldset of a multi-fieldset FormRoot, it allows Enter for every text input in the enclosing form, not only that fieldset. Enter that commits an IME candidate never submits.",
1002
+ "docPath": "src/particles/form/form.md"
1003
+ },
1004
+ "FormError": {
1005
+ "name": "FormError",
1006
+ "importPath": "@vtex/faststore/components",
1007
+ "requiresContext": "form",
1008
+ "editor": {
1009
+ "label": "Form Error",
1010
+ "category": "content"
1011
+ },
1012
+ "schema": {
1013
+ "fallbackMessage": {
1014
+ "type": "string",
1015
+ "label": "Fallback message"
1016
+ }
1017
+ },
1018
+ "guideline": "Renders the last submit's write failures grouped by fieldset, or nothing when there were none. Set fallbackMessage for a fieldset whose write rejected rather than resolving with userErrors.",
1019
+ "docPath": "src/particles/form/form.md"
1020
+ },
1021
+ "FormClear": {
1022
+ "name": "FormClear",
1023
+ "importPath": "@vtex/faststore/components",
1024
+ "requiresContext": "form",
1025
+ "editor": {
1026
+ "label": "Form Clear",
1027
+ "category": "action"
1028
+ },
1029
+ "schema": {
1030
+ "label": {
1031
+ "type": "string",
1032
+ "label": "Label"
1033
+ }
1034
+ },
1035
+ "guideline": "Empties every field registered by every fieldset inside the enclosing FormRoot, not only the nearest one, but marks dirty only the fields whose value actually changed — a field already empty stays clean. Renders children, then label, then the message catalog (fs/form.clear). The following submit dispatches a write for every fieldset that had something to clear, and nothing for one where clearing was a no-op. There is no way to scope it to a single fieldset; place it only where clearing the whole form is the intended action, not by analogy with a per-field clear.",
1036
+ "docPath": "src/particles/form/form.md"
1037
+ },
1038
+ "FormReset": {
1039
+ "name": "FormReset",
1040
+ "importPath": "@vtex/faststore/components",
1041
+ "requiresContext": "form",
1042
+ "editor": {
1043
+ "label": "Form Reset",
1044
+ "category": "action"
1045
+ },
1046
+ "schema": {
1047
+ "label": {
1048
+ "type": "string",
1049
+ "label": "Label"
1050
+ }
1051
+ },
1052
+ "guideline": "Returns every registered field to react-hook-form's baseline for that name and clears its dirty/touched state. Renders children, then label, then the message catalog (fs/form.reset). Before a fieldset's first successful write, that baseline is whatever the field's own seed resolves to — not empty — so Reset reverts to the original value rather than clearing it; only after a successful submit does the baseline become what was last written.",
1053
+ "docPath": "src/particles/form/form.md"
1054
+ },
767
1055
  "GalleryRoot": {
768
1056
  "name": "GalleryRoot",
769
1057
  "importPath": "@vtex/faststore/components",
@@ -1964,6 +2252,7 @@
1964
2252
  "PhoneField": {
1965
2253
  "name": "PhoneField",
1966
2254
  "importPath": "@vtex/faststore/components",
2255
+ "providesContext": "phone-field",
1967
2256
  "editor": {
1968
2257
  "label": "Phone Field",
1969
2258
  "category": "action"
@@ -1980,8 +2269,10 @@
1980
2269
  "label": "Label"
1981
2270
  },
1982
2271
  "requirement": {
1983
- "type": "string",
1984
- "default": "mandatory",
2272
+ "type": [
2273
+ "mandatory",
2274
+ "optional"
2275
+ ],
1985
2276
  "label": "Requirement"
1986
2277
  },
1987
2278
  "errorInvalid": {
@@ -1995,7 +2286,19 @@
1995
2286
  "label": "Required error message"
1996
2287
  }
1997
2288
  },
1998
- "guideline": "Locale-aware, business-agnostic phone number input composed from the field + input particles. Applies country masking, validates on blur, and exposes its value via onValueChange. Bind it to a data source (e.g. ClientProfilePhoneControl for checkout) to persist the value.",
2289
+ "guideline": "Locale-aware, business-agnostic phone number input composed from the field + input particles. Applies country masking, validates on blur, and exposes its value via onValueChange. Bind it to a data source (e.g. ClientProfilePhoneControl for checkout) to persist the value. Recomposable (RFC:503): given children, they replace the default Field.Label + PhoneFieldInput + Field.Error anatomy, in any order.",
2290
+ "docPath": "src/particles/phone-field/phone-field.md"
2291
+ },
2292
+ "PhoneFieldInput": {
2293
+ "name": "PhoneFieldInput",
2294
+ "importPath": "@vtex/faststore/components",
2295
+ "requiresContext": "phone-field",
2296
+ "editor": {
2297
+ "label": "Phone Field Input",
2298
+ "category": "action"
2299
+ },
2300
+ "schema": {},
2301
+ "guideline": "The masked <input type=\"tel\"> PhoneField owns. Must sit inside PhoneField, in either the default anatomy or an author's composed children. Carries the country mask, the composed ref, and PhoneField's own onChange/onBlur — a composed Field.Control here instead re-registers the field with react-hook-form and loses the mask (unsupported, RFC's named double-binder hole).",
1999
2302
  "docPath": "src/particles/phone-field/phone-field.md"
2000
2303
  },
2001
2304
  "PopoverRoot": {
@@ -2171,6 +2474,7 @@
2171
2474
  "schema": {
2172
2475
  "mask": {
2173
2476
  "type": "string",
2477
+ "default": "99999-999",
2174
2478
  "label": "Mask pattern"
2175
2479
  },
2176
2480
  "label": {
@@ -2360,6 +2664,60 @@
2360
2664
  "schema": {},
2361
2665
  "guideline": "Corner piece displayed when both vertical and horizontal scrollbars are visible."
2362
2666
  },
2667
+ "FieldSelectRoot": {
2668
+ "name": "FieldSelectRoot",
2669
+ "importPath": "@vtex/faststore/components",
2670
+ "requiresContext": "field",
2671
+ "editor": {
2672
+ "label": "Field Select Root",
2673
+ "category": "layout"
2674
+ },
2675
+ "schema": {
2676
+ "modal": {
2677
+ "type": "boolean",
2678
+ "default": true,
2679
+ "label": "Modal"
2680
+ }
2681
+ },
2682
+ "guideline": "Bound select over the shipped Select particle: reads the enclosing field contract and drives Select.Root through react-hook-form. Childless, it renders the full default anatomy (trigger, value, icon, popup, list, one item per option); given children, place FieldSelect.Trigger/Value/Options among the generic Select.* parts to recompose it.",
2683
+ "docPath": "src/particles/select/select.md"
2684
+ },
2685
+ "FieldSelectTrigger": {
2686
+ "name": "FieldSelectTrigger",
2687
+ "importPath": "@vtex/faststore/components",
2688
+ "requiresContext": "field",
2689
+ "editor": {
2690
+ "label": "Field Select Trigger",
2691
+ "category": "action"
2692
+ },
2693
+ "schema": {},
2694
+ "guideline": "Bound select's trigger: announces the field's resolved requiredness as aria-required (never native required, so react-hook-form's validation runs instead of the browser's). A select carries no raise of its own, so the fieldset's rule is the whole of it. Place FieldSelect.Value and, optionally, Select.Icon inside it.",
2695
+ "docPath": "src/particles/select/select.md"
2696
+ },
2697
+ "FieldSelectValue": {
2698
+ "name": "FieldSelectValue",
2699
+ "importPath": "@vtex/faststore/components",
2700
+ "requiresContext": "field",
2701
+ "editor": {
2702
+ "label": "Field Select Value",
2703
+ "category": "layout"
2704
+ },
2705
+ "schema": {},
2706
+ "guideline": "Resolves the trigger's label from the field contract's options, so the chosen option's label shows on first paint instead of the raw stored value. Falls back to the raw value when nothing matches, and to the placeholder when empty.",
2707
+ "docPath": "src/particles/select/select.md"
2708
+ },
2709
+ "FieldSelectOptions": {
2710
+ "name": "FieldSelectOptions",
2711
+ "importPath": "@vtex/faststore/components",
2712
+ "requiresContext": "field",
2713
+ "editor": {
2714
+ "label": "Field Select Options",
2715
+ "category": "content"
2716
+ },
2717
+ "schema": {},
2718
+ "guideline": "Renders one Select.Item per field contract option, in contract order — the option list is platform data, never authored here. Pass children (e.g. a Select.ItemIndicator) to render inside every item, after its text.",
2719
+ "docPath": "src/particles/select/select.md"
2720
+ },
2363
2721
  "SelectRoot": {
2364
2722
  "name": "SelectRoot",
2365
2723
  "importPath": "@vtex/faststore/components",
@@ -2389,7 +2747,8 @@
2389
2747
  "label": "Read Only"
2390
2748
  }
2391
2749
  },
2392
- "guideline": "Root of a select dropdown. Manages selection state, modal overlay, and form integration. Compose as: SelectRoot > (SelectLabel + SelectTrigger > (SelectValue + SelectIcon) + SelectPortal > (SelectBackdrop + SelectPositioner > SelectPopup > (SelectScrollUpArrow + SelectList > [SelectItem > (SelectItemText + SelectItemIndicator)] + SelectScrollDownArrow))). Use SelectGroup > (SelectGroupLabel + [SelectItem]) for grouped options. Set modal=false to allow interacting with background elements while open."
2750
+ "guideline": "Root of a select dropdown. Manages selection state, modal overlay, and form integration. Compose as: SelectRoot > (SelectLabel + SelectTrigger > (SelectValue + SelectIcon) + SelectPortal > (SelectBackdrop + SelectPositioner > SelectPopup > (SelectScrollUpArrow + SelectList > [SelectItem > (SelectItemText + SelectItemIndicator)] + SelectScrollDownArrow))). Use SelectGroup > (SelectGroupLabel + [SelectItem]) for grouped options. Set modal=false to allow interacting with background elements while open.",
2751
+ "docPath": "src/particles/select/select.md"
2393
2752
  },
2394
2753
  "SelectLabel": {
2395
2754
  "name": "SelectLabel",
@@ -2399,7 +2758,8 @@
2399
2758
  "category": "layout"
2400
2759
  },
2401
2760
  "schema": {},
2402
- "guideline": "Accessible label associated with the trigger. Always place outside Select.Trigger so screen readers announce it separately."
2761
+ "guideline": "Accessible label associated with the trigger. Always place outside Select.Trigger so screen readers announce it separately.",
2762
+ "docPath": "src/particles/select/select.md"
2403
2763
  },
2404
2764
  "SelectTrigger": {
2405
2765
  "name": "SelectTrigger",
@@ -2415,7 +2775,8 @@
2415
2775
  "label": "Disabled"
2416
2776
  }
2417
2777
  },
2418
- "guideline": "Opens and closes the popup on click. Use data-open and data-placeholder CSS attributes for open-state and empty-state styling."
2778
+ "guideline": "Opens and closes the popup on click. Use data-open and data-placeholder CSS attributes for open-state and empty-state styling.",
2779
+ "docPath": "src/particles/select/select.md"
2419
2780
  },
2420
2781
  "SelectValue": {
2421
2782
  "name": "SelectValue",
@@ -2425,7 +2786,8 @@
2425
2786
  "category": "layout"
2426
2787
  },
2427
2788
  "schema": {},
2428
- "guideline": "Renders the selected item's text, or placeholder when nothing is selected. Style the placeholder state via [data-fs-select-value][data-placeholder]."
2789
+ "guideline": "Renders the selected item's text, or placeholder when nothing is selected. Style the placeholder state via [data-fs-select-value][data-placeholder].",
2790
+ "docPath": "src/particles/select/select.md"
2429
2791
  },
2430
2792
  "SelectIcon": {
2431
2793
  "name": "SelectIcon",
@@ -2435,7 +2797,8 @@
2435
2797
  "category": "layout"
2436
2798
  },
2437
2799
  "schema": {},
2438
- "guideline": "Decorative indicator (e.g. chevron) inside the trigger. Rotates or changes when the popup opens via data-open."
2800
+ "guideline": "Decorative indicator (e.g. chevron) inside the trigger. Rotates or changes when the popup opens via data-open.",
2801
+ "docPath": "src/particles/select/select.md"
2439
2802
  },
2440
2803
  "SelectPortal": {
2441
2804
  "name": "SelectPortal",
@@ -2445,7 +2808,8 @@
2445
2808
  "category": "layout"
2446
2809
  },
2447
2810
  "schema": {},
2448
- "guideline": "Teleports popup content to <body>. Always wrap Select.Positioner with this to avoid overflow/z-index issues."
2811
+ "guideline": "Teleports popup content to <body>. Always wrap Select.Positioner with this to avoid overflow/z-index issues.",
2812
+ "docPath": "src/particles/select/select.md"
2449
2813
  },
2450
2814
  "SelectBackdrop": {
2451
2815
  "name": "SelectBackdrop",
@@ -2455,7 +2819,8 @@
2455
2819
  "category": "layout"
2456
2820
  },
2457
2821
  "schema": {},
2458
- "guideline": "Invisible overlay that closes the select when clicked outside. Required when modal=true to trap interaction."
2822
+ "guideline": "Invisible overlay that closes the select when clicked outside. Required when modal=true to trap interaction.",
2823
+ "docPath": "src/particles/select/select.md"
2459
2824
  },
2460
2825
  "SelectPositioner": {
2461
2826
  "name": "SelectPositioner",
@@ -2495,7 +2860,8 @@
2495
2860
  "label": "Align Item With Trigger"
2496
2861
  }
2497
2862
  },
2498
- "guideline": "Positions the popup relative to the trigger. Use side and align to control placement; alignItemWithTrigger=true overlaps the trigger to align the selected item visually."
2863
+ "guideline": "Positions the popup relative to the trigger. Use side and align to control placement; alignItemWithTrigger=true overlaps the trigger to align the selected item visually.",
2864
+ "docPath": "src/particles/select/select.md"
2499
2865
  },
2500
2866
  "SelectScrollUpArrow": {
2501
2867
  "name": "SelectScrollUpArrow",
@@ -2511,7 +2877,8 @@
2511
2877
  "label": "Keep Mounted"
2512
2878
  }
2513
2879
  },
2514
- "guideline": "Scrolls the list upward when hovered. Appears automatically when the list overflows at the top."
2880
+ "guideline": "Scrolls the list upward when hovered. Appears automatically when the list overflows at the top.",
2881
+ "docPath": "src/particles/select/select.md"
2515
2882
  },
2516
2883
  "SelectPopup": {
2517
2884
  "name": "SelectPopup",
@@ -2521,7 +2888,8 @@
2521
2888
  "category": "layout"
2522
2889
  },
2523
2890
  "schema": {},
2524
- "guideline": "Visible container for the select list. Apply background, shadow, and border styles here."
2891
+ "guideline": "Visible container for the select list. Apply background, shadow, and border styles here.",
2892
+ "docPath": "src/particles/select/select.md"
2525
2893
  },
2526
2894
  "SelectArrow": {
2527
2895
  "name": "SelectArrow",
@@ -2531,7 +2899,8 @@
2531
2899
  "category": "layout"
2532
2900
  },
2533
2901
  "schema": {},
2534
- "guideline": "Pointing arrow attached to the popup indicating the anchor. Optional — omit when not using an arrow indicator."
2902
+ "guideline": "Pointing arrow attached to the popup indicating the anchor. Optional — omit when not using an arrow indicator.",
2903
+ "docPath": "src/particles/select/select.md"
2535
2904
  },
2536
2905
  "SelectList": {
2537
2906
  "name": "SelectList",
@@ -2541,7 +2910,8 @@
2541
2910
  "category": "layout"
2542
2911
  },
2543
2912
  "schema": {},
2544
- "guideline": "Scrollable container for all Select.Item elements. Apply max-height and overflow for scrolling."
2913
+ "guideline": "Scrollable container for all Select.Item elements. Apply max-height and overflow for scrolling.",
2914
+ "docPath": "src/particles/select/select.md"
2545
2915
  },
2546
2916
  "SelectItem": {
2547
2917
  "name": "SelectItem",
@@ -2561,7 +2931,8 @@
2561
2931
  "label": "Disabled"
2562
2932
  }
2563
2933
  },
2564
- "guideline": "One selectable option. Requires a unique value prop. Style selected and highlighted states via data-selected and data-highlighted attributes."
2934
+ "guideline": "One selectable option. Requires a unique value prop. Style selected and highlighted states via data-selected and data-highlighted attributes.",
2935
+ "docPath": "src/particles/select/select.md"
2565
2936
  },
2566
2937
  "SelectItemText": {
2567
2938
  "name": "SelectItemText",
@@ -2571,7 +2942,8 @@
2571
2942
  "category": "layout"
2572
2943
  },
2573
2944
  "schema": {},
2574
- "guideline": "The visible text label of an item. Base UI uses this for keyboard navigation matching."
2945
+ "guideline": "The visible text label of an item. Base UI uses this for keyboard navigation matching.",
2946
+ "docPath": "src/particles/select/select.md"
2575
2947
  },
2576
2948
  "SelectItemIndicator": {
2577
2949
  "name": "SelectItemIndicator",
@@ -2587,7 +2959,8 @@
2587
2959
  "label": "Keep Mounted"
2588
2960
  }
2589
2961
  },
2590
- "guideline": "Checkmark or indicator shown only on the selected item. Set keepMounted=true to animate in/out."
2962
+ "guideline": "Checkmark or indicator shown only on the selected item. Set keepMounted=true to animate in/out.",
2963
+ "docPath": "src/particles/select/select.md"
2591
2964
  },
2592
2965
  "SelectSeparator": {
2593
2966
  "name": "SelectSeparator",
@@ -2597,7 +2970,8 @@
2597
2970
  "category": "layout"
2598
2971
  },
2599
2972
  "schema": {},
2600
- "guideline": "Visual divider between items or groups. Use between unrelated option groups."
2973
+ "guideline": "Visual divider between items or groups. Use between unrelated option groups.",
2974
+ "docPath": "src/particles/select/select.md"
2601
2975
  },
2602
2976
  "SelectGroup": {
2603
2977
  "name": "SelectGroup",
@@ -2607,7 +2981,8 @@
2607
2981
  "category": "layout"
2608
2982
  },
2609
2983
  "schema": {},
2610
- "guideline": "Groups related items under a shared SelectGroupLabel for semantic and visual grouping."
2984
+ "guideline": "Groups related items under a shared SelectGroupLabel for semantic and visual grouping.",
2985
+ "docPath": "src/particles/select/select.md"
2611
2986
  },
2612
2987
  "SelectGroupLabel": {
2613
2988
  "name": "SelectGroupLabel",
@@ -2617,7 +2992,8 @@
2617
2992
  "category": "layout"
2618
2993
  },
2619
2994
  "schema": {},
2620
- "guideline": "Non-interactive label for a Select.Group. Announced by screen readers as a group name."
2995
+ "guideline": "Non-interactive label for a Select.Group. Announced by screen readers as a group name.",
2996
+ "docPath": "src/particles/select/select.md"
2621
2997
  },
2622
2998
  "SelectScrollDownArrow": {
2623
2999
  "name": "SelectScrollDownArrow",
@@ -2633,7 +3009,8 @@
2633
3009
  "label": "Keep Mounted"
2634
3010
  }
2635
3011
  },
2636
- "guideline": "Scrolls the list downward when hovered. Appears when the list overflows at the bottom."
3012
+ "guideline": "Scrolls the list downward when hovered. Appears when the list overflows at the bottom.",
3013
+ "docPath": "src/particles/select/select.md"
2637
3014
  },
2638
3015
  "Separator": {
2639
3016
  "name": "Separator",
@@ -3202,6 +3579,36 @@
3202
3579
  "guideline": "Code-entry step: composes AccessCodeField and dispatches $actions.session.validateAccessCode with the Root-owned email and authenticationToken; a successful validate flips the session reactively and hides the Root. Must be inside AccessCodeSignInRoot. See access-code-sign-in.md.",
3203
3580
  "docPath": "src/matter/access-code-sign-in/access-code-sign-in.md"
3204
3581
  },
3582
+ "AccountAccessGate": {
3583
+ "name": "AccountAccessGate",
3584
+ "importPath": "@vtex/faststore/components",
3585
+ "contentTypeId": "account-access-gate",
3586
+ "editor": {
3587
+ "label": "Account Access Gate",
3588
+ "category": "identity"
3589
+ },
3590
+ "requiresContext": "session",
3591
+ "schema": {
3592
+ "loadingLabel": {
3593
+ "type": "string",
3594
+ "label": "Loading Announcement"
3595
+ },
3596
+ "expiredMessage": {
3597
+ "type": "string",
3598
+ "label": "Session Ended Message"
3599
+ },
3600
+ "signInIncompleteMessage": {
3601
+ "type": "string",
3602
+ "label": "Sign-in Did Not Complete Message"
3603
+ },
3604
+ "signInLabel": {
3605
+ "type": "string",
3606
+ "label": "Sign-in Link Label"
3607
+ }
3608
+ },
3609
+ "guideline": "The account's single access decision: place it once in the account layout, wrapping the body, and every page that declares that layout inherits it — never restate it per section. It renders its children only for a logged-in shopper; it shows a composed loading look while the session resolves, replaces the current history entry with the sign-in destination for a visitor who arrived signed out (identified counts as signed out), tells a shopper whose session ended mid-visit rather than bouncing them, and stands down while AccountMenuSignOut navigates. It redirects at most once per visit: a shopper who comes back from sign-in still signed out gets a message and a link rather than a second hop. Must be inside SessionRoot, which the same layout hosts. Never place the /login route under it — the gate redirects there, and a gated /login would redirect to itself.",
3610
+ "docPath": "src/matter/account-access-gate/account-access-gate.md"
3611
+ },
3205
3612
  "AccountEntryPoint": {
3206
3613
  "name": "AccountEntryPoint",
3207
3614
  "importPath": "@vtex/faststore/components",
@@ -3229,42 +3636,191 @@
3229
3636
  "label": "Loading Announcement"
3230
3637
  }
3231
3638
  },
3232
- "guideline": "Session-aware header control rendering one link: the signed-out label toward /login for anonymous and identified shoppers, the signed-in label toward the account route for logged-in ones, and a politely announced placeholder while the session resolves. Both destinations are fixed conventions, not props, so no authored value can misroute the auth flow. Must be inside a SessionRoot, normally the one hosted by the shared layout — a page-hosted provider resolves the session server-side without the shopper cookie and sticks on the signed-out label. Author the label for a state or that state renders nothing; the labels are optional in the type only because a CMS entry may supply them, and an entry overrides all four fields at runtime. Style it through data-fs-account-entry-point and switch on data-fs-account-entry-point-state.",
3639
+ "guideline": "Session-aware header control rendering one link: the signed-out label toward /login for anonymous and identified shoppers, the signed-in label toward the account route for logged-in ones, and a politely announced placeholder while the session resolves. Both destinations are fixed conventions, not props, so no authored value can misroute the auth flow. Must be inside a SessionRoot, normally the one hosted by the shared layout; a page-hosted provider also works, since the server-side session fetch forwards the shopper cookie. Author the label for a state or that state renders nothing; the labels are optional in the type only because a CMS entry may supply them, and an entry overrides all four fields at runtime. Style it through data-fs-account-entry-point and switch on data-fs-account-entry-point-state.",
3233
3640
  "docPath": "src/matter/account-entry-point/account-entry-point.md"
3234
3641
  },
3235
- "BreadcrumbRoot": {
3236
- "name": "BreadcrumbRoot",
3642
+ "AccountMenuRoot": {
3643
+ "name": "AccountMenuRoot",
3237
3644
  "importPath": "@vtex/faststore/components",
3238
- "fragment": "\n fragment BreadcrumbData on Query {\n productBySlug(slug: $slug) {\n breadcrumbs {\n name\n url\n position\n }\n }\n }\n",
3645
+ "contentTypeId": "account-menu",
3646
+ "providesContext": "account-menu",
3239
3647
  "editor": {
3240
- "label": "Breadcrumb Root",
3648
+ "label": "Account Menu Root",
3241
3649
  "category": "navigation"
3242
3650
  },
3243
3651
  "schema": {
3244
- "label": {
3245
- "type": "string",
3246
- "default": "Breadcrumb",
3247
- "label": "Aria Label"
3652
+ "items": {
3653
+ "type": "array",
3654
+ "label": "Sections"
3248
3655
  }
3249
3656
  },
3250
- "guideline": "Root container for breadcrumb navigation; compose as BreadcrumbRoot > BreadcrumbList > [BreadcrumbLink + BreadcrumbSeparator]."
3657
+ "guideline": "The account menu's provider, and deliberately not its landmark: it resolves the section list, derives which section the shopper is reading, publishes both, and renders its children. Compose it in the my-account layout around both AccountMenuList and the Slot holding the section's own page — its context has to reach the consumers inside the slot, and a nav stretched that far would announce every section's content as navigation. The list comes from a published entry, else the authored items prop, else the library's five defaults; a channel supplying an empty list resolves to empty rather than falling through, because a merchant who cleared the list cleared it. Style it through data-fs-account-menu.",
3658
+ "docPath": "src/matter/account-menu/account-menu.md"
3251
3659
  },
3252
- "BreadcrumbList": {
3253
- "name": "BreadcrumbList",
3660
+ "AccountMenuList": {
3661
+ "name": "AccountMenuList",
3254
3662
  "importPath": "@vtex/faststore/components",
3663
+ "requiresContext": "account-menu",
3255
3664
  "editor": {
3256
- "label": "Breadcrumb List",
3665
+ "label": "Account Menu List",
3257
3666
  "category": "navigation"
3258
3667
  },
3259
- "schema": {},
3260
- "guideline": "Ordered list of breadcrumb items; must be a direct child of BreadcrumbRoot."
3668
+ "schema": {
3669
+ "label": {
3670
+ "type": "string",
3671
+ "default": "Account",
3672
+ "label": "Aria Label"
3673
+ }
3674
+ },
3675
+ "guideline": "The account menu's navigation landmark and its items, and nothing else — it surrounds the items alone so the section's own content stays outside the navigation region. Author the label: a landmark with no accessible name is one a screen-reader user cannot tell from any other. The current section carries aria-current, page for the section itself and true for a page inside it, with data-fs-account-menu-item-current beside it as a style target and never as the only signal. When the list scrolls, the current item is brought into view on mount and on every route change. Must be a descendant of AccountMenuRoot.",
3676
+ "docPath": "src/matter/account-menu/account-menu.md"
3261
3677
  },
3262
- "BreadcrumbLink": {
3263
- "name": "BreadcrumbLink",
3678
+ "BillingAddress": {
3679
+ "name": "BillingAddress",
3264
3680
  "importPath": "@vtex/faststore/components",
3265
- "editor": {
3266
- "label": "Breadcrumb Link",
3267
- "category": "navigation"
3681
+ "requiresContext": "payment",
3682
+ "actions": {
3683
+ "payment": [
3684
+ "setBillingAddress"
3685
+ ]
3686
+ },
3687
+ "editor": {
3688
+ "label": "Billing Address",
3689
+ "category": "commerce"
3690
+ },
3691
+ "schema": {
3692
+ "sameAsDeliveryLabel": {
3693
+ "type": "string",
3694
+ "default": "Billing address same as delivery address",
3695
+ "label": "Same-as-delivery toggle label"
3696
+ },
3697
+ "defaultCountry": {
3698
+ "type": "string",
3699
+ "default": "BRA",
3700
+ "label": "Default country (ISO-3)"
3701
+ },
3702
+ "countryLabel": {
3703
+ "type": "string",
3704
+ "default": "Country",
3705
+ "label": "Country field label"
3706
+ },
3707
+ "submitLabel": {
3708
+ "type": "string",
3709
+ "default": "Save billing address",
3710
+ "label": "Submit button label"
3711
+ },
3712
+ "submitPendingLabel": {
3713
+ "type": "string",
3714
+ "default": "Saving...",
3715
+ "label": "Submit button pending label"
3716
+ },
3717
+ "requiredNoticeLabel": {
3718
+ "type": "string",
3719
+ "default": "This payment method requires a billing address.",
3720
+ "label": "Required-billing-address notice label"
3721
+ },
3722
+ "unsavedAddressNoticeLabel": {
3723
+ "type": "string",
3724
+ "default": "No billing address has been saved yet — the delivery address will be used unless you save one below.",
3725
+ "label": "Unsaved-address notice label"
3726
+ },
3727
+ "billingMatchNoticeLabel": {
3728
+ "type": "string",
3729
+ "default": "Your billing address must match the one on your card or bank statement, or your bank may decline the order.",
3730
+ "label": "Billing-match disclaimer"
3731
+ },
3732
+ "billingMatchNoticeVisible": {
3733
+ "type": "boolean",
3734
+ "default": true,
3735
+ "label": "Show the billing-match disclaimer"
3736
+ },
3737
+ "recipientNameLabel": {
3738
+ "type": "string",
3739
+ "default": "Recipient's name",
3740
+ "label": "Recipient name field label"
3741
+ },
3742
+ "streetLabel": {
3743
+ "type": "string",
3744
+ "default": "Street",
3745
+ "label": "Street field label"
3746
+ },
3747
+ "numberLabel": {
3748
+ "type": "string",
3749
+ "default": "Number",
3750
+ "label": "Number field label"
3751
+ },
3752
+ "complementLabel": {
3753
+ "type": "string",
3754
+ "default": "Complement (optional)",
3755
+ "label": "Complement field label"
3756
+ },
3757
+ "neighborhoodLabel": {
3758
+ "type": "string",
3759
+ "default": "Neighborhood",
3760
+ "label": "Neighborhood field label"
3761
+ },
3762
+ "cityLabel": {
3763
+ "type": "string",
3764
+ "default": "City",
3765
+ "label": "City field label"
3766
+ },
3767
+ "stateLabel": {
3768
+ "type": "string",
3769
+ "default": "State",
3770
+ "label": "State field label"
3771
+ },
3772
+ "postalCodeLabel": {
3773
+ "type": "string",
3774
+ "default": "Postal code",
3775
+ "label": "Postal code field label"
3776
+ },
3777
+ "fieldRequiredMessage": {
3778
+ "type": "string",
3779
+ "default": "This field is required.",
3780
+ "label": "Field required message"
3781
+ },
3782
+ "disabled": {
3783
+ "type": "boolean",
3784
+ "default": false,
3785
+ "label": "Disabled"
3786
+ }
3787
+ },
3788
+ "guideline": "Same-as-delivery toggle (default on) for the billing address; when off, mounts a country-specific address form (reusing shipping-address's country descriptors) and persists it via $actions.payment.setBillingAddress on an explicit submit control. Re-checking the toggle dispatches sameAsDelivery: true only once an address was actually persisted (otherwise it's a local no-op — there's nothing on the server to revert). Publishes only a boolean (never the address) onto the shared payment draft for usePlaceOrder to read. While the form is open and nothing has been saved yet, renders an inline status notice — the required attribute on the form's own fields is not a submit gate; Place Order can still complete billed to the delivery address if the shopper never saves. Must be inside a PaymentSectionRoot or PaymentSectionController; place as a sibling of CardEntry/SavedCards/Installments/SaveCard/PlaceOrder, never nested inside any of them. See billing-address.md.",
3789
+ "docPath": "src/matter/billing-address/billing-address.md"
3790
+ },
3791
+ "BreadcrumbRoot": {
3792
+ "name": "BreadcrumbRoot",
3793
+ "importPath": "@vtex/faststore/components",
3794
+ "fragment": "\n fragment BreadcrumbData on Query {\n productBySlug(slug: $slug) {\n breadcrumbs {\n name\n url\n position\n }\n }\n }\n",
3795
+ "editor": {
3796
+ "label": "Breadcrumb Root",
3797
+ "category": "navigation"
3798
+ },
3799
+ "schema": {
3800
+ "label": {
3801
+ "type": "string",
3802
+ "default": "Breadcrumb",
3803
+ "label": "Aria Label"
3804
+ }
3805
+ },
3806
+ "guideline": "Root container for breadcrumb navigation; compose as BreadcrumbRoot > BreadcrumbList > [BreadcrumbLink + BreadcrumbSeparator]."
3807
+ },
3808
+ "BreadcrumbList": {
3809
+ "name": "BreadcrumbList",
3810
+ "importPath": "@vtex/faststore/components",
3811
+ "editor": {
3812
+ "label": "Breadcrumb List",
3813
+ "category": "navigation"
3814
+ },
3815
+ "schema": {},
3816
+ "guideline": "Ordered list of breadcrumb items; must be a direct child of BreadcrumbRoot."
3817
+ },
3818
+ "BreadcrumbLink": {
3819
+ "name": "BreadcrumbLink",
3820
+ "importPath": "@vtex/faststore/components",
3821
+ "editor": {
3822
+ "label": "Breadcrumb Link",
3823
+ "category": "navigation"
3268
3824
  },
3269
3825
  "schema": {},
3270
3826
  "guideline": "Renders the label and link for a breadcrumb item; must be inside BreadcrumbList."
@@ -3325,6 +3881,144 @@
3325
3881
  "guideline": "The add-to-cart button; must be a descendant of BuyButtonRoot. Cart writes flow through $actions.cart, so no CartRoot ancestor is required.",
3326
3882
  "docPath": "src/matter/buy-button/buy-button.md"
3327
3883
  },
3884
+ "CardEntry": {
3885
+ "name": "CardEntry",
3886
+ "importPath": "@vtex/faststore/components",
3887
+ "requiresContext": "card-capture",
3888
+ "editor": {
3889
+ "label": "Card Entry",
3890
+ "category": "commerce"
3891
+ },
3892
+ "schema": {
3893
+ "legend": {
3894
+ "type": "string",
3895
+ "default": "Card details",
3896
+ "label": "Legend"
3897
+ },
3898
+ "numberLabel": {
3899
+ "type": "string",
3900
+ "default": "Card number",
3901
+ "label": "Number label"
3902
+ },
3903
+ "numberPlaceholder": {
3904
+ "type": "string",
3905
+ "label": "Number placeholder"
3906
+ },
3907
+ "holderNameLabel": {
3908
+ "type": "string",
3909
+ "default": "Cardholder name",
3910
+ "label": "Holder name label"
3911
+ },
3912
+ "holderNamePlaceholder": {
3913
+ "type": "string",
3914
+ "label": "Holder name placeholder"
3915
+ },
3916
+ "expirationLabel": {
3917
+ "type": "string",
3918
+ "default": "Expiration date",
3919
+ "label": "Expiration label"
3920
+ },
3921
+ "expirationPlaceholder": {
3922
+ "type": "string",
3923
+ "default": "MM/YY",
3924
+ "label": "Expiration placeholder"
3925
+ },
3926
+ "cvvLabel": {
3927
+ "type": "string",
3928
+ "default": "Security code",
3929
+ "label": "CVV label"
3930
+ },
3931
+ "cvvPlaceholder": {
3932
+ "type": "string",
3933
+ "label": "CVV placeholder"
3934
+ },
3935
+ "cvvDescription": {
3936
+ "type": "string",
3937
+ "default": "The 3-4 digit number on your card",
3938
+ "label": "CVV description"
3939
+ },
3940
+ "numberRequiredMessage": {
3941
+ "type": "string",
3942
+ "default": "Card number is required",
3943
+ "label": "Number required message"
3944
+ },
3945
+ "numberInvalidMessage": {
3946
+ "type": "string",
3947
+ "default": "Enter a valid card number",
3948
+ "label": "Number invalid message"
3949
+ },
3950
+ "holderNameRequiredMessage": {
3951
+ "type": "string",
3952
+ "default": "Cardholder name is required",
3953
+ "label": "Holder name required message"
3954
+ },
3955
+ "expirationRequiredMessage": {
3956
+ "type": "string",
3957
+ "default": "Expiration date is required",
3958
+ "label": "Expiration required message"
3959
+ },
3960
+ "expirationInvalidMessage": {
3961
+ "type": "string",
3962
+ "default": "Enter a valid expiration date",
3963
+ "label": "Expiration invalid message"
3964
+ },
3965
+ "expirationExpiredMessage": {
3966
+ "type": "string",
3967
+ "default": "This card has expired",
3968
+ "label": "Expiration expired message"
3969
+ },
3970
+ "cvvRequiredMessage": {
3971
+ "type": "string",
3972
+ "default": "Security code is required",
3973
+ "label": "CVV required message"
3974
+ },
3975
+ "cvvInvalidMessage": {
3976
+ "type": "string",
3977
+ "default": "Enter a valid security code",
3978
+ "label": "CVV invalid message"
3979
+ },
3980
+ "disabled": {
3981
+ "type": "boolean",
3982
+ "default": false,
3983
+ "label": "Disabled"
3984
+ }
3985
+ },
3986
+ "guideline": "New-card entry: masked number with live network detection, holder name, expiration, and CVV, each shown and required per the detected network's validator config from the 'card-capture' context. Must be placed inside a card-capture provider: PaymentSectionRoot or PaymentSectionController at checkout. Owns the card values itself — it builds the card and hands it only to the submission target its provider supplies; no other component ever needs the card number or CVV. Card number and CVV are never schema props, fragment fields, or action payloads — do not add one. See card-entry.md.",
3987
+ "docPath": "src/matter/card-entry/card-entry.md"
3988
+ },
3989
+ "CardholderDocument": {
3990
+ "name": "CardholderDocument",
3991
+ "importPath": "@vtex/faststore/components",
3992
+ "requiresContext": "payment",
3993
+ "editor": {
3994
+ "label": "Cardholder Document",
3995
+ "category": "commerce"
3996
+ },
3997
+ "schema": {
3998
+ "label": {
3999
+ "type": "string",
4000
+ "default": "CPF",
4001
+ "label": "Label"
4002
+ },
4003
+ "placeholder": {
4004
+ "type": "string",
4005
+ "default": "000.000.000-00",
4006
+ "label": "Placeholder"
4007
+ },
4008
+ "errorMessage": {
4009
+ "type": "string",
4010
+ "default": "Invalid CPF",
4011
+ "label": "Error message"
4012
+ },
4013
+ "disabled": {
4014
+ "type": "boolean",
4015
+ "default": false,
4016
+ "label": "Disabled"
4017
+ }
4018
+ },
4019
+ "guideline": "Cardholder tax-document field for the currently selected payment method (CPF only in this build): renders only when that method's validator marks a document displayable, and marks the input required when the validator marks the document required — the particle, not this leaf, decides whether a typed value is well-formed. Place as a sibling of CardEntry and SavedCards inside a PaymentSectionRoot or PaymentSectionController; renders nothing before a method is selected or when the selected method has no document to collect. The collected value is a plain draft fact — never a schema prop, a fragment field, or an action payload — and is unrelated to the shopper's saved profile document, which this component never reads. See cardholder-document.md.",
4020
+ "docPath": "src/matter/cardholder-document/cardholder-document.md"
4021
+ },
3328
4022
  "CartRoot": {
3329
4023
  "name": "CartRoot",
3330
4024
  "importPath": "@vtex/faststore/components",
@@ -4139,12 +4833,93 @@
4139
4833
  },
4140
4834
  "docPath": "src/matter/cart-totalizer/cart-totalizer.md"
4141
4835
  },
4836
+ "ClientPreferencesFieldset": {
4837
+ "name": "ClientPreferencesFieldset",
4838
+ "importPath": "@vtex/faststore/components",
4839
+ "fragment": "\n fragment ClientPreferencesFieldsetData on Query {\n clientPreferences {\n __typename\n id\n optinNewsLetter\n savePersonalData\n }\n }\n",
4840
+ "fetchStrategy": "reactive",
4841
+ "skeleton": "ClientPreferencesFieldsetSkeleton",
4842
+ "requiresContext": [
4843
+ "form",
4844
+ "session"
4845
+ ],
4846
+ "providesContext": "client-preferences",
4847
+ "actions": {
4848
+ "identity": [
4849
+ "clientPreferencesUpdate"
4850
+ ]
4851
+ },
4852
+ "editor": {
4853
+ "label": "Client Preferences Fieldset",
4854
+ "category": "identity"
4855
+ },
4856
+ "schema": {
4857
+ "skeletonCount": {
4858
+ "type": "number",
4859
+ "default": 2,
4860
+ "label": "Skeleton rows"
4861
+ },
4862
+ "loadingLabel": {
4863
+ "type": "string",
4864
+ "default": "Loading your preferences",
4865
+ "label": "Loading announcement"
4866
+ },
4867
+ "loadedLabel": {
4868
+ "type": "string",
4869
+ "default": "Your preferences are ready",
4870
+ "label": "Loaded announcement"
4871
+ },
4872
+ "groupLabel": {
4873
+ "type": "string",
4874
+ "default": "Your preferences",
4875
+ "label": "Accessible group name"
4876
+ }
4877
+ },
4878
+ "guideline": "Registers a batched write of the ClientPreferences entity with the enclosing FormRoot; renders one Fieldset.Root and no <form>. Distinct from ClientPreferencesRoot (matter/client-preferences), which writes on toggle and requires client-preferences-toggle — the two cannot compile into each other's container. Must be inside a FormRoot with a SessionRoot ancestor. Compose ClientPreferencesNewsletterControl and/or ClientPreferencesSavePersonalDataControl as children. The controls mount only once the preferences have resolved, with skeletonCount placeholder rows in their place until then — set it to the number of controls composed, or the form jumps by the difference. Style the announcement sr-only. Dispatches only the flags the shopper changed. groupLabel names the group as its accessible name; blank emits no aria-label, and a composed FieldsetLegend wins over it.",
4879
+ "docPath": "src/matter/client-preferences/client-preferences-fieldset.md"
4880
+ },
4881
+ "ClientPreferencesNewsletterControl": {
4882
+ "name": "ClientPreferencesNewsletterControl",
4883
+ "importPath": "@vtex/faststore/components",
4884
+ "requiresContext": "client-preferences",
4885
+ "providesContext": "field",
4886
+ "editor": {
4887
+ "label": "Client Preferences Newsletter Control",
4888
+ "category": "identity"
4889
+ },
4890
+ "schema": {
4891
+ "label": {
4892
+ "type": "string",
4893
+ "label": "Label"
4894
+ }
4895
+ },
4896
+ "guideline": "The bound newsletter opt-in control; must be a descendant of ClientPreferencesFieldset. Renders Field.Root > Field.Label > Field.Checkbox by default, or the composed children in the author's own order. Defaults to unchecked.",
4897
+ "docPath": "src/matter/client-preferences/client-preferences-fieldset.md"
4898
+ },
4899
+ "ClientPreferencesSavePersonalDataControl": {
4900
+ "name": "ClientPreferencesSavePersonalDataControl",
4901
+ "importPath": "@vtex/faststore/components",
4902
+ "requiresContext": "client-preferences",
4903
+ "providesContext": "field",
4904
+ "editor": {
4905
+ "label": "Client Preferences Save Personal Data Control",
4906
+ "category": "identity"
4907
+ },
4908
+ "schema": {
4909
+ "label": {
4910
+ "type": "string",
4911
+ "label": "Label"
4912
+ }
4913
+ },
4914
+ "guideline": "The bound save-personal-data opt-in control; must be a descendant of ClientPreferencesFieldset. Renders Field.Root > Field.Label > Field.Checkbox by default, or the composed children in the author's own order. Defaults to unchecked.",
4915
+ "docPath": "src/matter/client-preferences/client-preferences-fieldset.md"
4916
+ },
4142
4917
  "ClientPreferencesRoot": {
4143
4918
  "name": "ClientPreferencesRoot",
4144
4919
  "importPath": "@vtex/faststore/components",
4145
4920
  "fragment": "\n fragment ClientPreferencesData on Query {\n clientPreferences {\n __typename\n id\n optinNewsLetter\n savePersonalData\n }\n }\n",
4146
4921
  "fetchStrategy": "reactive",
4147
- "providesContext": "client-preferences",
4922
+ "providesContext": "client-preferences-toggle",
4148
4923
  "requiresContext": "session",
4149
4924
  "editor": {
4150
4925
  "label": "Client Preferences Root",
@@ -4157,7 +4932,7 @@
4157
4932
  "NewsletterOptInControl": {
4158
4933
  "name": "NewsletterOptInControl",
4159
4934
  "importPath": "@vtex/faststore/components",
4160
- "requiresContext": "client-preferences",
4935
+ "requiresContext": "client-preferences-toggle",
4161
4936
  "actions": {
4162
4937
  "identity": [
4163
4938
  "clientPreferencesUpdate"
@@ -4179,7 +4954,7 @@
4179
4954
  "SavePersonalDataOptInControl": {
4180
4955
  "name": "SavePersonalDataOptInControl",
4181
4956
  "importPath": "@vtex/faststore/components",
4182
- "requiresContext": "client-preferences",
4957
+ "requiresContext": "client-preferences-toggle",
4183
4958
  "actions": {
4184
4959
  "identity": [
4185
4960
  "clientPreferencesUpdate"
@@ -4238,7 +5013,10 @@
4238
5013
  "label": "Country (US or BR)"
4239
5014
  },
4240
5015
  "requirement": {
4241
- "type": "string",
5016
+ "type": [
5017
+ "mandatory",
5018
+ "optional"
5019
+ ],
4242
5020
  "default": "mandatory",
4243
5021
  "label": "Requirement"
4244
5022
  },
@@ -4256,22 +5034,25 @@
4256
5034
  "guideline": "The bound phone field; must be a descendant of ClientProfileRoot. Reads the saved phone from the ClientProfile entity and persists it on blur via $actions.identity.clientProfileUpdate({ phone }). Composes the reusable PhoneField particle.",
4257
5035
  "docPath": "src/matter/client-profile/client-profile.md"
4258
5036
  },
4259
- "ClientProfileFormRoot": {
4260
- "name": "ClientProfileFormRoot",
5037
+ "ClientProfileFieldset": {
5038
+ "name": "ClientProfileFieldset",
4261
5039
  "importPath": "@vtex/faststore/components",
4262
- "fragment": "\n fragment ClientProfileFormData on Query {\n clientProfile {\n __typename\n id\n email\n firstName\n lastName\n phone\n document\n }\n clientPreferences {\n __typename\n id\n optinNewsLetter\n savePersonalData\n }\n }\n",
5040
+ "fragment": "\n fragment ClientProfileFieldsetData on Query {\n clientProfile {\n __typename\n id\n firstName\n lastName\n phone\n document\n }\n }\n",
4263
5041
  "fetchStrategy": "reactive",
4264
- "requiresContext": "session",
4265
- "providesContext": "client-profile-form",
5042
+ "skeleton": "ClientProfileFieldsetSkeleton",
5043
+ "requiresContext": [
5044
+ "form",
5045
+ "session"
5046
+ ],
5047
+ "providesContext": "client-profile-fieldset",
4266
5048
  "actions": {
4267
5049
  "identity": [
4268
- "clientProfileUpdate",
4269
- "clientPreferencesUpdate"
5050
+ "clientProfileUpdate"
4270
5051
  ]
4271
5052
  },
4272
5053
  "editor": {
4273
- "label": "Client Profile Form Root",
4274
- "category": "action"
5054
+ "label": "Client Profile Fieldset",
5055
+ "category": "identity"
4275
5056
  },
4276
5057
  "schema": {
4277
5058
  "country": {
@@ -4282,205 +5063,143 @@
4282
5063
  "documentType": {
4283
5064
  "type": "string",
4284
5065
  "label": "Document type (e.g. CPF)"
5066
+ },
5067
+ "skeletonCount": {
5068
+ "type": "number",
5069
+ "default": 4,
5070
+ "label": "Skeleton rows"
5071
+ },
5072
+ "loadingLabel": {
5073
+ "type": "string",
5074
+ "default": "Loading your details",
5075
+ "label": "Loading announcement"
5076
+ },
5077
+ "loadedLabel": {
5078
+ "type": "string",
5079
+ "default": "Your details are ready",
5080
+ "label": "Loaded announcement"
5081
+ },
5082
+ "groupLabel": {
5083
+ "type": "string",
5084
+ "default": "Your details",
5085
+ "label": "Accessible group name"
4285
5086
  }
4286
5087
  },
4287
- "guideline": "Data root + form mechanics for the batched customer-information form: owns the draft across clientProfile + clientPreferences, dirty tracking, format-only validation (never requiredness), one batched Save (dispatches only touched fields), and the confirmation on a clean save. It reports nothing to anything outside itself. Requires a SessionRoot ancestor. Compose the field/fieldset/feedback parts as children in any order/subset. See client-profile-form.md.",
4288
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
5088
+ "guideline": "Registers a batched write of the ClientProfile entity with the enclosing FormRoot; renders one Fieldset.Root and no <form>. Must be inside a FormRoot with a SessionRoot ancestor. Compose ClientProfileFirstNameControl / ClientProfileLastNameControl / ClientProfileFieldsetPhoneControl / ClientProfileDocumentControl as children, in any order. The controls mount only once the profile has resolved, with skeletonCount placeholder rows in their place until then — set it to the number of controls composed, or the form jumps by the difference. Style the announcement sr-only. Dispatches only the fields the shopper changed. groupLabel names the group as its accessible name; blank emits no aria-label, and a composed FieldsetLegend wins over it.",
5089
+ "docPath": "src/matter/client-profile-form/client-profile-fieldset.md"
4289
5090
  },
4290
- "ClientProfileFormFieldset": {
4291
- "name": "ClientProfileFormFieldset",
5091
+ "ClientProfileFirstNameControl": {
5092
+ "name": "ClientProfileFirstNameControl",
4292
5093
  "importPath": "@vtex/faststore/components",
4293
- "requiresContext": "client-profile-form",
5094
+ "requiresContext": "client-profile-fieldset",
5095
+ "providesContext": "field",
4294
5096
  "editor": {
4295
- "label": "Client Profile Form Fieldset",
4296
- "category": "layout"
5097
+ "label": "Client Profile First Name Control",
5098
+ "category": "identity"
4297
5099
  },
4298
5100
  "schema": {
4299
- "legend": {
5101
+ "label": {
4300
5102
  "type": "string",
4301
- "label": "Legend"
5103
+ "label": "Label"
4302
5104
  },
4303
- "section": {
5105
+ "placeholder": {
4304
5106
  "type": "string",
4305
- "label": "Section name (data-fs hook)"
5107
+ "label": "Placeholder"
4306
5108
  }
4307
5109
  },
4308
- "guideline": "Optional grouping wrapper: a Fieldset whose disabled state follows the form, with an optional legend and a `section` name emitted on data-fs-client-profile-form-section for scoped styling. Compose any subset of the field parts as children. Must be inside ClientProfileForm.Root.",
4309
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
5110
+ "guideline": "The bound first-name control; must be a descendant of ClientProfileFieldset. Renders Field.Root > Field.Label + Field.Control + Field.Error by default, or the composed children in the author's own order.",
5111
+ "docPath": "src/matter/client-profile-form/client-profile-fieldset.md"
4310
5112
  },
4311
- "ClientProfileFormEmailField": {
4312
- "name": "ClientProfileFormEmailField",
5113
+ "ClientProfileLastNameControl": {
5114
+ "name": "ClientProfileLastNameControl",
4313
5115
  "importPath": "@vtex/faststore/components",
4314
- "requiresContext": "client-profile-form",
5116
+ "requiresContext": "client-profile-fieldset",
5117
+ "providesContext": "field",
4315
5118
  "editor": {
4316
- "label": "Client Profile Email Field",
4317
- "category": "action"
5119
+ "label": "Client Profile Last Name Control",
5120
+ "category": "identity"
4318
5121
  },
4319
5122
  "schema": {
4320
5123
  "label": {
4321
5124
  "type": "string",
4322
- "default": "Email",
4323
5125
  "label": "Label"
5126
+ },
5127
+ "placeholder": {
5128
+ "type": "string",
5129
+ "label": "Placeholder"
4324
5130
  }
4325
5131
  },
4326
- "guideline": "Read-only email display, seeded from the profile. Must be inside ClientProfileForm.Root.",
4327
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
5132
+ "guideline": "The bound last-name control; must be a descendant of ClientProfileFieldset. Renders Field.Root > Field.Label + Field.Control + Field.Error by default, or the composed children in the author's own order.",
5133
+ "docPath": "src/matter/client-profile-form/client-profile-fieldset.md"
4328
5134
  },
4329
- "ClientProfileFormFirstNameField": {
4330
- "name": "ClientProfileFormFirstNameField",
5135
+ "ClientProfileFieldsetPhoneControl": {
5136
+ "name": "ClientProfileFieldsetPhoneControl",
4331
5137
  "importPath": "@vtex/faststore/components",
4332
- "requiresContext": "client-profile-form",
5138
+ "requiresContext": "client-profile-fieldset",
5139
+ "providesContext": [
5140
+ "field",
5141
+ "phone-field"
5142
+ ],
4333
5143
  "editor": {
4334
- "label": "Client Profile First Name Field",
4335
- "category": "action"
5144
+ "label": "Client Profile Fieldset Phone Control",
5145
+ "category": "identity"
4336
5146
  },
4337
5147
  "schema": {
4338
5148
  "label": {
4339
5149
  "type": "string",
4340
- "default": "First name",
4341
5150
  "label": "Label"
4342
- }
4343
- },
4344
- "guideline": "First-name text field bound to the form draft. Must be inside ClientProfileForm.Root.",
4345
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
4346
- },
4347
- "ClientProfileFormLastNameField": {
4348
- "name": "ClientProfileFormLastNameField",
4349
- "importPath": "@vtex/faststore/components",
4350
- "requiresContext": "client-profile-form",
4351
- "editor": {
4352
- "label": "Client Profile Last Name Field",
4353
- "category": "action"
4354
- },
4355
- "schema": {
4356
- "label": {
4357
- "type": "string",
4358
- "default": "Last name",
4359
- "label": "Label"
4360
- }
4361
- },
4362
- "guideline": "Last-name text field bound to the form draft. Must be inside ClientProfileForm.Root.",
4363
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
4364
- },
4365
- "ClientProfileFormPhoneField": {
4366
- "name": "ClientProfileFormPhoneField",
4367
- "importPath": "@vtex/faststore/components",
4368
- "requiresContext": "client-profile-form",
4369
- "editor": {
4370
- "label": "Client Profile Phone Field",
4371
- "category": "action"
4372
- },
4373
- "schema": {
4374
- "label": {
5151
+ },
5152
+ "placeholder": {
4375
5153
  "type": "string",
4376
- "default": "Phone number",
4377
- "label": "Label"
4378
- }
4379
- },
4380
- "guideline": "Country-masked phone field (country from Root); format-validated on Save. Must be inside ClientProfileForm.Root.",
4381
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
4382
- },
4383
- "ClientProfileFormDocumentField": {
4384
- "name": "ClientProfileFormDocumentField",
4385
- "importPath": "@vtex/faststore/components",
4386
- "requiresContext": "client-profile-form",
4387
- "editor": {
4388
- "label": "Client Profile Document Field",
4389
- "category": "action"
4390
- },
4391
- "schema": {
4392
- "label": {
5154
+ "label": "Placeholder"
5155
+ },
5156
+ "requirement": {
5157
+ "type": [
5158
+ "mandatory",
5159
+ "optional"
5160
+ ],
5161
+ "label": "Requirement"
5162
+ },
5163
+ "errorInvalid": {
4393
5164
  "type": "string",
4394
- "default": "CPF",
4395
- "label": "Label"
4396
- }
4397
- },
4398
- "guideline": "Tax-document field; self-gates on Root.documentType and check-digit-validates on Save. Must be inside ClientProfileForm.Root.",
4399
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
4400
- },
4401
- "ClientProfileFormNewsletterCheckbox": {
4402
- "name": "ClientProfileFormNewsletterCheckbox",
4403
- "importPath": "@vtex/faststore/components",
4404
- "requiresContext": "client-profile-form",
4405
- "editor": {
4406
- "label": "Client Profile Newsletter Checkbox",
4407
- "category": "action"
4408
- },
4409
- "schema": {
4410
- "label": {
5165
+ "label": "Invalid error message"
5166
+ },
5167
+ "errorRequired": {
4411
5168
  "type": "string",
4412
- "default": "Email me with news and offers",
4413
- "label": "Label"
5169
+ "label": "Required error message"
4414
5170
  }
4415
5171
  },
4416
- "guideline": "Newsletter opt-in checkbox bound to the form draft. Must be inside ClientProfileForm.Root.",
4417
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
5172
+ "guideline": "The bound phone control; must be a descendant of ClientProfileFieldset. Distinct from ClientProfilePhoneControl (matter/client-profile), which writes on blur and requires the client-profile context — the two cannot compile into each other's container. Composes the PhoneField particle: recomposable (RFC:503) — given children, they replace PhoneField's default Field.Label + PhoneFieldInput + Field.Error anatomy, in any order; childless keeps today's order. Its className styles PhoneField's own root, the node that lays out label, input and error — not the wrapper, which carries only the data-fs-client-profile-fieldset-field=\"phone\" styling hook. A store that does not want a phone field omits this element from the page: requirement only governs required validation, never visibility.",
5173
+ "docPath": "src/matter/client-profile-form/client-profile-fieldset.md"
4418
5174
  },
4419
- "ClientProfileFormSavePersonalDataCheckbox": {
4420
- "name": "ClientProfileFormSavePersonalDataCheckbox",
5175
+ "ClientProfileDocumentControl": {
5176
+ "name": "ClientProfileDocumentControl",
4421
5177
  "importPath": "@vtex/faststore/components",
4422
- "requiresContext": "client-profile-form",
5178
+ "requiresContext": "client-profile-fieldset",
5179
+ "providesContext": [
5180
+ "field",
5181
+ "document-field"
5182
+ ],
4423
5183
  "editor": {
4424
- "label": "Client Profile Save-Personal-Data Checkbox",
4425
- "category": "action"
5184
+ "label": "Client Profile Document Control",
5185
+ "category": "identity"
4426
5186
  },
4427
5187
  "schema": {
4428
5188
  "label": {
4429
5189
  "type": "string",
4430
- "default": "Save my information for next time",
4431
5190
  "label": "Label"
4432
- }
4433
- },
4434
- "guideline": "Save-personal-data opt-in checkbox bound to the form draft. Must be inside ClientProfileForm.Root.",
4435
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
4436
- },
4437
- "ClientProfileFormError": {
4438
- "name": "ClientProfileFormError",
4439
- "importPath": "@vtex/faststore/components",
4440
- "requiresContext": "client-profile-form",
4441
- "editor": {
4442
- "label": "Client Profile Form Error",
4443
- "category": "content"
4444
- },
4445
- "schema": {},
4446
- "guideline": "Renders the inline server error (role=\"alert\") from the last Save, or nothing. Must be inside ClientProfileForm.Root.",
4447
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
4448
- },
4449
- "ClientProfileFormConfirmation": {
4450
- "name": "ClientProfileFormConfirmation",
4451
- "importPath": "@vtex/faststore/components",
4452
- "requiresContext": "client-profile-form",
4453
- "editor": {
4454
- "label": "Client Profile Form Confirmation",
4455
- "category": "content"
4456
- },
4457
- "schema": {
4458
- "message": {
5191
+ },
5192
+ "placeholder": {
4459
5193
  "type": "string",
4460
- "default": "Your information has been saved.",
4461
- "label": "Confirmation message"
4462
- }
4463
- },
4464
- "guideline": "Renders the success confirmation (an <output>) after a Save with no errors, cleared on the next edit. Must be inside ClientProfileForm.Root.",
4465
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
4466
- },
4467
- "ClientProfileFormSubmitButton": {
4468
- "name": "ClientProfileFormSubmitButton",
4469
- "importPath": "@vtex/faststore/components",
4470
- "requiresContext": "client-profile-form",
4471
- "editor": {
4472
- "label": "Client Profile Form Submit Button",
4473
- "category": "action"
4474
- },
4475
- "schema": {
4476
- "label": {
5194
+ "label": "Placeholder"
5195
+ },
5196
+ "errorMessage": {
4477
5197
  "type": "string",
4478
- "default": "Save and continue",
4479
- "label": "Button label"
5198
+ "label": "Error message"
4480
5199
  }
4481
5200
  },
4482
- "guideline": "The batched-Save submit button (type=submit). Disabled while a write is in flight; renders nothing when the session is read-only. Compose an Icon + text as children, or rely on `label`. Must be inside ClientProfileForm.Root.",
4483
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
5201
+ "guideline": "The bound tax-document control; must be a descendant of ClientProfileFieldset. Renders nothing, and registers no field name, when the fieldset's documentType is unsupported. Composes the DocumentField particle: recomposable (RFC:503) — given children, they replace DocumentField's default Field.Label + DocumentFieldInput + Field.Error anatomy, in any order; childless keeps today's order.",
5202
+ "docPath": "src/matter/client-profile-form/client-profile-fieldset.md"
4484
5203
  },
4485
5204
  "DeliveryOptionsAccordion": {
4486
5205
  "name": "DeliveryOptionsAccordion",
@@ -4704,7 +5423,7 @@
4704
5423
  "category": "commerce"
4705
5424
  },
4706
5425
  "schema": {},
4707
- "guideline": "Owns the identity section's summary/form toggle: starts on the summary, opens on IdentityEditButton and returns on IdentityEditCancelButton. Saving does not move it, so the form's confirmation stays readable and ClientProfileForm never needs to know about a section around it. Self-contained: collapsing tells nothing else, so no other section opens as a result. Compose an IdentitySummaryView holding the summary parts and an IdentityEditForm holding a ClientProfileForm, plus an IdentityEditButton in the heading and an IdentityEditCancelButton next to the form. No state is named anywhere: which state a part belongs to is which component it is. Renders no DOM of its own.",
5426
+ "guideline": "Owns the identity section's summary/form toggle: starts on the summary, opens on IdentityEditButton and returns on IdentityEditCancelButton. Saving does not move it, so the form stays open and no descendant needs to know about a section around it. Self-contained: collapsing tells nothing else, so no other section opens as a result. Compose an IdentitySummaryView holding the summary parts and an IdentityEditForm holding a FormRoot over ClientProfileFieldset, plus an IdentityEditButton in the heading and an IdentityEditCancelButton next to the form. No state is named anywhere: which state a part belongs to is which component it is. Renders no DOM of its own.",
4708
5427
  "docPath": "src/matter/identity-edit/identity-edit.md"
4709
5428
  },
4710
5429
  "IdentitySummaryView": {
@@ -4728,7 +5447,7 @@
4728
5447
  "category": "commerce"
4729
5448
  },
4730
5449
  "schema": {},
4731
- "guideline": "Renders its children only while the identity section shows the form, and nothing while it shows the summary. Compose ClientProfileFormRoot and its parts inside, plus an IdentityEditCancelButton. Must be inside an IdentityEditController.",
5450
+ "guideline": "Renders its children only while the identity section shows the form, and nothing while it shows the summary. Compose a FormRoot holding ClientProfileFieldset and its controls inside, plus an IdentityEditCancelButton. Must be inside an IdentityEditController.",
4732
5451
  "docPath": "src/matter/identity-edit/identity-edit.md"
4733
5452
  },
4734
5453
  "IdentityEditButton": {
@@ -4790,7 +5509,7 @@
4790
5509
  "label": "Sign-out error message"
4791
5510
  }
4792
5511
  },
4793
- "guideline": "Read-only identity summary data root: reads the shopper profile, provides it plus a sign-out action to descendants, and self-gates (renders nothing in the anonymous state). Must be inside SessionRoot. Wrap the parts in an IdentityEditController for the summary/form swap: an IdentitySummaryView holding these parts, an IdentityEditForm holding a ClientProfileForm. See identity-summary.md.",
5512
+ "guideline": "Read-only identity summary data root: reads the shopper profile, provides it plus a sign-out action to descendants, and self-gates (renders nothing in the anonymous state). Must be inside SessionRoot. Wrap the parts in an IdentityEditController for the summary/form swap: an IdentitySummaryView holding these parts, an IdentityEditForm holding a FormRoot over ClientProfileFieldset. See identity-summary.md.",
4794
5513
  "docPath": "src/matter/identity-summary/identity-summary.md"
4795
5514
  },
4796
5515
  "IdentitySummarySelectedSummary": {
@@ -4911,6 +5630,91 @@
4911
5630
  "guideline": "Renders the inline sign-out error (role=\"alert\") when the logout mutation returns a user error, else nothing. Must be a descendant of IdentitySummaryRoot.",
4912
5631
  "docPath": "src/matter/identity-summary/identity-summary.md"
4913
5632
  },
5633
+ "InstallmentsSelect": {
5634
+ "name": "InstallmentsSelect",
5635
+ "importPath": "@vtex/faststore/components",
5636
+ "fragment": "\n fragment InstallmentsSelectData on Query {\n payment {\n __typename\n id\n installmentOptions {\n __typename\n methodId\n bin\n installments {\n __typename\n count\n value {\n amount\n currencyCode\n }\n interestRate\n }\n }\n selectedInstallment {\n __typename\n count\n }\n }\n }\n",
5637
+ "fetchStrategy": "reactive",
5638
+ "requiresContext": "payment",
5639
+ "actions": {
5640
+ "payment": [
5641
+ "setInstallments"
5642
+ ]
5643
+ },
5644
+ "docPath": "src/matter/installments/installments.md",
5645
+ "editor": {
5646
+ "label": "Installments Select",
5647
+ "category": "commerce"
5648
+ },
5649
+ "schema": {
5650
+ "installmentTemplate": {
5651
+ "type": "string",
5652
+ "default": "{count}x of {value}",
5653
+ "label": "Installment template"
5654
+ },
5655
+ "interestFreeLabel": {
5656
+ "type": "string",
5657
+ "default": "interest-free",
5658
+ "label": "Interest-free label"
5659
+ },
5660
+ "interestTemplate": {
5661
+ "type": "string",
5662
+ "default": "{rate}% interest",
5663
+ "label": "Interest template"
5664
+ },
5665
+ "label": {
5666
+ "type": "string",
5667
+ "default": "Installments",
5668
+ "label": "Accessible label"
5669
+ },
5670
+ "placeholder": {
5671
+ "type": "string",
5672
+ "default": "Select an installment plan",
5673
+ "label": "Placeholder"
5674
+ }
5675
+ },
5676
+ "guideline": "Collapsed installment picker for checkout: a single closed control (Base UI Select) showing the persisted selection's label, expanding into one option per tier the matched option carries — count, per-installment value, and interest, formatted identically to Installments (the API guarantees a 1x tier is present in every option). Reads the same Query.payment data and dispatches the same $actions.payment.setInstallments as Installments — the two are alternative renderings of one engine, so pick whichever fits the layout: this one for a narrow column, a drawer, or a mobile checkout; Installments when stacked rows fit. Must be inside a PaymentSectionRoot or PaymentSectionController — place it as a sibling of CardEntry and SavedCards, never nested inside either. Renders its own options from real data — no children. The popup is portalled to <body>: the label, trigger, value, icon, and inline error stay reachable from a store's style array, but the option list does not — see installments.md."
5677
+ },
5678
+ "Installments": {
5679
+ "name": "Installments",
5680
+ "importPath": "@vtex/faststore/components",
5681
+ "fragment": "\n fragment InstallmentsData on Query {\n payment {\n __typename\n id\n installmentOptions {\n __typename\n methodId\n bin\n installments {\n __typename\n count\n value {\n amount\n currencyCode\n }\n interestRate\n }\n }\n selectedInstallment {\n __typename\n count\n }\n }\n }\n",
5682
+ "fetchStrategy": "reactive",
5683
+ "requiresContext": "payment",
5684
+ "actions": {
5685
+ "payment": [
5686
+ "setInstallments"
5687
+ ]
5688
+ },
5689
+ "editor": {
5690
+ "label": "Installments",
5691
+ "category": "commerce"
5692
+ },
5693
+ "schema": {
5694
+ "installmentTemplate": {
5695
+ "type": "string",
5696
+ "default": "{count}x of {value}",
5697
+ "label": "Installment template"
5698
+ },
5699
+ "interestFreeLabel": {
5700
+ "type": "string",
5701
+ "default": "interest-free",
5702
+ "label": "Interest-free label"
5703
+ },
5704
+ "interestTemplate": {
5705
+ "type": "string",
5706
+ "default": "{rate}% interest",
5707
+ "label": "Interest template"
5708
+ },
5709
+ "legend": {
5710
+ "type": "string",
5711
+ "default": "Installments",
5712
+ "label": "Legend"
5713
+ }
5714
+ },
5715
+ "guideline": "Installment selector for checkout: shows count, per-installment value, and interest for the card currently being entered (matched by BIN) or the saved card currently selected (matched by the persisted BIN, falling back to method), rendering exactly the tiers the matched option returns (the API guarantees a 1x tier is present in every option, so one is always shown and selectable — see specs/installments.md). Must be inside a PaymentSectionRoot or PaymentSectionController — place it as a sibling of CardEntry and SavedCards, never nested inside either, so one instance serves both entry paths. Picking a row dispatches $actions.payment.setInstallments and the order total updates elsewhere from the normalized cache with no wiring here. Renders its own rows from real data — no children.",
5716
+ "docPath": "src/matter/installments/installments.md"
5717
+ },
4914
5718
  "MyAccountProfileRoot": {
4915
5719
  "name": "MyAccountProfileRoot",
4916
5720
  "importPath": "@vtex/faststore/components",
@@ -4935,10 +5739,12 @@
4935
5739
  },
4936
5740
  "saveFailedMessage": {
4937
5741
  "type": "string",
5742
+ "default": "Unable to save your profile. Please try again.",
4938
5743
  "label": "Save failure message"
4939
5744
  },
4940
5745
  "savedMessage": {
4941
5746
  "type": "string",
5747
+ "default": "Your profile has been saved.",
4942
5748
  "label": "Save success message"
4943
5749
  }
4944
5750
  },
@@ -5181,103 +5987,383 @@
5181
5987
  "guideline": "Draft-bound, optional gender field over a store-configurable set of options (the options prop). Free-string storage — no server-side enum. A Clear button erases a selected value back to empty, since the Select itself offers no such option. Must be a descendant of MyAccountProfileRoot.",
5182
5988
  "docPath": "src/matter/my-account-profile/my-account-profile.md"
5183
5989
  },
5184
- "PricingRoot": {
5185
- "name": "PricingRoot",
5990
+ "OrderPlacedPaymentSummary": {
5991
+ "name": "OrderPlacedPaymentSummary",
5186
5992
  "importPath": "@vtex/faststore/components",
5187
- "fragment": "\n fragment PricingData on Query {\n productBySlug(slug: $slug) {\n __typename\n id\n variants(first: 1) {\n edges {\n node {\n sellers {\n isDefault\n offer {\n price { amount currencyCode }\n listPrice { amount currencyCode }\n spotPrice { amount currencyCode }\n installmentPlans {\n paymentMethod\n paymentType\n installments {\n count\n value { amount currencyCode }\n totalAmount { amount currencyCode }\n interestRate\n interestFree\n }\n }\n discountHighlights\n promotions {\n name\n }\n }\n }\n }\n }\n }\n }\n }\n",
5188
- "fetchStrategy": "lazy",
5189
- "skeleton": "PricingSkeleton",
5993
+ "fragment": "\n fragment OrderPlacedPaymentSummaryData on Query {\n order(orderGroup: $orderGroup) {\n __typename\n id\n network\n lastFourDigits\n label\n installment {\n count\n total {\n amount\n currencyCode\n }\n }\n }\n }\n",
5994
+ "fetchStrategy": "reactive",
5190
5995
  "editor": {
5191
- "label": "Pricing",
5996
+ "label": "Order Placed Payment Summary",
5192
5997
  "category": "commerce"
5193
5998
  },
5194
5999
  "schema": {
5195
- "selectedVariantId": {
6000
+ "lastFourTemplate": {
5196
6001
  "type": "string",
5197
- "label": "Selected Variant ID"
6002
+ "default": "•••• {lastFour}",
6003
+ "label": "Last-four template"
6004
+ },
6005
+ "noPaymentRecordLabel": {
6006
+ "type": "string",
6007
+ "default": "Payment method not available",
6008
+ "label": "No payment record label"
6009
+ },
6010
+ "unresolvedOrderLabel": {
6011
+ "type": "string",
6012
+ "default": "Could not load the payment details",
6013
+ "label": "Unresolved order label"
6014
+ },
6015
+ "multiSellerNotice": {
6016
+ "type": "string",
6017
+ "default": "This order was split across {count} sellers; the payment summary does not cover split orders",
6018
+ "label": "Multi-seller notice"
6019
+ },
6020
+ "installmentTemplate": {
6021
+ "type": "string",
6022
+ "default": "{count}x of {total}",
6023
+ "label": "Installment template"
5198
6024
  }
5199
6025
  },
5200
- "guideline": "Root container for the PDP pricing block; all other Pricing sub-components must be descendants of it. Automatically recomputes the offer when a shopper picks a VariantSelector swatch (it reads the published variant selection); the selectedVariantId prop is an optional pre-selection fallback. Falls back silently to the product-level offer on variant fetch error. See pricing.md.",
5201
- "docPath": "src/matter/pricing/pricing.md"
6026
+ "guideline": "Read-only recap, on a post-purchase confirmation surface, of the card the shopper paid with — sourced from the settled order (Query.order), never the live order form. Owns its own fragment; requires no ancestor context, so it composes standalone. Renders exactly one of five states, in strict precedence: a role=\"alert\" notice for a split (multi-seller) order — the projection never covers one; nothing while the query is in flight; a role=\"alert\" notice when the order group does not resolve; an informational line when the order resolves with no payment record; or the recap itself (network, plus last four whenever the projection carries one, plus the saved-card label when set, plus an installment line — count and settled total only, never a per-installment amount or interest rate — whenever the settled record reports one). Never compose it in checkout — the order group it reads does not exist until the order is placed, and no component renders a payment recap there. Never renders a full card number or CVV. See order-placed-payment-summary.md.",
6027
+ "docPath": "src/matter/order-placed-payment-summary/order-placed-payment-summary.md"
5202
6028
  },
5203
- "PricingSellingPrice": {
5204
- "name": "PricingSellingPrice",
6029
+ "PaymentSectionController": {
6030
+ "name": "PaymentSectionController",
5205
6031
  "importPath": "@vtex/faststore/components",
5206
- "editor": {
5207
- "label": "Selling Price",
5208
- "category": "commerce"
6032
+ "fragment": "\n fragment PaymentSectionControllerData on Query {\n payment {\n __typename\n id\n methods {\n __typename\n id\n name\n groupName\n validator {\n __typename\n numberMask\n numberRegex\n cvvMask\n cvvRegex\n cvvRequired\n expirationRequired\n holderNameRequired\n billingAddressRequired\n documentDisplayable\n documentRequired\n }\n }\n selectedMethodId\n selectedAccountId\n selectedBin\n }\n cart {\n __typename\n id\n total {\n __typename\n amount\n currencyCode\n }\n }\n }\n",
6033
+ "fetchStrategy": "reactive",
6034
+ "actions": {
6035
+ "payment": [
6036
+ "setMethod",
6037
+ "sendPayments"
6038
+ ],
6039
+ "analytics": [
6040
+ "track"
6041
+ ]
5209
6042
  },
5210
- "schema": {},
5211
- "guideline": "Displays the current selling price; must be a descendant of PricingRoot.",
5212
- "docPath": "src/matter/pricing/pricing.md"
5213
- },
5214
- "PricingListPrice": {
5215
- "name": "PricingListPrice",
5216
- "importPath": "@vtex/faststore/components",
6043
+ "providesContext": [
6044
+ "payment",
6045
+ "card-capture"
6046
+ ],
5217
6047
  "editor": {
5218
- "label": "List Price",
6048
+ "label": "Payment Section Controller",
5219
6049
  "category": "commerce"
5220
6050
  },
5221
- "schema": {},
5222
- "guideline": "Displays the original (strikethrough) list price; only renders when a discount exists. Must be a descendant of PricingRoot.",
5223
- "docPath": "src/matter/pricing/pricing.md"
6051
+ "schema": {
6052
+ "group": {
6053
+ "type": "array",
6054
+ "default": [
6055
+ "creditCardPaymentGroup",
6056
+ "debitCardPaymentGroup"
6057
+ ],
6058
+ "label": "Payment method group"
6059
+ }
6060
+ },
6061
+ "guideline": "State-only controller for a collapsed payment section: wrap a single DialogRoot (centered modal) or DrawerRoot (slide-in) child and it becomes controlled. Renders no markup and bakes no styling — compose the overlay particles (DialogTrigger/DialogPortal/DialogBackdrop/DialogPopup or the Drawer equivalents) directly as page nodes, put a static label (Text) inside the trigger — no component echoes the current choice there, and put PaymentMethodList plus the payment leaves (CardEntry, Installments, SavedCards, PlaceOrder, …) inside the popup. Provides the same 'payment' and 'card-capture' contexts as PaymentSectionRoot, so every leaf composes under either with no change. Unlike the delivery-options controller it does NOT close on a successful selection — picking a method is mid-flow — so close it from a DrawerClose/DialogClose particle or from the leaf that finishes the flow. See payment.md.",
6062
+ "docPath": "src/matter/payment/payment.md"
5224
6063
  },
5225
- "PricingSpotPrice": {
5226
- "name": "PricingSpotPrice",
6064
+ "PaymentMethodBadges": {
6065
+ "name": "PaymentMethodBadges",
5227
6066
  "importPath": "@vtex/faststore/components",
6067
+ "requiresContext": "payment",
5228
6068
  "editor": {
5229
- "label": "Spot Price",
6069
+ "label": "Payment Method Badges",
5230
6070
  "category": "commerce"
5231
6071
  },
5232
- "schema": {},
5233
- "guideline": "Displays the best cash/instant-payment price (e.g. Pix); only renders when spotPrice is lower than the selling price. Must be a descendant of PricingRoot.",
5234
- "docPath": "src/matter/pricing/pricing.md"
6072
+ "schema": {
6073
+ "heading": {
6074
+ "type": "string",
6075
+ "label": "Heading"
6076
+ }
6077
+ },
6078
+ "guideline": "A read-only strip of one badge per payment method the store currently accepts, derived from the live order form on every render — never authored, never CMS content — so it updates the moment a method is enabled or disabled in the payment configuration. Place it inside a PaymentSectionRoot or PaymentSectionController, alongside PaymentMethodList and CardEntry; it renders nothing selectable and dispatches no action. Not PaymentMethods, which is the CMS-authored footer strip that cannot reflect the store's live configuration. See payment-method-badges.md.",
6079
+ "docPath": "src/matter/payment/payment-method-badges.md"
5235
6080
  },
5236
- "PricingInstallments": {
5237
- "name": "PricingInstallments",
6081
+ "AcceptedPaymentMethodBadges": {
6082
+ "name": "AcceptedPaymentMethodBadges",
5238
6083
  "importPath": "@vtex/faststore/components",
6084
+ "fragment": "\n fragment AcceptedPaymentMethodBadgesData on Query {\n payment {\n __typename\n id\n methods {\n __typename\n id\n name\n }\n }\n }\n",
6085
+ "fetchStrategy": "reactive",
5239
6086
  "editor": {
5240
- "label": "Installments",
6087
+ "label": "Accepted Payment Method Badges",
5241
6088
  "category": "commerce"
5242
6089
  },
5243
- "schema": {},
5244
- "guideline": "Shortcut container that exposes the single best installment across all plans; use PricingInstallmentPlans instead when a per-payment-method breakdown is needed. Must be a descendant of PricingRoot.",
5245
- "docPath": "src/matter/pricing/pricing.md"
6090
+ "schema": {
6091
+ "heading": {
6092
+ "type": "string",
6093
+ "label": "Heading"
6094
+ }
6095
+ },
6096
+ "guideline": "A read-only strip of one badge per payment method the store currently accepts, derived from the live order form on every render — never authored, never CMS content. Owns its own Query.payment fragment — no PaymentSectionRoot or PaymentSectionController ancestor required — so place it on the cart order summary or another checkout-adjacent surface that already has a live cart. Placing it on a page with no cart context (a footer, home, or PDP) still resolves Query.payment on every server render, which mints a fresh upstream order form each time — a real cost in logs and upstream state, not a correctness error. Use PaymentMethodBadges instead for the strip inside a payment section; the two share one render contract and differ only in where their data comes from. Not PaymentMethods, the CMS-authored footer strip that cannot reflect the store's live configuration; not PaymentMethodList, the selectable picker; not CardEntry's own in-field network row. See payment-method-badges.md.",
6097
+ "docPath": "src/matter/payment/payment-method-badges.md"
5246
6098
  },
5247
- "PricingInstallmentPlans": {
5248
- "name": "PricingInstallmentPlans",
6099
+ "PaymentSectionRoot": {
6100
+ "name": "PaymentSectionRoot",
5249
6101
  "importPath": "@vtex/faststore/components",
6102
+ "fragment": "\n fragment PaymentSectionData on Query {\n payment {\n __typename\n id\n methods {\n __typename\n id\n name\n groupName\n validator {\n __typename\n numberMask\n numberRegex\n cvvMask\n cvvRegex\n cvvRequired\n expirationRequired\n holderNameRequired\n billingAddressRequired\n documentDisplayable\n documentRequired\n }\n }\n selectedMethodId\n selectedAccountId\n selectedBin\n }\n cart {\n __typename\n id\n total {\n __typename\n amount\n currencyCode\n }\n }\n }\n",
6103
+ "fetchStrategy": "reactive",
6104
+ "actions": {
6105
+ "payment": [
6106
+ "setMethod",
6107
+ "sendPayments"
6108
+ ],
6109
+ "analytics": [
6110
+ "track"
6111
+ ]
6112
+ },
6113
+ "providesContext": [
6114
+ "payment",
6115
+ "card-capture"
6116
+ ],
5250
6117
  "editor": {
5251
- "label": "Installment Plans",
6118
+ "label": "Payment Section",
5252
6119
  "category": "commerce"
5253
6120
  },
5254
- "schema": {},
5255
- "guideline": "Renders one row per payment method; use PricingInstallments instead when only the single best plan is needed. Must be a descendant of PricingRoot.",
5256
- "docPath": "src/matter/pricing/pricing.md"
6121
+ "schema": {
6122
+ "group": {
6123
+ "type": "array",
6124
+ "default": [
6125
+ "creditCardPaymentGroup",
6126
+ "debitCardPaymentGroup"
6127
+ ],
6128
+ "label": "Payment method group"
6129
+ }
6130
+ },
6131
+ "guideline": "Root of the checkout payment section: reads the payment methods and the current selection from the order form and provides the 'payment' context every payment leaf needs and the 'card-capture' context CardEntry needs, so place CardEntry, CardholderDocument, Installments, SaveCard, BillingAddress, SavedCards, PlaceOrder, and PaymentMethodList as its children — none of them render without a payment root ancestor. Renders one container div and no chrome or copy of its own; headings and layout belong to the composition. Selecting a payment option dispatches $actions.payment.setMethod and every subscriber re-renders from the cache with no refetch — and for a card it is the number the shopper types that decides the network, not an option they pick, so PaymentMethodList shows every in-scope credit and debit method as ONE card option. Which methods exist is always real data — never author them as props; group only scopes the list by the store's payment group(s) — defaults to credit and debit together, accepts one group name or a set of them, and set it to \"\" to show every method, one option each, with no card option. Use PaymentSectionController instead when the section should live in a drawer or modal. See payment.md.",
6132
+ "docPath": "src/matter/payment/payment.md"
5257
6133
  },
5258
- "PricingInstallmentPlan": {
5259
- "name": "PricingInstallmentPlan",
6134
+ "PaymentMethodList": {
6135
+ "name": "PaymentMethodList",
5260
6136
  "importPath": "@vtex/faststore/components",
6137
+ "requiresContext": "payment",
5261
6138
  "editor": {
5262
- "label": "Installment Plan",
6139
+ "label": "Payment Method List",
5263
6140
  "category": "commerce"
5264
6141
  },
5265
- "schema": {},
5266
- "guideline": "Renders a single plan row inside PricingInstallmentPlans; nest PricingInstallmentsForPlan inside it to list every installment tier instead of just the best one. Must be a descendant of PricingInstallmentPlans.",
5267
- "docPath": "src/matter/pricing/pricing.md"
6142
+ "schema": {
6143
+ "legend": {
6144
+ "type": "string",
6145
+ "default": "Payment method",
6146
+ "label": "Legend"
6147
+ },
6148
+ "cardLabel": {
6149
+ "type": "string",
6150
+ "default": "Pay with Credit / Debit Card",
6151
+ "label": "Card option label"
6152
+ }
6153
+ },
6154
+ "guideline": "The payment-method picker: a radio group of the payment options the order form offers, plus the inline selection error (role=\"alert\"). Every in-scope credit and debit method is ONE option — the network comes from the card number the shopper types, never from a row they pick — and any other in-scope method (e.g. Pix) keeps a row of its own; set group to \"\" on the root to switch that off and get one row per method. Selecting an option dispatches the method selection. Selecting a non-card option hides the card form, and the card option brings it back. Place it inside a PaymentSectionRoot, or inside the DialogPopup/DrawerPopup of a PaymentSectionController. It renders its own options from real data, so it takes no children and no method props; author the card option's wording with cardLabel. Keep it composed: it is the only element that surfaces a rejected selection, and the only control that can recover a selection this section does not serve — omit it and a shopper whose persisted method sits outside group has no reachable way back. Must be inside a payment root.",
6155
+ "docPath": "src/matter/payment/payment.md"
5268
6156
  },
5269
- "PricingInstallmentsForPlan": {
5270
- "name": "PricingInstallmentsForPlan",
6157
+ "PlaceOrder": {
6158
+ "name": "PlaceOrder",
5271
6159
  "importPath": "@vtex/faststore/components",
6160
+ "fragment": "\n fragment PlaceOrderData on Query {\n payment {\n __typename\n id\n selectedMethodId\n selectedInstallment {\n __typename\n count\n value {\n amount\n currencyCode\n }\n interestRate\n }\n methods {\n __typename\n id\n groupName\n }\n }\n }\n",
6161
+ "fetchStrategy": "reactive",
6162
+ "actions": {
6163
+ "payment": [
6164
+ "startTransaction",
6165
+ "gatewayCallback"
6166
+ ],
6167
+ "analytics": [
6168
+ "track"
6169
+ ]
6170
+ },
6171
+ "requiresContext": "payment",
5272
6172
  "editor": {
5273
- "label": "Installments For Plan",
6173
+ "label": "Place Order",
5274
6174
  "category": "commerce"
5275
6175
  },
5276
- "schema": {},
5277
- "guideline": "Iterates every installment tier (1x, 2x, … Nx) of the enclosing plan; must be a descendant of PricingInstallmentPlan.",
5278
- "docPath": "src/matter/pricing/pricing.md"
5279
- },
5280
- "PricingPaymentMethodsTrigger": {
6176
+ "schema": {
6177
+ "label": {
6178
+ "type": "string",
6179
+ "default": "Place order",
6180
+ "label": "Button label"
6181
+ },
6182
+ "placingLabel": {
6183
+ "type": "string",
6184
+ "default": "Placing order...",
6185
+ "label": "Button label while placing"
6186
+ },
6187
+ "resumeLabel": {
6188
+ "type": "string",
6189
+ "default": "Complete your order",
6190
+ "label": "Button label while a surviving attempt offers a resume"
6191
+ },
6192
+ "successMessage": {
6193
+ "type": "string",
6194
+ "default": "Order placed successfully.",
6195
+ "label": "Success message"
6196
+ },
6197
+ "missingSubmissionMessage": {
6198
+ "type": "string",
6199
+ "default": "Enter your payment details before placing the order.",
6200
+ "label": "Missing payment submission message"
6201
+ },
6202
+ "missingMethodMessage": {
6203
+ "type": "string",
6204
+ "default": "Choose a payment method before placing the order.",
6205
+ "label": "Missing payment method message"
6206
+ },
6207
+ "invalidTransactionMessage": {
6208
+ "type": "string",
6209
+ "default": "Unable to start the payment. Please try again.",
6210
+ "label": "Invalid transaction message"
6211
+ },
6212
+ "networkErrorMessage": {
6213
+ "type": "string",
6214
+ "default": "Unable to complete the request. Please try again.",
6215
+ "label": "Network error message"
6216
+ },
6217
+ "missingDocumentMessage": {
6218
+ "type": "string",
6219
+ "default": "Enter your document before placing the order.",
6220
+ "label": "Missing document message"
6221
+ },
6222
+ "invalidDocumentMessage": {
6223
+ "type": "string",
6224
+ "default": "Enter a valid document before placing the order.",
6225
+ "label": "Invalid document message"
6226
+ },
6227
+ "unavailableMethodMessage": {
6228
+ "type": "string",
6229
+ "default": "Choose another payment method before placing the order.",
6230
+ "label": "Unavailable payment method message"
6231
+ },
6232
+ "unsavedBillingAddressMessage": {
6233
+ "type": "string",
6234
+ "default": "Save your billing address before placing the order.",
6235
+ "label": "Unsaved billing address message"
6236
+ },
6237
+ "invalidCardDataMessage": {
6238
+ "type": "string",
6239
+ "default": "Enter valid card details before placing the order.",
6240
+ "label": "Invalid card data message"
6241
+ },
6242
+ "invalidSecurityCodeMessage": {
6243
+ "type": "string",
6244
+ "default": "Enter a valid security code before placing the order.",
6245
+ "label": "Invalid security code message"
6246
+ },
6247
+ "gatewayErrorMessage": {
6248
+ "type": "string",
6249
+ "default": "Unable to complete the payment. Please try again.",
6250
+ "label": "Gateway error message"
6251
+ },
6252
+ "inFlightMessage": {
6253
+ "type": "string",
6254
+ "default": "This order is already being placed. Please wait.",
6255
+ "label": "Order already in flight message"
6256
+ },
6257
+ "unconfirmedMessage": {
6258
+ "type": "string",
6259
+ "default": "We could not confirm your order yet. Your payment may still be processing, so please do not pay again.",
6260
+ "label": "Unconfirmed order message"
6261
+ },
6262
+ "successHref": {
6263
+ "type": "string",
6264
+ "label": "Confirmation route template ({orderGroup} token)"
6265
+ }
6266
+ },
6267
+ "guideline": "The place-order CTA: invokes usePlaceOrder's three-call sequence (start transaction, the registered submission's own direct-to-gateway leg, then the gateway callback) and blocks interaction while it runs. Compose it as a sibling — never a child — of every other payment-entry leaf under the same PaymentSectionRoot or PaymentSectionController, so the one CTA serves every entry path. Renders one inline outcome after settling: the first userError's message, or successMessage on a clean settle. This component reaches no payment-sensitive input. Must be inside a payment root. See place-order.md.",
6268
+ "docPath": "src/matter/place-order/place-order.md"
6269
+ },
6270
+ "PricingRoot": {
6271
+ "name": "PricingRoot",
6272
+ "importPath": "@vtex/faststore/components",
6273
+ "fragment": "\n fragment PricingData on Query {\n productBySlug(slug: $slug) {\n __typename\n id\n variants(first: 1) {\n edges {\n node {\n sellers {\n isDefault\n offer {\n price { amount currencyCode }\n listPrice { amount currencyCode }\n spotPrice { amount currencyCode }\n installmentPlans {\n paymentMethod\n paymentType\n installments {\n count\n value { amount currencyCode }\n totalAmount { amount currencyCode }\n interestRate\n interestFree\n }\n }\n discountHighlights\n promotions {\n name\n }\n }\n }\n }\n }\n }\n }\n }\n",
6274
+ "fetchStrategy": "lazy",
6275
+ "skeleton": "PricingSkeleton",
6276
+ "editor": {
6277
+ "label": "Pricing",
6278
+ "category": "commerce"
6279
+ },
6280
+ "schema": {
6281
+ "selectedVariantId": {
6282
+ "type": "string",
6283
+ "label": "Selected Variant ID"
6284
+ }
6285
+ },
6286
+ "guideline": "Root container for the PDP pricing block; all other Pricing sub-components must be descendants of it. Automatically recomputes the offer when a shopper picks a VariantSelector swatch (it reads the published variant selection); the selectedVariantId prop is an optional pre-selection fallback. Falls back silently to the product-level offer on variant fetch error. See pricing.md.",
6287
+ "docPath": "src/matter/pricing/pricing.md"
6288
+ },
6289
+ "PricingSellingPrice": {
6290
+ "name": "PricingSellingPrice",
6291
+ "importPath": "@vtex/faststore/components",
6292
+ "editor": {
6293
+ "label": "Selling Price",
6294
+ "category": "commerce"
6295
+ },
6296
+ "schema": {},
6297
+ "guideline": "Displays the current selling price; must be a descendant of PricingRoot.",
6298
+ "docPath": "src/matter/pricing/pricing.md"
6299
+ },
6300
+ "PricingListPrice": {
6301
+ "name": "PricingListPrice",
6302
+ "importPath": "@vtex/faststore/components",
6303
+ "editor": {
6304
+ "label": "List Price",
6305
+ "category": "commerce"
6306
+ },
6307
+ "schema": {},
6308
+ "guideline": "Displays the original (strikethrough) list price; only renders when a discount exists. Must be a descendant of PricingRoot.",
6309
+ "docPath": "src/matter/pricing/pricing.md"
6310
+ },
6311
+ "PricingSpotPrice": {
6312
+ "name": "PricingSpotPrice",
6313
+ "importPath": "@vtex/faststore/components",
6314
+ "editor": {
6315
+ "label": "Spot Price",
6316
+ "category": "commerce"
6317
+ },
6318
+ "schema": {},
6319
+ "guideline": "Displays the best cash/instant-payment price (e.g. Pix); only renders when spotPrice is lower than the selling price. Must be a descendant of PricingRoot.",
6320
+ "docPath": "src/matter/pricing/pricing.md"
6321
+ },
6322
+ "PricingInstallments": {
6323
+ "name": "PricingInstallments",
6324
+ "importPath": "@vtex/faststore/components",
6325
+ "editor": {
6326
+ "label": "Installments",
6327
+ "category": "commerce"
6328
+ },
6329
+ "schema": {},
6330
+ "guideline": "Shortcut container that exposes the single best installment across all plans; use PricingInstallmentPlans instead when a per-payment-method breakdown is needed. Must be a descendant of PricingRoot.",
6331
+ "docPath": "src/matter/pricing/pricing.md"
6332
+ },
6333
+ "PricingInstallmentPlans": {
6334
+ "name": "PricingInstallmentPlans",
6335
+ "importPath": "@vtex/faststore/components",
6336
+ "editor": {
6337
+ "label": "Installment Plans",
6338
+ "category": "commerce"
6339
+ },
6340
+ "schema": {},
6341
+ "guideline": "Renders one row per payment method; use PricingInstallments instead when only the single best plan is needed. Must be a descendant of PricingRoot.",
6342
+ "docPath": "src/matter/pricing/pricing.md"
6343
+ },
6344
+ "PricingInstallmentPlan": {
6345
+ "name": "PricingInstallmentPlan",
6346
+ "importPath": "@vtex/faststore/components",
6347
+ "editor": {
6348
+ "label": "Installment Plan",
6349
+ "category": "commerce"
6350
+ },
6351
+ "schema": {},
6352
+ "guideline": "Renders a single plan row inside PricingInstallmentPlans; nest PricingInstallmentsForPlan inside it to list every installment tier instead of just the best one. Must be a descendant of PricingInstallmentPlans.",
6353
+ "docPath": "src/matter/pricing/pricing.md"
6354
+ },
6355
+ "PricingInstallmentsForPlan": {
6356
+ "name": "PricingInstallmentsForPlan",
6357
+ "importPath": "@vtex/faststore/components",
6358
+ "editor": {
6359
+ "label": "Installments For Plan",
6360
+ "category": "commerce"
6361
+ },
6362
+ "schema": {},
6363
+ "guideline": "Iterates every installment tier (1x, 2x, … Nx) of the enclosing plan; must be a descendant of PricingInstallmentPlan.",
6364
+ "docPath": "src/matter/pricing/pricing.md"
6365
+ },
6366
+ "PricingPaymentMethodsTrigger": {
5281
6367
  "name": "PricingPaymentMethodsTrigger",
5282
6368
  "importPath": "@vtex/faststore/components",
5283
6369
  "editor": {
@@ -5797,7 +6883,7 @@
5797
6883
  "ProductShelfRoot": {
5798
6884
  "name": "ProductShelfRoot",
5799
6885
  "importPath": "@vtex/faststore/components",
5800
- "fragment": "\n fragment ProductShelfData on Query {\n products(first: 12, orderBy: { field: RELEVANCE, direction: DESC }) {\n edges {\n node {\n id\n title\n slug\n images(first: 1) {\n edges {\n node {\n url\n altText\n }\n }\n }\n variants(first: 1) {\n edges {\n node {\n availableForSale\n quantityAvailable\n price {\n amount\n currencyCode\n }\n compareAtPrice {\n amount\n currencyCode\n }\n sellers {\n isDefault\n offer {\n price {\n amount\n currencyCode\n }\n listPrice {\n amount\n currencyCode\n }\n spotPrice {\n amount\n currencyCode\n }\n tax {\n amount\n currencyCode\n }\n taxPercentage\n availableQuantity\n }\n }\n }\n }\n }\n }\n }\n totalCount\n }\n }\n",
6886
+ "fragment": "\n fragment ProductShelfData on Query {\n products(first: 12, orderBy: { field: RELEVANCE, direction: DESC }) {\n edges {\n node {\n id\n title\n slug\n routeSlug\n images(first: 1) {\n edges {\n node {\n url\n altText\n }\n }\n }\n variants(first: 1) {\n edges {\n node {\n availableForSale\n quantityAvailable\n price {\n amount\n currencyCode\n }\n compareAtPrice {\n amount\n currencyCode\n }\n sellers {\n isDefault\n offer {\n price {\n amount\n currencyCode\n }\n listPrice {\n amount\n currencyCode\n }\n spotPrice {\n amount\n currencyCode\n }\n tax {\n amount\n currencyCode\n }\n taxPercentage\n availableQuantity\n }\n }\n }\n }\n }\n }\n }\n totalCount\n }\n }\n",
5801
6887
  "fetchStrategy": "lazy",
5802
6888
  "skeleton": "ProductShelfSkeleton",
5803
6889
  "editor": {
@@ -6072,6 +7158,117 @@
6072
7158
  "guideline": "The \"I don't know my postal code\" escape hatch, pointing at a postal-code lookup service. Renders nothing until a destination is set, so a store without a lookup service composes it and simply gets no link rather than a dead one. Its text comes from authored content or its children. Must be inside a RegionModalController dialog.",
6073
7159
  "docPath": "src/matter/region/region.md"
6074
7160
  },
7161
+ "SaveCard": {
7162
+ "name": "SaveCard",
7163
+ "importPath": "@vtex/faststore/components",
7164
+ "fragment": "\n fragment SaveCardData on Query {\n clientPreferences {\n __typename\n id\n savePersonalData\n }\n }\n",
7165
+ "fetchStrategy": "reactive",
7166
+ "requiresContext": [
7167
+ "payment",
7168
+ "session"
7169
+ ],
7170
+ "actions": {
7171
+ "payment": [
7172
+ "saveCard"
7173
+ ]
7174
+ },
7175
+ "editor": {
7176
+ "label": "Save Card",
7177
+ "category": "commerce"
7178
+ },
7179
+ "schema": {
7180
+ "label": {
7181
+ "type": "string",
7182
+ "default": "Save this card for next time",
7183
+ "label": "Toggle label"
7184
+ },
7185
+ "nicknameLabel": {
7186
+ "type": "string",
7187
+ "default": "Card nickname",
7188
+ "label": "Nickname field label"
7189
+ },
7190
+ "nicknamePlaceholder": {
7191
+ "type": "string",
7192
+ "label": "Nickname field placeholder"
7193
+ },
7194
+ "consentNoticeLabel": {
7195
+ "type": "string",
7196
+ "default": "Checking this also lets us store your personal data for future purchases.",
7197
+ "label": "Consent notice label"
7198
+ },
7199
+ "disabled": {
7200
+ "type": "boolean",
7201
+ "default": false,
7202
+ "label": "Disabled"
7203
+ }
7204
+ },
7205
+ "guideline": "Opt-in save-card control for authenticated shoppers only: off by default; checking it writes the draft save-card flag/label AND grants the broader save-personal-data consent ($actions.payment.saveCard(true)); unchecking clears only the draft flag and never revokes that consent (see save-card-control.md Decision 1). The nickname field appears only while checked. Must be inside both a PaymentSectionRoot/PaymentSectionController (T5) and a SessionRoot — self-gates to null while the session is loading or the shopper is not logged in. Renders no card data; the flag and label are folded into the card object by CardEntry/SavedCards at submit time.",
7206
+ "docPath": "src/matter/save-card/save-card.md"
7207
+ },
7208
+ "SavedCards": {
7209
+ "name": "SavedCards",
7210
+ "importPath": "@vtex/faststore/components",
7211
+ "fragment": "\n fragment SavedCardsListData on Query {\n payment {\n __typename\n id\n savedCards {\n __typename\n id\n accountId\n methodId\n bin\n }\n }\n }\n",
7212
+ "fetchStrategy": "reactive",
7213
+ "requiresContext": "payment",
7214
+ "providesContext": "saved-card",
7215
+ "editor": {
7216
+ "label": "Saved Cards",
7217
+ "category": "commerce"
7218
+ },
7219
+ "schema": {
7220
+ "legend": {
7221
+ "type": "string",
7222
+ "default": "Saved cards",
7223
+ "label": "Legend"
7224
+ }
7225
+ },
7226
+ "guideline": "Radio list of the shopper's saved cards (network, last four, label); expired cards render present but disabled, never selectable. Place a SavedCardOption inside as the per-card template, itself wrapping a SavedCardCvvField so the shopper can complete payment with a stored card — omitting the CVV field means a shopper can select a card but never pay with it. Picking a row dispatches the payment method selection by methodId and accountId only, never a card number or BIN, plus the inline selection error (role=\"alert\") if the server rejects it. \"Use a new card\" is CardEntry composed as a sibling, not a control inside this list. Renders one container div and no chrome of its own; always carries a loading/empty/ready state hook. Must be inside a PaymentSectionRoot or PaymentSectionController. See saved-cards.md.",
7227
+ "docPath": "src/matter/saved-cards/saved-cards.md"
7228
+ },
7229
+ "SavedCardOption": {
7230
+ "name": "SavedCardOption",
7231
+ "importPath": "@vtex/faststore/components",
7232
+ "fragment": "\n fragment SavedCardOptionData on Query {\n payment {\n savedCards {\n __typename\n id\n accountId\n methodId\n network\n lastFourDigits\n bin\n label\n expired\n cvvRequired\n }\n }\n }\n",
7233
+ "fetchStrategy": "reactive-list-item",
7234
+ "requiresContext": "saved-card",
7235
+ "providesContext": "saved-card-data",
7236
+ "editor": {
7237
+ "label": "Saved Card Option",
7238
+ "category": "commerce"
7239
+ },
7240
+ "schema": {},
7241
+ "guideline": "One saved card as a radio row: network, masked last four, and its label when set; disabled when expired. Place a SavedCardCvvField inside so the CVV appears once this row is selected. Must be inside SavedCards.",
7242
+ "docPath": "src/matter/saved-cards/saved-cards.md"
7243
+ },
7244
+ "SavedCardCvvField": {
7245
+ "name": "SavedCardCvvField",
7246
+ "importPath": "@vtex/faststore/components",
7247
+ "requiresContext": "saved-card-data",
7248
+ "actions": {
7249
+ "payment": [
7250
+ "sendPayments"
7251
+ ]
7252
+ },
7253
+ "editor": {
7254
+ "label": "Saved Card CVV Field",
7255
+ "category": "commerce"
7256
+ },
7257
+ "schema": {
7258
+ "securityCodeLabel": {
7259
+ "type": "string",
7260
+ "default": "Security code",
7261
+ "label": "Security code label"
7262
+ },
7263
+ "securityCodeDescription": {
7264
+ "type": "string",
7265
+ "default": "The 3-4 digit number on your card",
7266
+ "label": "Security code description"
7267
+ }
7268
+ },
7269
+ "guideline": "The CVV re-entry field for its saved card row; renders nothing until that row is selected and requires a CVV. Registers the direct-to-gateway submission for the saved-card path on selection — the CVV never transits our backend, only the gateway leg's userErrors return. Must be inside SavedCardOption.",
7270
+ "docPath": "src/matter/saved-cards/saved-cards.md"
7271
+ },
6075
7272
  "SessionRoot": {
6076
7273
  "name": "SessionRoot",
6077
7274
  "importPath": "@vtex/faststore/components",
@@ -6108,328 +7305,245 @@
6108
7305
  "guideline": "Declarative gate: renders its children only when the current session state is one of the values in `when` (e.g. {\"when\":[\"identified\",\"loggedIn\"]}), else renders nothing. Use it in page or layout JSON to show or hide an identity subtree by state without writing the gate into a component. Must be inside SessionRoot, which may be hosted by the page or by its layout.",
6109
7306
  "docPath": "src/matter/session/session.md"
6110
7307
  },
6111
- "ShippingAddressRoot": {
6112
- "name": "ShippingAddressRoot",
7308
+ "ShippingAddressFieldset": {
7309
+ "name": "ShippingAddressFieldset",
6113
7310
  "importPath": "@vtex/faststore/components",
6114
- "fragment": "\n fragment ShippingAddressData on Query {\n shipping {\n __typename\n id\n address {\n __typename\n id\n recipientName\n postalCode\n country\n street\n number\n complement\n neighborhood\n city\n state\n }\n savedAddresses {\n __typename\n id\n recipientName\n postalCode\n country\n street\n number\n complement\n neighborhood\n city\n state\n }\n }\n clientProfile {\n __typename\n firstName\n lastName\n }\n }\n",
7311
+ "fragment": "\n fragment ShippingAddressFieldsetData on Query {\n shipping {\n __typename\n id\n address {\n __typename\n id\n recipientName\n postalCode\n country\n street\n number\n complement\n neighborhood\n city\n state\n }\n }\n clientProfile {\n __typename\n id\n firstName\n lastName\n }\n }\n",
6115
7312
  "fetchStrategy": "reactive",
6116
- "providesContext": "shipping-address",
7313
+ "skeleton": "ShippingAddressFieldsetSkeleton",
6117
7314
  "actions": {
6118
7315
  "shipping": [
6119
7316
  "setAddress"
6120
7317
  ]
6121
7318
  },
7319
+ "requiresContext": "form",
7320
+ "providesContext": "shipping-address",
6122
7321
  "editor": {
6123
- "label": "Shipping Address Root",
6124
- "category": "content"
7322
+ "label": "Shipping Address Fieldset",
7323
+ "category": "commerce"
6125
7324
  },
6126
7325
  "schema": {
6127
7326
  "defaultCountry": {
6128
7327
  "type": "string",
6129
7328
  "default": "BRA",
6130
7329
  "label": "Default country (ISO-3)"
7330
+ },
7331
+ "skeletonCount": {
7332
+ "type": "number",
7333
+ "default": 9,
7334
+ "label": "Skeleton rows"
7335
+ },
7336
+ "loadingLabel": {
7337
+ "type": "string",
7338
+ "default": "Loading your delivery address",
7339
+ "label": "Loading announcement"
7340
+ },
7341
+ "loadedLabel": {
7342
+ "type": "string",
7343
+ "default": "Your delivery address is ready",
7344
+ "label": "Loaded announcement"
7345
+ },
7346
+ "groupLabel": {
7347
+ "type": "string",
7348
+ "default": "Your delivery address",
7349
+ "label": "Accessible group name"
6131
7350
  }
6132
7351
  },
6133
- "guideline": "Country-adaptive single-address delivery form; batches all fields and writes once via shipping.setAddress. See shipping-address.md.",
7352
+ "guideline": "Composable delivery-address entity: registers under \"shippingAddress\" with the enclosing FormRoot and dispatches shipping.setAddress only when the shopper changed something. Compose the nine ShippingAddress*Control parts inside it; place FormSubmit/FormEnterSubmit/FormError as siblings of the fieldset, not inside it — this fieldset renders no submit or error part of its own. The Controls mount only once the address has resolved, with skeletonCount placeholder rows in their place until then — set it to the number of Controls composed, or the form jumps by the difference. Style the announcement sr-only. groupLabel names the group as its accessible name; blank emits no aria-label, and a composed FieldsetLegend wins over it. See shipping-address.md.",
6134
7353
  "docPath": "src/matter/shipping-address/shipping-address.md"
6135
7354
  },
6136
7355
  "ShippingAddressRecipientNameControl": {
6137
7356
  "name": "ShippingAddressRecipientNameControl",
6138
7357
  "importPath": "@vtex/faststore/components",
6139
7358
  "requiresContext": "shipping-address",
7359
+ "providesContext": "field",
6140
7360
  "editor": {
6141
7361
  "label": "Recipient Name Control",
6142
7362
  "category": "action"
6143
7363
  },
6144
- "schema": {},
6145
- "guideline": "Recipient-name input field; required for submit. Must be a descendant of ShippingAddressRoot.",
7364
+ "schema": {
7365
+ "label": {
7366
+ "type": "string",
7367
+ "label": "Field label"
7368
+ },
7369
+ "placeholder": {
7370
+ "type": "string",
7371
+ "label": "Placeholder"
7372
+ }
7373
+ },
7374
+ "guideline": "Recipient-name input field; required for submit. ",
6146
7375
  "docPath": "src/matter/shipping-address/shipping-address.md"
6147
7376
  },
6148
7377
  "ShippingAddressStreetControl": {
6149
7378
  "name": "ShippingAddressStreetControl",
6150
7379
  "importPath": "@vtex/faststore/components",
6151
7380
  "requiresContext": "shipping-address",
7381
+ "providesContext": "field",
6152
7382
  "editor": {
6153
7383
  "label": "Street Control",
6154
7384
  "category": "action"
6155
7385
  },
6156
- "schema": {},
6157
- "guideline": "Street name input field. Must be a descendant of ShippingAddressRoot.",
7386
+ "schema": {
7387
+ "label": {
7388
+ "type": "string",
7389
+ "label": "Field label"
7390
+ },
7391
+ "placeholder": {
7392
+ "type": "string",
7393
+ "label": "Placeholder"
7394
+ }
7395
+ },
7396
+ "guideline": "Street name input field. ",
6158
7397
  "docPath": "src/matter/shipping-address/shipping-address.md"
6159
7398
  },
6160
7399
  "ShippingAddressNumberControl": {
6161
7400
  "name": "ShippingAddressNumberControl",
6162
7401
  "importPath": "@vtex/faststore/components",
6163
7402
  "requiresContext": "shipping-address",
7403
+ "providesContext": "field",
6164
7404
  "editor": {
6165
7405
  "label": "Number Control",
6166
7406
  "category": "action"
6167
7407
  },
6168
- "schema": {},
6169
- "guideline": "Street number input field. Must be a descendant of ShippingAddressRoot.",
7408
+ "schema": {
7409
+ "label": {
7410
+ "type": "string",
7411
+ "label": "Field label"
7412
+ },
7413
+ "placeholder": {
7414
+ "type": "string",
7415
+ "label": "Placeholder"
7416
+ }
7417
+ },
7418
+ "guideline": "Street number input field. ",
6170
7419
  "docPath": "src/matter/shipping-address/shipping-address.md"
6171
7420
  },
6172
7421
  "ShippingAddressCityControl": {
6173
7422
  "name": "ShippingAddressCityControl",
6174
7423
  "importPath": "@vtex/faststore/components",
6175
7424
  "requiresContext": "shipping-address",
7425
+ "providesContext": "field",
6176
7426
  "editor": {
6177
7427
  "label": "City Control",
6178
7428
  "category": "action"
6179
7429
  },
6180
- "schema": {},
6181
- "guideline": "City name input field. Must be a descendant of ShippingAddressRoot.",
7430
+ "schema": {
7431
+ "label": {
7432
+ "type": "string",
7433
+ "label": "Field label"
7434
+ },
7435
+ "placeholder": {
7436
+ "type": "string",
7437
+ "label": "Placeholder"
7438
+ }
7439
+ },
7440
+ "guideline": "City name input field. ",
6182
7441
  "docPath": "src/matter/shipping-address/shipping-address.md"
6183
7442
  },
6184
7443
  "ShippingAddressStateControl": {
6185
7444
  "name": "ShippingAddressStateControl",
6186
7445
  "importPath": "@vtex/faststore/components",
6187
7446
  "requiresContext": "shipping-address",
7447
+ "providesContext": "field",
6188
7448
  "editor": {
6189
7449
  "label": "State Control",
6190
7450
  "category": "action"
6191
7451
  },
6192
- "schema": {},
6193
- "guideline": "State/province input field. Must be a descendant of ShippingAddressRoot.",
6194
- "docPath": "src/matter/shipping-address/shipping-address.md"
6195
- },
6196
- "ShippingAddressPostalCodeControl": {
6197
- "name": "ShippingAddressPostalCodeControl",
6198
- "importPath": "@vtex/faststore/components",
6199
- "requiresContext": "shipping-address",
6200
- "editor": {
6201
- "label": "Postal Code Control",
6202
- "category": "action"
6203
- },
6204
- "schema": {},
6205
- "guideline": "Postal code input field. Must be a descendant of ShippingAddressRoot.",
6206
- "docPath": "src/matter/shipping-address/shipping-address.md"
6207
- },
6208
- "ShippingAddressComplementControl": {
6209
- "name": "ShippingAddressComplementControl",
6210
- "importPath": "@vtex/faststore/components",
6211
- "requiresContext": "shipping-address",
6212
- "editor": {
6213
- "label": "Complement Control",
6214
- "category": "action"
6215
- },
6216
- "schema": {},
6217
- "guideline": "Complement (apartment, suite, etc.) input field. Must be a descendant of ShippingAddressRoot.",
6218
- "docPath": "src/matter/shipping-address/shipping-address.md"
6219
- },
6220
- "ShippingAddressNeighborhoodControl": {
6221
- "name": "ShippingAddressNeighborhoodControl",
6222
- "importPath": "@vtex/faststore/components",
6223
- "requiresContext": "shipping-address",
6224
- "editor": {
6225
- "label": "Neighborhood Control",
6226
- "category": "action"
6227
- },
6228
- "schema": {},
6229
- "guideline": "Neighborhood (bairro) input field; shown only for countries that have this field (BR in v1). Must be a descendant of ShippingAddressRoot.",
6230
- "docPath": "src/matter/shipping-address/shipping-address.md"
6231
- },
6232
- "ShippingAddressCountryControl": {
6233
- "name": "ShippingAddressCountryControl",
6234
- "importPath": "@vtex/faststore/components",
6235
- "requiresContext": "shipping-address",
6236
- "editor": {
6237
- "label": "Country Control",
6238
- "category": "action"
6239
- },
6240
7452
  "schema": {
6241
7453
  "label": {
6242
7454
  "type": "string",
6243
- "default": "país",
6244
7455
  "label": "Field label"
6245
- }
6246
- },
6247
- "guideline": "Country selector; lists only countries with an implemented descriptor. Must be a descendant of ShippingAddressRoot.",
6248
- "docPath": "src/matter/shipping-address/shipping-address.md"
6249
- },
6250
- "ShippingAddressSavedList": {
6251
- "name": "ShippingAddressSavedList",
6252
- "importPath": "@vtex/faststore/components",
6253
- "requiresContext": "shipping-address",
6254
- "editor": {
6255
- "label": "Saved Address List",
6256
- "category": "commerce"
6257
- },
6258
- "schema": {},
6259
- "guideline": "List of saved addresses for logged-in shoppers; renders only if savedAddresses is non-empty. Must be a descendant of ShippingAddressRoot.",
6260
- "docPath": "src/matter/shipping-address/shipping-address.md"
6261
- },
6262
- "ShippingAddressSavedOption": {
6263
- "name": "ShippingAddressSavedOption",
6264
- "importPath": "@vtex/faststore/components",
6265
- "requiresContext": "shipping-address",
6266
- "editor": {
6267
- "label": "Saved Address Option",
6268
- "category": "commerce"
6269
- },
6270
- "schema": {
6271
- "id": {
7456
+ },
7457
+ "placeholder": {
6272
7458
  "type": "string",
6273
- "label": "Saved address ID"
7459
+ "label": "Placeholder"
6274
7460
  }
6275
7461
  },
6276
- "guideline": "A single saved address option; renders its address via the same AddressSummary particle (through its own AddressSummaryRoot) used by ShippingAddressSelectedSummary, so both share one formatting implementation. Must be a descendant of ShippingAddressSavedList.",
7462
+ "guideline": "State/province input field. ",
6277
7463
  "docPath": "src/matter/shipping-address/shipping-address.md"
6278
7464
  },
6279
- "ShippingAddressSubmit": {
6280
- "name": "ShippingAddressSubmit",
7465
+ "ShippingAddressPostalCodeControl": {
7466
+ "name": "ShippingAddressPostalCodeControl",
6281
7467
  "importPath": "@vtex/faststore/components",
6282
7468
  "requiresContext": "shipping-address",
7469
+ "providesContext": "field",
6283
7470
  "editor": {
6284
- "label": "Shipping Address Submit",
7471
+ "label": "Postal Code Control",
6285
7472
  "category": "action"
6286
7473
  },
6287
7474
  "schema": {
6288
7475
  "label": {
6289
7476
  "type": "string",
6290
- "default": "salvar endereço",
6291
- "label": "Button label"
7477
+ "label": "Field label"
6292
7478
  },
6293
- "pendingLabel": {
7479
+ "placeholder": {
6294
7480
  "type": "string",
6295
- "default": "salvando...",
6296
- "label": "Pending label"
7481
+ "label": "Placeholder"
6297
7482
  }
6298
7483
  },
6299
- "guideline": "Submit button; dispatches the batched address write. Disabled until recipient name is non-blank. Must be a descendant of ShippingAddressRoot.",
7484
+ "guideline": "Postal code input field. ",
6300
7485
  "docPath": "src/matter/shipping-address/shipping-address.md"
6301
7486
  },
6302
- "ShippingAddressError": {
6303
- "name": "ShippingAddressError",
6304
- "importPath": "@vtex/faststore/components",
6305
- "requiresContext": "shipping-address",
6306
- "editor": {
6307
- "label": "Shipping Address Error",
6308
- "category": "commerce"
6309
- },
6310
- "schema": {},
6311
- "guideline": "Error banner; shows domain validation errors inline or a generic upstream-error state. Must be a descendant of ShippingAddressRoot.",
6312
- "docPath": "src/matter/shipping-address/shipping-address.md"
6313
- },
6314
- "ShippingAddressSavedAddressDrawerController": {
6315
- "name": "ShippingAddressSavedAddressDrawerController",
6316
- "importPath": "@vtex/faststore/components",
6317
- "requiresContext": "shipping-address",
6318
- "editor": {
6319
- "label": "Saved Address Drawer Controller",
6320
- "category": "action"
6321
- },
6322
- "schema": {},
6323
- "guideline": "Wraps a single DrawerRoot child (the saved-address selection drawer) and makes it controlled by the shipping-address drawer state: open state and blocked-dismissal-while-submitting are handled here, so do not set raw open/onOpenChange on the wrapped DrawerRoot. Compose as the parent of DrawerRoot, with the drawer trigger and popup as DrawerRoot descendants, same pattern as CartOpenOnAdd wrapping the mini-cart DrawerRoot. Must be inside ShippingAddressRoot.",
6324
- "docPath": "src/matter/shipping-address/shipping-address.md"
6325
- },
6326
- "ShippingAddressSavedAddressSubmit": {
6327
- "name": "ShippingAddressSavedAddressSubmit",
7487
+ "ShippingAddressComplementControl": {
7488
+ "name": "ShippingAddressComplementControl",
6328
7489
  "importPath": "@vtex/faststore/components",
6329
7490
  "requiresContext": "shipping-address",
7491
+ "providesContext": "field",
6330
7492
  "editor": {
6331
- "label": "Saved Address Submit",
7493
+ "label": "Complement Control",
6332
7494
  "category": "action"
6333
7495
  },
6334
7496
  "schema": {
6335
7497
  "label": {
6336
7498
  "type": "string",
6337
- "default": "selecionar",
6338
- "label": "Button label"
7499
+ "label": "Field label"
6339
7500
  },
6340
- "pendingLabel": {
7501
+ "placeholder": {
6341
7502
  "type": "string",
6342
- "default": "selecionando...",
6343
- "label": "Pending label"
7503
+ "label": "Placeholder"
6344
7504
  }
6345
7505
  },
6346
- "guideline": "The drawer's \"selecionar\" submit button; independent submitting state from the main form's Submit (Decision 7); no-ops when the selected saved address is already the current one (Decision 8). Must be inside the saved-address drawer's DrawerPopup and inside ShippingAddressRoot.",
7506
+ "guideline": "Complement (apartment, suite, etc.) input field. ",
6347
7507
  "docPath": "src/matter/shipping-address/shipping-address.md"
6348
7508
  },
6349
- "ShippingAddressSelectedSummary": {
6350
- "name": "ShippingAddressSelectedSummary",
6351
- "importPath": "@vtex/faststore/components",
6352
- "requiresContext": "shipping-address",
6353
- "providesContext": "address-summary",
6354
- "editor": {
6355
- "label": "Selected Address Summary",
6356
- "category": "commerce"
6357
- },
6358
- "schema": {},
6359
- "guideline": "Provides the current delivery address to the generic AddressSummary particle via AddressSummaryRoot context, and renders the default AddressSummary when composed with no children. Compose AddressSummaryRecipient / Street / Locality directly to choose the order or drop a line. Self-gates to null when there is no current address yet. Must be a descendant of ShippingAddressRoot.",
6360
- "docPath": "src/matter/shipping-address/shipping-address.md"
6361
- },
6362
- "ShippingAddressEditController": {
6363
- "name": "ShippingAddressEditController",
7509
+ "ShippingAddressNeighborhoodControl": {
7510
+ "name": "ShippingAddressNeighborhoodControl",
6364
7511
  "importPath": "@vtex/faststore/components",
6365
7512
  "requiresContext": "shipping-address",
6366
- "providesContext": "shipping-address-section",
6367
- "editor": {
6368
- "label": "Shipping Address Edit Controller",
6369
- "category": "commerce"
6370
- },
6371
- "schema": {},
6372
- "guideline": "Owns the view/edit toggle for the delivery address section: defaults to view when a current address exists, edit otherwise; switches back to view automatically whenever setAddress succeeds (main form submit or saved-address drawer submit), without ShippingAddressSubmit/ShippingAddressSavedAddressSubmit needing to know about this mode. Compose a ShippingAddressSummaryView holding SelectedSummary + EditButton and a ShippingAddressEditForm holding the form Controls/Submit/Error. Self-contained: it decides from its own data and the shopper's own presses, so no other section opens it and finishing it opens nothing. Must be inside ShippingAddressRoot.",
6373
- "docPath": "src/matter/shipping-address/shipping-address.md"
6374
- },
6375
- "ShippingAddressSummaryView": {
6376
- "name": "ShippingAddressSummaryView",
6377
- "importPath": "@vtex/faststore/components",
6378
- "requiresContext": "shipping-address-section",
6379
- "editor": {
6380
- "label": "Shipping Address Summary View",
6381
- "category": "commerce"
6382
- },
6383
- "schema": {},
6384
- "guideline": "Renders its children only while the delivery section shows the saved-address summary, and nothing while it shows the form. Compose SelectedSummary and a ShippingAddressEditButton inside. Takes no props: which state it gates is which component it is. Must be inside a ShippingAddressEditController.",
6385
- "docPath": "src/matter/shipping-address/shipping-address.md"
6386
- },
6387
- "ShippingAddressEditForm": {
6388
- "name": "ShippingAddressEditForm",
6389
- "importPath": "@vtex/faststore/components",
6390
- "requiresContext": "shipping-address-section",
7513
+ "providesContext": "field",
6391
7514
  "editor": {
6392
- "label": "Shipping Address Edit Form",
6393
- "category": "commerce"
6394
- },
6395
- "schema": {},
6396
- "guideline": "Renders its children only while the delivery section shows the address form, and nothing while it shows the summary. Compose the Controls, Submit and Error parts inside. Must be inside a ShippingAddressEditController.",
6397
- "docPath": "src/matter/shipping-address/shipping-address.md"
6398
- },
6399
- "ShippingAddressEditButton": {
6400
- "name": "ShippingAddressEditButton",
6401
- "importPath": "@vtex/faststore/components",
6402
- "requiresContext": "shipping-address-section",
6403
- "editor": {
6404
- "label": "Shipping Address Edit Button",
7515
+ "label": "Neighborhood Control",
6405
7516
  "category": "action"
6406
7517
  },
6407
7518
  "schema": {
6408
7519
  "label": {
6409
7520
  "type": "string",
6410
- "default": "editar",
6411
- "label": "Button label"
7521
+ "label": "Field label"
7522
+ },
7523
+ "placeholder": {
7524
+ "type": "string",
7525
+ "label": "Placeholder"
6412
7526
  }
6413
7527
  },
6414
- "guideline": "CTA that switches the view/edit mode to edit. Typically placed inside a ShippingAddressSummaryView, next to SelectedSummary. Must be inside ShippingAddressEditController.",
7528
+ "guideline": "Neighborhood (bairro) input field; shown only for countries that have this field (BR in v1). ",
6415
7529
  "docPath": "src/matter/shipping-address/shipping-address.md"
6416
7530
  },
6417
- "ShippingAddressCancelButton": {
6418
- "name": "ShippingAddressCancelButton",
7531
+ "ShippingAddressCountryControl": {
7532
+ "name": "ShippingAddressCountryControl",
6419
7533
  "importPath": "@vtex/faststore/components",
6420
- "requiresContext": "shipping-address-section",
7534
+ "requiresContext": "shipping-address",
7535
+ "providesContext": "field",
6421
7536
  "editor": {
6422
- "label": "Shipping Address Cancel Button",
7537
+ "label": "Country Control",
6423
7538
  "category": "action"
6424
7539
  },
6425
7540
  "schema": {
6426
7541
  "label": {
6427
7542
  "type": "string",
6428
- "default": "cancelar",
6429
- "label": "Button label"
7543
+ "label": "Field label"
6430
7544
  }
6431
7545
  },
6432
- "guideline": "Returns the delivery section to its summary without saving. Place it inside a ShippingAddressEditForm so a shopper who opened the form has a way back that does not depend on a successful write. Must be inside ShippingAddressEditController.",
7546
+ "guideline": "Country selector; lists only countries with an implemented descriptor. Must be a descendant of ShippingAddressFieldset, which provides the shipping-address context this control requires. Recomposable: compose Field.Label, FieldSelect.Root and Field.Error as children, in any order; a childless composition keeps the default label-select-error order.",
6433
7547
  "docPath": "src/matter/shipping-address/shipping-address.md"
6434
7548
  },
6435
7549
  "ShippingSimulatorRoot": {