@vtex/faststore 0.0.5 → 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 (232) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/dist/actions.json +181 -0
  3. package/dist/catalog.json +1543 -495
  4. package/dist/client.d.ts +2 -1
  5. package/dist/client.js +2 -1
  6. package/dist/components.d.ts +28 -7
  7. package/dist/components.js +31 -12
  8. package/dist/docs/access-code-sign-in.md +1 -1
  9. package/dist/docs/address-summary.md +24 -3
  10. package/dist/docs/alert-dialog.md +204 -0
  11. package/dist/docs/billing-address.md +284 -0
  12. package/dist/docs/card-entry.md +250 -0
  13. package/dist/docs/cardholder-document.md +142 -0
  14. package/dist/docs/client-preferences-fieldset.md +148 -0
  15. package/dist/docs/client-preferences.md +2 -1
  16. package/dist/docs/client-profile-fieldset.md +184 -0
  17. package/dist/docs/client-profile.md +1 -1
  18. package/dist/docs/document-field.md +58 -4
  19. package/dist/docs/field.md +317 -0
  20. package/dist/docs/form.md +307 -0
  21. package/dist/docs/identity-edit.md +6 -6
  22. package/dist/docs/identity-summary.md +5 -5
  23. package/dist/docs/installments.md +248 -0
  24. package/dist/docs/my-account-profile.md +1 -0
  25. package/dist/docs/order-placed-payment-summary.md +138 -0
  26. package/dist/docs/payment-method-badges.md +232 -0
  27. package/dist/docs/payment-methods.md +1 -0
  28. package/dist/docs/payment.md +218 -0
  29. package/dist/docs/phone-field.md +58 -4
  30. package/dist/docs/place-order.md +157 -0
  31. package/dist/docs/save-card.md +186 -0
  32. package/dist/docs/saved-cards.md +218 -0
  33. package/dist/docs/select.md +465 -0
  34. package/dist/docs/shipping-address.md +110 -258
  35. package/dist/index.d.ts +4 -1
  36. package/dist/internal/client.d.ts +3 -1
  37. package/dist/internal/client.js +3 -1
  38. package/dist/matter/access-code-sign-in/access-code-sign-in.js +9 -8
  39. package/dist/matter/access-code-sign-in/access-code-sign-in.js.map +1 -1
  40. package/dist/matter/billing-address/billing-address.d.ts +165 -0
  41. package/dist/matter/billing-address/billing-address.js +408 -0
  42. package/dist/matter/billing-address/billing-address.js.map +1 -0
  43. package/dist/matter/card-entry/card-capture.d.ts +25 -0
  44. package/dist/matter/card-entry/card-capture.js +25 -0
  45. package/dist/matter/card-entry/card-capture.js.map +1 -0
  46. package/dist/matter/card-entry/card-entry.d.ts +120 -0
  47. package/dist/matter/card-entry/card-entry.js +832 -0
  48. package/dist/matter/card-entry/card-entry.js.map +1 -0
  49. package/dist/matter/cardholder-document/cardholder-document.d.ts +45 -0
  50. package/dist/matter/cardholder-document/cardholder-document.js +70 -0
  51. package/dist/matter/cardholder-document/cardholder-document.js.map +1 -0
  52. package/dist/matter/client-preferences/client-preferences-fieldset.d.ts +77 -0
  53. package/dist/matter/client-preferences/client-preferences-fieldset.js +299 -0
  54. package/dist/matter/client-preferences/client-preferences-fieldset.js.map +1 -0
  55. package/dist/matter/client-preferences/client-preferences.d.ts +3 -5
  56. package/dist/matter/client-preferences/client-preferences.js +6 -6
  57. package/dist/matter/client-preferences/client-preferences.js.map +1 -1
  58. package/dist/matter/client-profile/client-profile.d.ts +4 -6
  59. package/dist/matter/client-profile/client-profile.js +9 -6
  60. package/dist/matter/client-profile/client-profile.js.map +1 -1
  61. package/dist/matter/client-profile-form/client-profile-fieldset.d.ts +119 -0
  62. package/dist/matter/client-profile-form/client-profile-fieldset.js +488 -0
  63. package/dist/matter/client-profile-form/client-profile-fieldset.js.map +1 -0
  64. package/dist/matter/identity-edit/identity-edit.js +2 -2
  65. package/dist/matter/identity-edit/identity-edit.js.map +1 -1
  66. package/dist/matter/identity-summary/identity-summary.js +2 -2
  67. package/dist/matter/identity-summary/identity-summary.js.map +1 -1
  68. package/dist/matter/installments/installments-select.d.ts +42 -0
  69. package/dist/matter/installments/installments-select.js +167 -0
  70. package/dist/matter/installments/installments-select.js.map +1 -0
  71. package/dist/matter/installments/installments.d.ts +58 -0
  72. package/dist/matter/installments/installments.js +176 -0
  73. package/dist/matter/installments/installments.js.map +1 -0
  74. package/dist/matter/installments/use-installments-selection.d.ts +29 -0
  75. package/dist/matter/installments/use-installments-selection.js +95 -0
  76. package/dist/matter/installments/use-installments-selection.js.map +1 -0
  77. package/dist/matter/my-account-profile/my-account-profile.js +4 -4
  78. package/dist/matter/my-account-profile/my-account-profile.js.map +1 -1
  79. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.d.ts +63 -0
  80. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js +305 -0
  81. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js.map +1 -0
  82. package/dist/matter/payment/payment-card-capture.d.ts +19 -0
  83. package/dist/matter/payment/payment-card-capture.js +129 -0
  84. package/dist/matter/payment/payment-card-capture.js.map +1 -0
  85. package/dist/matter/payment/payment-controller.d.ts +24 -0
  86. package/dist/matter/payment/payment-controller.js +107 -0
  87. package/dist/matter/payment/payment-controller.js.map +1 -0
  88. package/dist/matter/payment/payment-method-badges.d.ts +57 -0
  89. package/dist/matter/payment/payment-method-badges.js +192 -0
  90. package/dist/matter/payment/payment-method-badges.js.map +1 -0
  91. package/dist/matter/payment/payment.d.ts +89 -0
  92. package/dist/matter/payment/payment.js +263 -0
  93. package/dist/matter/payment/payment.js.map +1 -0
  94. package/dist/matter/payment/use-payment-method-selection.d.ts +302 -0
  95. package/dist/matter/payment/use-payment-method-selection.js +458 -0
  96. package/dist/matter/payment/use-payment-method-selection.js.map +1 -0
  97. package/dist/matter/payment/use-payment-submit-gate.d.ts +111 -0
  98. package/dist/matter/payment/use-payment-submit-gate.js +144 -0
  99. package/dist/matter/payment/use-payment-submit-gate.js.map +1 -0
  100. package/dist/matter/place-order/place-order.d.ts +74 -0
  101. package/dist/matter/place-order/place-order.js +379 -0
  102. package/dist/matter/place-order/place-order.js.map +1 -0
  103. package/dist/matter/product-list/product-list.d.ts +1 -0
  104. package/dist/matter/product-list/product-list.js.map +1 -1
  105. package/dist/matter/product-shelf/product-shelf.d.ts +1 -0
  106. package/dist/matter/product-shelf/product-shelf.js +2 -0
  107. package/dist/matter/product-shelf/product-shelf.js.map +1 -1
  108. package/dist/matter/region/region.js +1 -1
  109. package/dist/matter/region/region.js.map +1 -1
  110. package/dist/matter/save-card/save-card.d.ts +49 -0
  111. package/dist/matter/save-card/save-card.js +188 -0
  112. package/dist/matter/save-card/save-card.js.map +1 -0
  113. package/dist/matter/saved-cards/saved-cards.d.ts +79 -0
  114. package/dist/matter/saved-cards/saved-cards.js +387 -0
  115. package/dist/matter/saved-cards/saved-cards.js.map +1 -0
  116. package/dist/matter/shipping-address/country-descriptors.js +20 -10
  117. package/dist/matter/shipping-address/country-descriptors.js.map +1 -1
  118. package/dist/matter/shipping-address/shipping-address.d.ts +113 -174
  119. package/dist/matter/shipping-address/shipping-address.js +480 -791
  120. package/dist/matter/shipping-address/shipping-address.js.map +1 -1
  121. package/dist/matter/variant-selector/variant-selector.js +1 -1
  122. package/dist/particles/address-summary/address-summary.d.ts +24 -0
  123. package/dist/particles/address-summary/address-summary.js +83 -2
  124. package/dist/particles/address-summary/address-summary.js.map +1 -1
  125. package/dist/particles/alert-dialog/alert-dialog.d.ts +68 -0
  126. package/dist/particles/alert-dialog/alert-dialog.js +187 -0
  127. package/dist/particles/alert-dialog/alert-dialog.js.map +1 -0
  128. package/dist/particles/checkbox/checkbox.d.ts +7 -3
  129. package/dist/particles/checkbox/checkbox.js +4 -1
  130. package/dist/particles/checkbox/checkbox.js.map +1 -1
  131. package/dist/particles/document-field/document-field.d.ts +48 -5
  132. package/dist/particles/document-field/document-field.js +189 -32
  133. package/dist/particles/document-field/document-field.js.map +1 -1
  134. package/dist/particles/field/bound-field-registry.js +52 -0
  135. package/dist/particles/field/bound-field-registry.js.map +1 -0
  136. package/dist/particles/field/field.d.ts +116 -0
  137. package/dist/particles/field/field.js +497 -6
  138. package/dist/particles/field/field.js.map +1 -1
  139. package/dist/particles/fieldset/fieldset.js +2 -2
  140. package/dist/particles/fieldset/fieldset.js.map +1 -1
  141. package/dist/particles/form/form.d.ts +104 -0
  142. package/dist/particles/form/form.js +485 -0
  143. package/dist/particles/form/form.js.map +1 -0
  144. package/dist/particles/phone-field/phone-field.d.ts +38 -10
  145. package/dist/particles/phone-field/phone-field.js +183 -39
  146. package/dist/particles/phone-field/phone-field.js.map +1 -1
  147. package/dist/particles/postal-code-field/postal-code-field.js +2 -2
  148. package/dist/particles/postal-code-field/postal-code-field.js.map +1 -1
  149. package/dist/particles/select/field-select.d.ts +43 -0
  150. package/dist/particles/select/field-select.js +150 -0
  151. package/dist/particles/select/field-select.js.map +1 -0
  152. package/dist/particles/select/select.d.ts +2 -0
  153. package/dist/particles/select/select.js.map +1 -1
  154. package/dist/particles/shared/compose-refs.js +21 -0
  155. package/dist/particles/shared/compose-refs.js.map +1 -0
  156. package/dist/schema.graphql +701 -2
  157. package/dist/sdk/actions/analytics-action-provider.d.ts +15 -0
  158. package/dist/sdk/actions/analytics-action-provider.js +19 -0
  159. package/dist/sdk/actions/analytics-action-provider.js.map +1 -0
  160. package/dist/sdk/actions/index.d.ts +3 -1
  161. package/dist/sdk/actions/index.js +3 -1
  162. package/dist/sdk/actions/payment-action-provider.d.ts +22 -0
  163. package/dist/sdk/actions/payment-action-provider.js +26 -0
  164. package/dist/sdk/actions/payment-action-provider.js.map +1 -0
  165. package/dist/sdk/actions/types.d.ts +6 -2
  166. package/dist/sdk/analytics/analytics-destination.d.ts +43 -0
  167. package/dist/sdk/analytics/analytics-destination.js +90 -0
  168. package/dist/sdk/analytics/analytics-destination.js.map +1 -0
  169. package/dist/sdk/analytics/use-analytics-actions.d.ts +57 -0
  170. package/dist/sdk/analytics/use-analytics-actions.js +108 -0
  171. package/dist/sdk/analytics/use-analytics-actions.js.map +1 -0
  172. package/dist/sdk/cart/use-cart-actions.js +1 -1
  173. package/dist/sdk/data/entity-resolution-context.js +31 -0
  174. package/dist/sdk/data/entity-resolution-context.js.map +1 -0
  175. package/dist/sdk/data/entity-subscriber.js +18 -8
  176. package/dist/sdk/data/entity-subscriber.js.map +1 -1
  177. package/dist/sdk/data/index.js +1 -0
  178. package/dist/sdk/data/page-reactive-data-root.d.ts +36 -0
  179. package/dist/sdk/data/page-reactive-data-root.js +4 -2
  180. package/dist/sdk/data/page-reactive-data-root.js.map +1 -1
  181. package/dist/sdk/data/reactive-data-provider.js +7 -3
  182. package/dist/sdk/data/reactive-data-provider.js.map +1 -1
  183. package/dist/sdk/data/reactive-list-item-data-provider.js +12 -4
  184. package/dist/sdk/data/reactive-list-item-data-provider.js.map +1 -1
  185. package/dist/sdk/data/use-reactive-data-settled.js +39 -0
  186. package/dist/sdk/data/use-reactive-data-settled.js.map +1 -0
  187. package/dist/sdk/data/use-reactive-entity.js +5 -1
  188. package/dist/sdk/data/use-reactive-entity.js.map +1 -1
  189. package/dist/sdk/generated/fragment-types.js +2 -0
  190. package/dist/sdk/generated/fragment-types.js.map +1 -1
  191. package/dist/sdk/generated/graphql.js.map +1 -1
  192. package/dist/sdk/i18n/messages/en-US.js +3 -0
  193. package/dist/sdk/i18n/messages/en-US.json +3 -0
  194. package/dist/sdk/i18n/messages/en-US.json.d.ts +3 -0
  195. package/dist/sdk/i18n/messages/es-ES.js +3 -0
  196. package/dist/sdk/i18n/messages/es-ES.json +3 -0
  197. package/dist/sdk/i18n/messages/pt-BR.js +3 -0
  198. package/dist/sdk/i18n/messages/pt-BR.json +3 -0
  199. package/dist/sdk/identity/use-identity-actions.js +3 -2
  200. package/dist/sdk/identity/use-identity-actions.js.map +1 -1
  201. package/dist/sdk/payment/gateway-origin.js +35 -0
  202. package/dist/sdk/payment/gateway-origin.js.map +1 -0
  203. package/dist/sdk/payment/gateway.d.ts +85 -0
  204. package/dist/sdk/payment/gateway.js +183 -0
  205. package/dist/sdk/payment/gateway.js.map +1 -0
  206. package/dist/sdk/payment/operations.d.ts +52 -0
  207. package/dist/sdk/payment/operations.js +223 -0
  208. package/dist/sdk/payment/operations.js.map +1 -0
  209. package/dist/sdk/payment/security-code-mask.js +71 -0
  210. package/dist/sdk/payment/security-code-mask.js.map +1 -0
  211. package/dist/sdk/payment/submission-registry.d.ts +33 -0
  212. package/dist/sdk/payment/submission-registry.js +58 -0
  213. package/dist/sdk/payment/submission-registry.js.map +1 -0
  214. package/dist/sdk/payment/use-payment-actions.d.ts +78 -0
  215. package/dist/sdk/payment/use-payment-actions.js +276 -0
  216. package/dist/sdk/payment/use-payment-actions.js.map +1 -0
  217. package/dist/sdk/payment/use-place-order.d.ts +65 -0
  218. package/dist/sdk/payment/use-place-order.js +640 -0
  219. package/dist/sdk/payment/use-place-order.js.map +1 -0
  220. package/dist/sdk/shipping/use-shipping-actions.js +1 -1
  221. package/dist/utils/loggable-error-name.js +49 -0
  222. package/dist/utils/loggable-error-name.js.map +1 -0
  223. package/dist/utils/resolve-authored-copy.js +18 -0
  224. package/dist/utils/resolve-authored-copy.js.map +1 -0
  225. package/dist/utils/substitute-template.js +33 -0
  226. package/dist/utils/substitute-template.js.map +1 -0
  227. package/package.json +2 -1
  228. package/src/styles/tailwind.css +34 -0
  229. package/dist/docs/client-profile-form.md +0 -192
  230. package/dist/matter/client-profile-form/client-profile-form.d.ts +0 -126
  231. package/dist/matter/client-profile-form/client-profile-form.js +0 -662
  232. 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",
@@ -3298,54 +3675,167 @@
3298
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.",
3299
3676
  "docPath": "src/matter/account-menu/account-menu.md"
3300
3677
  },
3301
- "BreadcrumbRoot": {
3302
- "name": "BreadcrumbRoot",
3678
+ "BillingAddress": {
3679
+ "name": "BillingAddress",
3303
3680
  "importPath": "@vtex/faststore/components",
3304
- "fragment": "\n fragment BreadcrumbData on Query {\n productBySlug(slug: $slug) {\n breadcrumbs {\n name\n url\n position\n }\n }\n }\n",
3681
+ "requiresContext": "payment",
3682
+ "actions": {
3683
+ "payment": [
3684
+ "setBillingAddress"
3685
+ ]
3686
+ },
3305
3687
  "editor": {
3306
- "label": "Breadcrumb Root",
3307
- "category": "navigation"
3688
+ "label": "Billing Address",
3689
+ "category": "commerce"
3308
3690
  },
3309
3691
  "schema": {
3310
- "label": {
3692
+ "sameAsDeliveryLabel": {
3311
3693
  "type": "string",
3312
- "default": "Breadcrumb",
3313
- "label": "Aria Label"
3314
- }
3315
- },
3316
- "guideline": "Root container for breadcrumb navigation; compose as BreadcrumbRoot > BreadcrumbList > [BreadcrumbLink + BreadcrumbSeparator]."
3317
- },
3318
- "BreadcrumbList": {
3319
- "name": "BreadcrumbList",
3320
- "importPath": "@vtex/faststore/components",
3321
- "editor": {
3322
- "label": "Breadcrumb List",
3323
- "category": "navigation"
3324
- },
3325
- "schema": {},
3326
- "guideline": "Ordered list of breadcrumb items; must be a direct child of BreadcrumbRoot."
3327
- },
3328
- "BreadcrumbLink": {
3329
- "name": "BreadcrumbLink",
3330
- "importPath": "@vtex/faststore/components",
3331
- "editor": {
3332
- "label": "Breadcrumb Link",
3333
- "category": "navigation"
3334
- },
3335
- "schema": {},
3336
- "guideline": "Renders the label and link for a breadcrumb item; must be inside BreadcrumbList."
3337
- },
3338
- "BreadcrumbSeparator": {
3339
- "name": "BreadcrumbSeparator",
3340
- "importPath": "@vtex/faststore/components",
3341
- "editor": {
3342
- "label": "Breadcrumb Separator",
3343
- "category": "navigation"
3344
- },
3345
- "schema": {},
3346
- "guideline": "Decorative separator rendered between breadcrumb items; must be inside BreadcrumbList."
3347
- },
3348
- "BuyButtonRoot": {
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"
3824
+ },
3825
+ "schema": {},
3826
+ "guideline": "Renders the label and link for a breadcrumb item; must be inside BreadcrumbList."
3827
+ },
3828
+ "BreadcrumbSeparator": {
3829
+ "name": "BreadcrumbSeparator",
3830
+ "importPath": "@vtex/faststore/components",
3831
+ "editor": {
3832
+ "label": "Breadcrumb Separator",
3833
+ "category": "navigation"
3834
+ },
3835
+ "schema": {},
3836
+ "guideline": "Decorative separator rendered between breadcrumb items; must be inside BreadcrumbList."
3837
+ },
3838
+ "BuyButtonRoot": {
3349
3839
  "name": "BuyButtonRoot",
3350
3840
  "importPath": "@vtex/faststore/components",
3351
3841
  "fragment": "\n fragment BuyButtonData on Query {\n productBySlug(slug: $slug) {\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 id\n sku\n availableForSale\n sellers {\n id\n isDefault\n offer {\n price { amount currencyCode }\n listPrice { amount currencyCode }\n }\n }\n }\n }\n }\n }\n }\n",
@@ -3391,6 +3881,144 @@
3391
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.",
3392
3882
  "docPath": "src/matter/buy-button/buy-button.md"
3393
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
+ },
3394
4022
  "CartRoot": {
3395
4023
  "name": "CartRoot",
3396
4024
  "importPath": "@vtex/faststore/components",
@@ -4205,12 +4833,93 @@
4205
4833
  },
4206
4834
  "docPath": "src/matter/cart-totalizer/cart-totalizer.md"
4207
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
+ },
4208
4917
  "ClientPreferencesRoot": {
4209
4918
  "name": "ClientPreferencesRoot",
4210
4919
  "importPath": "@vtex/faststore/components",
4211
4920
  "fragment": "\n fragment ClientPreferencesData on Query {\n clientPreferences {\n __typename\n id\n optinNewsLetter\n savePersonalData\n }\n }\n",
4212
4921
  "fetchStrategy": "reactive",
4213
- "providesContext": "client-preferences",
4922
+ "providesContext": "client-preferences-toggle",
4214
4923
  "requiresContext": "session",
4215
4924
  "editor": {
4216
4925
  "label": "Client Preferences Root",
@@ -4223,7 +4932,7 @@
4223
4932
  "NewsletterOptInControl": {
4224
4933
  "name": "NewsletterOptInControl",
4225
4934
  "importPath": "@vtex/faststore/components",
4226
- "requiresContext": "client-preferences",
4935
+ "requiresContext": "client-preferences-toggle",
4227
4936
  "actions": {
4228
4937
  "identity": [
4229
4938
  "clientPreferencesUpdate"
@@ -4245,7 +4954,7 @@
4245
4954
  "SavePersonalDataOptInControl": {
4246
4955
  "name": "SavePersonalDataOptInControl",
4247
4956
  "importPath": "@vtex/faststore/components",
4248
- "requiresContext": "client-preferences",
4957
+ "requiresContext": "client-preferences-toggle",
4249
4958
  "actions": {
4250
4959
  "identity": [
4251
4960
  "clientPreferencesUpdate"
@@ -4304,7 +5013,10 @@
4304
5013
  "label": "Country (US or BR)"
4305
5014
  },
4306
5015
  "requirement": {
4307
- "type": "string",
5016
+ "type": [
5017
+ "mandatory",
5018
+ "optional"
5019
+ ],
4308
5020
  "default": "mandatory",
4309
5021
  "label": "Requirement"
4310
5022
  },
@@ -4322,22 +5034,25 @@
4322
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.",
4323
5035
  "docPath": "src/matter/client-profile/client-profile.md"
4324
5036
  },
4325
- "ClientProfileFormRoot": {
4326
- "name": "ClientProfileFormRoot",
5037
+ "ClientProfileFieldset": {
5038
+ "name": "ClientProfileFieldset",
4327
5039
  "importPath": "@vtex/faststore/components",
4328
- "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",
4329
5041
  "fetchStrategy": "reactive",
4330
- "requiresContext": "session",
4331
- "providesContext": "client-profile-form",
5042
+ "skeleton": "ClientProfileFieldsetSkeleton",
5043
+ "requiresContext": [
5044
+ "form",
5045
+ "session"
5046
+ ],
5047
+ "providesContext": "client-profile-fieldset",
4332
5048
  "actions": {
4333
5049
  "identity": [
4334
- "clientProfileUpdate",
4335
- "clientPreferencesUpdate"
5050
+ "clientProfileUpdate"
4336
5051
  ]
4337
5052
  },
4338
5053
  "editor": {
4339
- "label": "Client Profile Form Root",
4340
- "category": "action"
5054
+ "label": "Client Profile Fieldset",
5055
+ "category": "identity"
4341
5056
  },
4342
5057
  "schema": {
4343
5058
  "country": {
@@ -4348,205 +5063,143 @@
4348
5063
  "documentType": {
4349
5064
  "type": "string",
4350
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"
4351
5086
  }
4352
5087
  },
4353
- "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.",
4354
- "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"
4355
5090
  },
4356
- "ClientProfileFormFieldset": {
4357
- "name": "ClientProfileFormFieldset",
5091
+ "ClientProfileFirstNameControl": {
5092
+ "name": "ClientProfileFirstNameControl",
4358
5093
  "importPath": "@vtex/faststore/components",
4359
- "requiresContext": "client-profile-form",
5094
+ "requiresContext": "client-profile-fieldset",
5095
+ "providesContext": "field",
4360
5096
  "editor": {
4361
- "label": "Client Profile Form Fieldset",
4362
- "category": "layout"
5097
+ "label": "Client Profile First Name Control",
5098
+ "category": "identity"
4363
5099
  },
4364
5100
  "schema": {
4365
- "legend": {
5101
+ "label": {
4366
5102
  "type": "string",
4367
- "label": "Legend"
5103
+ "label": "Label"
4368
5104
  },
4369
- "section": {
5105
+ "placeholder": {
4370
5106
  "type": "string",
4371
- "label": "Section name (data-fs hook)"
5107
+ "label": "Placeholder"
4372
5108
  }
4373
5109
  },
4374
- "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.",
4375
- "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"
4376
5112
  },
4377
- "ClientProfileFormEmailField": {
4378
- "name": "ClientProfileFormEmailField",
5113
+ "ClientProfileLastNameControl": {
5114
+ "name": "ClientProfileLastNameControl",
4379
5115
  "importPath": "@vtex/faststore/components",
4380
- "requiresContext": "client-profile-form",
5116
+ "requiresContext": "client-profile-fieldset",
5117
+ "providesContext": "field",
4381
5118
  "editor": {
4382
- "label": "Client Profile Email Field",
4383
- "category": "action"
5119
+ "label": "Client Profile Last Name Control",
5120
+ "category": "identity"
4384
5121
  },
4385
5122
  "schema": {
4386
5123
  "label": {
4387
5124
  "type": "string",
4388
- "default": "Email",
4389
5125
  "label": "Label"
4390
- }
4391
- },
4392
- "guideline": "Read-only email display, seeded from the profile. Must be inside ClientProfileForm.Root.",
4393
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
4394
- },
4395
- "ClientProfileFormFirstNameField": {
4396
- "name": "ClientProfileFormFirstNameField",
4397
- "importPath": "@vtex/faststore/components",
4398
- "requiresContext": "client-profile-form",
4399
- "editor": {
4400
- "label": "Client Profile First Name Field",
4401
- "category": "action"
4402
- },
4403
- "schema": {
4404
- "label": {
5126
+ },
5127
+ "placeholder": {
4405
5128
  "type": "string",
4406
- "default": "First name",
4407
- "label": "Label"
5129
+ "label": "Placeholder"
4408
5130
  }
4409
5131
  },
4410
- "guideline": "First-name text field bound to the form draft. Must be inside ClientProfileForm.Root.",
4411
- "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"
4412
5134
  },
4413
- "ClientProfileFormLastNameField": {
4414
- "name": "ClientProfileFormLastNameField",
5135
+ "ClientProfileFieldsetPhoneControl": {
5136
+ "name": "ClientProfileFieldsetPhoneControl",
4415
5137
  "importPath": "@vtex/faststore/components",
4416
- "requiresContext": "client-profile-form",
5138
+ "requiresContext": "client-profile-fieldset",
5139
+ "providesContext": [
5140
+ "field",
5141
+ "phone-field"
5142
+ ],
4417
5143
  "editor": {
4418
- "label": "Client Profile Last Name Field",
4419
- "category": "action"
5144
+ "label": "Client Profile Fieldset Phone Control",
5145
+ "category": "identity"
4420
5146
  },
4421
5147
  "schema": {
4422
5148
  "label": {
4423
5149
  "type": "string",
4424
- "default": "Last name",
4425
5150
  "label": "Label"
4426
- }
4427
- },
4428
- "guideline": "Last-name text field bound to the form draft. Must be inside ClientProfileForm.Root.",
4429
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
4430
- },
4431
- "ClientProfileFormPhoneField": {
4432
- "name": "ClientProfileFormPhoneField",
4433
- "importPath": "@vtex/faststore/components",
4434
- "requiresContext": "client-profile-form",
4435
- "editor": {
4436
- "label": "Client Profile Phone Field",
4437
- "category": "action"
4438
- },
4439
- "schema": {
4440
- "label": {
5151
+ },
5152
+ "placeholder": {
4441
5153
  "type": "string",
4442
- "default": "Phone number",
4443
- "label": "Label"
4444
- }
4445
- },
4446
- "guideline": "Country-masked phone field (country from Root); format-validated on Save. Must be inside ClientProfileForm.Root.",
4447
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
4448
- },
4449
- "ClientProfileFormDocumentField": {
4450
- "name": "ClientProfileFormDocumentField",
4451
- "importPath": "@vtex/faststore/components",
4452
- "requiresContext": "client-profile-form",
4453
- "editor": {
4454
- "label": "Client Profile Document Field",
4455
- "category": "action"
4456
- },
4457
- "schema": {
4458
- "label": {
5154
+ "label": "Placeholder"
5155
+ },
5156
+ "requirement": {
5157
+ "type": [
5158
+ "mandatory",
5159
+ "optional"
5160
+ ],
5161
+ "label": "Requirement"
5162
+ },
5163
+ "errorInvalid": {
4459
5164
  "type": "string",
4460
- "default": "CPF",
4461
- "label": "Label"
4462
- }
4463
- },
4464
- "guideline": "Tax-document field; self-gates on Root.documentType and check-digit-validates on Save. Must be inside ClientProfileForm.Root.",
4465
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
4466
- },
4467
- "ClientProfileFormNewsletterCheckbox": {
4468
- "name": "ClientProfileFormNewsletterCheckbox",
4469
- "importPath": "@vtex/faststore/components",
4470
- "requiresContext": "client-profile-form",
4471
- "editor": {
4472
- "label": "Client Profile Newsletter Checkbox",
4473
- "category": "action"
4474
- },
4475
- "schema": {
4476
- "label": {
5165
+ "label": "Invalid error message"
5166
+ },
5167
+ "errorRequired": {
4477
5168
  "type": "string",
4478
- "default": "Email me with news and offers",
4479
- "label": "Label"
5169
+ "label": "Required error message"
4480
5170
  }
4481
5171
  },
4482
- "guideline": "Newsletter opt-in checkbox bound to the form draft. Must be inside ClientProfileForm.Root.",
4483
- "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"
4484
5174
  },
4485
- "ClientProfileFormSavePersonalDataCheckbox": {
4486
- "name": "ClientProfileFormSavePersonalDataCheckbox",
5175
+ "ClientProfileDocumentControl": {
5176
+ "name": "ClientProfileDocumentControl",
4487
5177
  "importPath": "@vtex/faststore/components",
4488
- "requiresContext": "client-profile-form",
5178
+ "requiresContext": "client-profile-fieldset",
5179
+ "providesContext": [
5180
+ "field",
5181
+ "document-field"
5182
+ ],
4489
5183
  "editor": {
4490
- "label": "Client Profile Save-Personal-Data Checkbox",
4491
- "category": "action"
5184
+ "label": "Client Profile Document Control",
5185
+ "category": "identity"
4492
5186
  },
4493
5187
  "schema": {
4494
5188
  "label": {
4495
5189
  "type": "string",
4496
- "default": "Save my information for next time",
4497
5190
  "label": "Label"
4498
- }
4499
- },
4500
- "guideline": "Save-personal-data opt-in checkbox bound to the form draft. Must be inside ClientProfileForm.Root.",
4501
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
4502
- },
4503
- "ClientProfileFormError": {
4504
- "name": "ClientProfileFormError",
4505
- "importPath": "@vtex/faststore/components",
4506
- "requiresContext": "client-profile-form",
4507
- "editor": {
4508
- "label": "Client Profile Form Error",
4509
- "category": "content"
4510
- },
4511
- "schema": {},
4512
- "guideline": "Renders the inline server error (role=\"alert\") from the last Save, or nothing. Must be inside ClientProfileForm.Root.",
4513
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
4514
- },
4515
- "ClientProfileFormConfirmation": {
4516
- "name": "ClientProfileFormConfirmation",
4517
- "importPath": "@vtex/faststore/components",
4518
- "requiresContext": "client-profile-form",
4519
- "editor": {
4520
- "label": "Client Profile Form Confirmation",
4521
- "category": "content"
4522
- },
4523
- "schema": {
4524
- "message": {
5191
+ },
5192
+ "placeholder": {
4525
5193
  "type": "string",
4526
- "default": "Your information has been saved.",
4527
- "label": "Confirmation message"
4528
- }
4529
- },
4530
- "guideline": "Renders the success confirmation (an <output>) after a Save with no errors, cleared on the next edit. Must be inside ClientProfileForm.Root.",
4531
- "docPath": "src/matter/client-profile-form/client-profile-form.md"
4532
- },
4533
- "ClientProfileFormSubmitButton": {
4534
- "name": "ClientProfileFormSubmitButton",
4535
- "importPath": "@vtex/faststore/components",
4536
- "requiresContext": "client-profile-form",
4537
- "editor": {
4538
- "label": "Client Profile Form Submit Button",
4539
- "category": "action"
4540
- },
4541
- "schema": {
4542
- "label": {
5194
+ "label": "Placeholder"
5195
+ },
5196
+ "errorMessage": {
4543
5197
  "type": "string",
4544
- "default": "Save and continue",
4545
- "label": "Button label"
5198
+ "label": "Error message"
4546
5199
  }
4547
5200
  },
4548
- "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.",
4549
- "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"
4550
5203
  },
4551
5204
  "DeliveryOptionsAccordion": {
4552
5205
  "name": "DeliveryOptionsAccordion",
@@ -4770,7 +5423,7 @@
4770
5423
  "category": "commerce"
4771
5424
  },
4772
5425
  "schema": {},
4773
- "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.",
4774
5427
  "docPath": "src/matter/identity-edit/identity-edit.md"
4775
5428
  },
4776
5429
  "IdentitySummaryView": {
@@ -4794,7 +5447,7 @@
4794
5447
  "category": "commerce"
4795
5448
  },
4796
5449
  "schema": {},
4797
- "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.",
4798
5451
  "docPath": "src/matter/identity-edit/identity-edit.md"
4799
5452
  },
4800
5453
  "IdentityEditButton": {
@@ -4856,7 +5509,7 @@
4856
5509
  "label": "Sign-out error message"
4857
5510
  }
4858
5511
  },
4859
- "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.",
4860
5513
  "docPath": "src/matter/identity-summary/identity-summary.md"
4861
5514
  },
4862
5515
  "IdentitySummarySelectedSummary": {
@@ -4977,6 +5630,91 @@
4977
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.",
4978
5631
  "docPath": "src/matter/identity-summary/identity-summary.md"
4979
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
+ },
4980
5718
  "MyAccountProfileRoot": {
4981
5719
  "name": "MyAccountProfileRoot",
4982
5720
  "importPath": "@vtex/faststore/components",
@@ -5001,10 +5739,12 @@
5001
5739
  },
5002
5740
  "saveFailedMessage": {
5003
5741
  "type": "string",
5742
+ "default": "Unable to save your profile. Please try again.",
5004
5743
  "label": "Save failure message"
5005
5744
  },
5006
5745
  "savedMessage": {
5007
5746
  "type": "string",
5747
+ "default": "Your profile has been saved.",
5008
5748
  "label": "Save success message"
5009
5749
  }
5010
5750
  },
@@ -5247,94 +5987,374 @@
5247
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.",
5248
5988
  "docPath": "src/matter/my-account-profile/my-account-profile.md"
5249
5989
  },
5250
- "PricingRoot": {
5251
- "name": "PricingRoot",
5990
+ "OrderPlacedPaymentSummary": {
5991
+ "name": "OrderPlacedPaymentSummary",
5252
5992
  "importPath": "@vtex/faststore/components",
5253
- "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",
5254
- "fetchStrategy": "lazy",
5255
- "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",
5256
5995
  "editor": {
5257
- "label": "Pricing",
5996
+ "label": "Order Placed Payment Summary",
5258
5997
  "category": "commerce"
5259
5998
  },
5260
5999
  "schema": {
5261
- "selectedVariantId": {
6000
+ "lastFourTemplate": {
5262
6001
  "type": "string",
5263
- "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"
5264
6024
  }
5265
6025
  },
5266
- "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.",
5267
- "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"
5268
6028
  },
5269
- "PricingSellingPrice": {
5270
- "name": "PricingSellingPrice",
6029
+ "PaymentSectionController": {
6030
+ "name": "PaymentSectionController",
5271
6031
  "importPath": "@vtex/faststore/components",
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
+ ]
6042
+ },
6043
+ "providesContext": [
6044
+ "payment",
6045
+ "card-capture"
6046
+ ],
5272
6047
  "editor": {
5273
- "label": "Selling Price",
6048
+ "label": "Payment Section Controller",
5274
6049
  "category": "commerce"
5275
6050
  },
5276
- "schema": {},
5277
- "guideline": "Displays the current selling price; must be a descendant of PricingRoot.",
5278
- "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"
5279
6063
  },
5280
- "PricingListPrice": {
5281
- "name": "PricingListPrice",
6064
+ "PaymentMethodBadges": {
6065
+ "name": "PaymentMethodBadges",
5282
6066
  "importPath": "@vtex/faststore/components",
6067
+ "requiresContext": "payment",
5283
6068
  "editor": {
5284
- "label": "List Price",
6069
+ "label": "Payment Method Badges",
5285
6070
  "category": "commerce"
5286
6071
  },
5287
- "schema": {},
5288
- "guideline": "Displays the original (strikethrough) list price; only renders when a discount exists. Must be a descendant of PricingRoot.",
5289
- "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"
5290
6080
  },
5291
- "PricingSpotPrice": {
5292
- "name": "PricingSpotPrice",
6081
+ "AcceptedPaymentMethodBadges": {
6082
+ "name": "AcceptedPaymentMethodBadges",
5293
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",
5294
6086
  "editor": {
5295
- "label": "Spot Price",
6087
+ "label": "Accepted Payment Method Badges",
5296
6088
  "category": "commerce"
5297
6089
  },
5298
- "schema": {},
5299
- "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.",
5300
- "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"
5301
6098
  },
5302
- "PricingInstallments": {
5303
- "name": "PricingInstallments",
6099
+ "PaymentSectionRoot": {
6100
+ "name": "PaymentSectionRoot",
5304
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
+ ],
5305
6117
  "editor": {
5306
- "label": "Installments",
6118
+ "label": "Payment Section",
5307
6119
  "category": "commerce"
5308
6120
  },
5309
- "schema": {},
5310
- "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.",
5311
- "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"
5312
6133
  },
5313
- "PricingInstallmentPlans": {
5314
- "name": "PricingInstallmentPlans",
6134
+ "PaymentMethodList": {
6135
+ "name": "PaymentMethodList",
5315
6136
  "importPath": "@vtex/faststore/components",
6137
+ "requiresContext": "payment",
5316
6138
  "editor": {
5317
- "label": "Installment Plans",
6139
+ "label": "Payment Method List",
5318
6140
  "category": "commerce"
5319
6141
  },
5320
- "schema": {},
5321
- "guideline": "Renders one row per payment method; use PricingInstallments instead when only the single best plan is needed. Must be a descendant of PricingRoot.",
5322
- "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"
5323
6156
  },
5324
- "PricingInstallmentPlan": {
5325
- "name": "PricingInstallmentPlan",
6157
+ "PlaceOrder": {
6158
+ "name": "PlaceOrder",
5326
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",
5327
6172
  "editor": {
5328
- "label": "Installment Plan",
6173
+ "label": "Place Order",
5329
6174
  "category": "commerce"
5330
6175
  },
5331
- "schema": {},
5332
- "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.",
5333
- "docPath": "src/matter/pricing/pricing.md"
5334
- },
5335
- "PricingInstallmentsForPlan": {
5336
- "name": "PricingInstallmentsForPlan",
5337
- "importPath": "@vtex/faststore/components",
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",
5338
6358
  "editor": {
5339
6359
  "label": "Installments For Plan",
5340
6360
  "category": "commerce"
@@ -5863,7 +6883,7 @@
5863
6883
  "ProductShelfRoot": {
5864
6884
  "name": "ProductShelfRoot",
5865
6885
  "importPath": "@vtex/faststore/components",
5866
- "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",
5867
6887
  "fetchStrategy": "lazy",
5868
6888
  "skeleton": "ProductShelfSkeleton",
5869
6889
  "editor": {
@@ -6138,6 +7158,117 @@
6138
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.",
6139
7159
  "docPath": "src/matter/region/region.md"
6140
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
+ },
6141
7272
  "SessionRoot": {
6142
7273
  "name": "SessionRoot",
6143
7274
  "importPath": "@vtex/faststore/components",
@@ -6174,328 +7305,245 @@
6174
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.",
6175
7306
  "docPath": "src/matter/session/session.md"
6176
7307
  },
6177
- "ShippingAddressRoot": {
6178
- "name": "ShippingAddressRoot",
7308
+ "ShippingAddressFieldset": {
7309
+ "name": "ShippingAddressFieldset",
6179
7310
  "importPath": "@vtex/faststore/components",
6180
- "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",
6181
7312
  "fetchStrategy": "reactive",
6182
- "providesContext": "shipping-address",
7313
+ "skeleton": "ShippingAddressFieldsetSkeleton",
6183
7314
  "actions": {
6184
7315
  "shipping": [
6185
7316
  "setAddress"
6186
7317
  ]
6187
7318
  },
7319
+ "requiresContext": "form",
7320
+ "providesContext": "shipping-address",
6188
7321
  "editor": {
6189
- "label": "Shipping Address Root",
6190
- "category": "content"
7322
+ "label": "Shipping Address Fieldset",
7323
+ "category": "commerce"
6191
7324
  },
6192
7325
  "schema": {
6193
7326
  "defaultCountry": {
6194
7327
  "type": "string",
6195
7328
  "default": "BRA",
6196
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"
6197
7350
  }
6198
7351
  },
6199
- "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.",
6200
7353
  "docPath": "src/matter/shipping-address/shipping-address.md"
6201
7354
  },
6202
7355
  "ShippingAddressRecipientNameControl": {
6203
7356
  "name": "ShippingAddressRecipientNameControl",
6204
7357
  "importPath": "@vtex/faststore/components",
6205
7358
  "requiresContext": "shipping-address",
7359
+ "providesContext": "field",
6206
7360
  "editor": {
6207
7361
  "label": "Recipient Name Control",
6208
7362
  "category": "action"
6209
7363
  },
6210
- "schema": {},
6211
- "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. ",
6212
7375
  "docPath": "src/matter/shipping-address/shipping-address.md"
6213
7376
  },
6214
7377
  "ShippingAddressStreetControl": {
6215
7378
  "name": "ShippingAddressStreetControl",
6216
7379
  "importPath": "@vtex/faststore/components",
6217
7380
  "requiresContext": "shipping-address",
7381
+ "providesContext": "field",
6218
7382
  "editor": {
6219
7383
  "label": "Street Control",
6220
7384
  "category": "action"
6221
7385
  },
6222
- "schema": {},
6223
- "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. ",
6224
7397
  "docPath": "src/matter/shipping-address/shipping-address.md"
6225
7398
  },
6226
7399
  "ShippingAddressNumberControl": {
6227
7400
  "name": "ShippingAddressNumberControl",
6228
7401
  "importPath": "@vtex/faststore/components",
6229
7402
  "requiresContext": "shipping-address",
7403
+ "providesContext": "field",
6230
7404
  "editor": {
6231
7405
  "label": "Number Control",
6232
7406
  "category": "action"
6233
7407
  },
6234
- "schema": {},
6235
- "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. ",
6236
7419
  "docPath": "src/matter/shipping-address/shipping-address.md"
6237
7420
  },
6238
7421
  "ShippingAddressCityControl": {
6239
7422
  "name": "ShippingAddressCityControl",
6240
7423
  "importPath": "@vtex/faststore/components",
6241
7424
  "requiresContext": "shipping-address",
7425
+ "providesContext": "field",
6242
7426
  "editor": {
6243
7427
  "label": "City Control",
6244
7428
  "category": "action"
6245
7429
  },
6246
- "schema": {},
6247
- "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. ",
6248
7441
  "docPath": "src/matter/shipping-address/shipping-address.md"
6249
7442
  },
6250
7443
  "ShippingAddressStateControl": {
6251
7444
  "name": "ShippingAddressStateControl",
6252
7445
  "importPath": "@vtex/faststore/components",
6253
7446
  "requiresContext": "shipping-address",
7447
+ "providesContext": "field",
6254
7448
  "editor": {
6255
7449
  "label": "State Control",
6256
7450
  "category": "action"
6257
7451
  },
6258
- "schema": {},
6259
- "guideline": "State/province input field. Must be a descendant of ShippingAddressRoot.",
6260
- "docPath": "src/matter/shipping-address/shipping-address.md"
6261
- },
6262
- "ShippingAddressPostalCodeControl": {
6263
- "name": "ShippingAddressPostalCodeControl",
6264
- "importPath": "@vtex/faststore/components",
6265
- "requiresContext": "shipping-address",
6266
- "editor": {
6267
- "label": "Postal Code Control",
6268
- "category": "action"
6269
- },
6270
- "schema": {},
6271
- "guideline": "Postal code input field. Must be a descendant of ShippingAddressRoot.",
6272
- "docPath": "src/matter/shipping-address/shipping-address.md"
6273
- },
6274
- "ShippingAddressComplementControl": {
6275
- "name": "ShippingAddressComplementControl",
6276
- "importPath": "@vtex/faststore/components",
6277
- "requiresContext": "shipping-address",
6278
- "editor": {
6279
- "label": "Complement Control",
6280
- "category": "action"
6281
- },
6282
- "schema": {},
6283
- "guideline": "Complement (apartment, suite, etc.) input field. Must be a descendant of ShippingAddressRoot.",
6284
- "docPath": "src/matter/shipping-address/shipping-address.md"
6285
- },
6286
- "ShippingAddressNeighborhoodControl": {
6287
- "name": "ShippingAddressNeighborhoodControl",
6288
- "importPath": "@vtex/faststore/components",
6289
- "requiresContext": "shipping-address",
6290
- "editor": {
6291
- "label": "Neighborhood Control",
6292
- "category": "action"
6293
- },
6294
- "schema": {},
6295
- "guideline": "Neighborhood (bairro) input field; shown only for countries that have this field (BR in v1). Must be a descendant of ShippingAddressRoot.",
6296
- "docPath": "src/matter/shipping-address/shipping-address.md"
6297
- },
6298
- "ShippingAddressCountryControl": {
6299
- "name": "ShippingAddressCountryControl",
6300
- "importPath": "@vtex/faststore/components",
6301
- "requiresContext": "shipping-address",
6302
- "editor": {
6303
- "label": "Country Control",
6304
- "category": "action"
6305
- },
6306
7452
  "schema": {
6307
7453
  "label": {
6308
7454
  "type": "string",
6309
- "default": "país",
6310
7455
  "label": "Field label"
6311
- }
6312
- },
6313
- "guideline": "Country selector; lists only countries with an implemented descriptor. Must be a descendant of ShippingAddressRoot.",
6314
- "docPath": "src/matter/shipping-address/shipping-address.md"
6315
- },
6316
- "ShippingAddressSavedList": {
6317
- "name": "ShippingAddressSavedList",
6318
- "importPath": "@vtex/faststore/components",
6319
- "requiresContext": "shipping-address",
6320
- "editor": {
6321
- "label": "Saved Address List",
6322
- "category": "commerce"
6323
- },
6324
- "schema": {},
6325
- "guideline": "List of saved addresses for logged-in shoppers; renders only if savedAddresses is non-empty. Must be a descendant of ShippingAddressRoot.",
6326
- "docPath": "src/matter/shipping-address/shipping-address.md"
6327
- },
6328
- "ShippingAddressSavedOption": {
6329
- "name": "ShippingAddressSavedOption",
6330
- "importPath": "@vtex/faststore/components",
6331
- "requiresContext": "shipping-address",
6332
- "editor": {
6333
- "label": "Saved Address Option",
6334
- "category": "commerce"
6335
- },
6336
- "schema": {
6337
- "id": {
7456
+ },
7457
+ "placeholder": {
6338
7458
  "type": "string",
6339
- "label": "Saved address ID"
7459
+ "label": "Placeholder"
6340
7460
  }
6341
7461
  },
6342
- "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. ",
6343
7463
  "docPath": "src/matter/shipping-address/shipping-address.md"
6344
7464
  },
6345
- "ShippingAddressSubmit": {
6346
- "name": "ShippingAddressSubmit",
7465
+ "ShippingAddressPostalCodeControl": {
7466
+ "name": "ShippingAddressPostalCodeControl",
6347
7467
  "importPath": "@vtex/faststore/components",
6348
7468
  "requiresContext": "shipping-address",
7469
+ "providesContext": "field",
6349
7470
  "editor": {
6350
- "label": "Shipping Address Submit",
7471
+ "label": "Postal Code Control",
6351
7472
  "category": "action"
6352
7473
  },
6353
7474
  "schema": {
6354
7475
  "label": {
6355
7476
  "type": "string",
6356
- "default": "salvar endereço",
6357
- "label": "Button label"
7477
+ "label": "Field label"
6358
7478
  },
6359
- "pendingLabel": {
7479
+ "placeholder": {
6360
7480
  "type": "string",
6361
- "default": "salvando...",
6362
- "label": "Pending label"
7481
+ "label": "Placeholder"
6363
7482
  }
6364
7483
  },
6365
- "guideline": "Submit button; dispatches the batched address write. Disabled until recipient name is non-blank. Must be a descendant of ShippingAddressRoot.",
6366
- "docPath": "src/matter/shipping-address/shipping-address.md"
6367
- },
6368
- "ShippingAddressError": {
6369
- "name": "ShippingAddressError",
6370
- "importPath": "@vtex/faststore/components",
6371
- "requiresContext": "shipping-address",
6372
- "editor": {
6373
- "label": "Shipping Address Error",
6374
- "category": "commerce"
6375
- },
6376
- "schema": {},
6377
- "guideline": "Error banner; shows domain validation errors inline or a generic upstream-error state. Must be a descendant of ShippingAddressRoot.",
6378
- "docPath": "src/matter/shipping-address/shipping-address.md"
6379
- },
6380
- "ShippingAddressSavedAddressDrawerController": {
6381
- "name": "ShippingAddressSavedAddressDrawerController",
6382
- "importPath": "@vtex/faststore/components",
6383
- "requiresContext": "shipping-address",
6384
- "editor": {
6385
- "label": "Saved Address Drawer Controller",
6386
- "category": "action"
6387
- },
6388
- "schema": {},
6389
- "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.",
7484
+ "guideline": "Postal code input field. ",
6390
7485
  "docPath": "src/matter/shipping-address/shipping-address.md"
6391
7486
  },
6392
- "ShippingAddressSavedAddressSubmit": {
6393
- "name": "ShippingAddressSavedAddressSubmit",
7487
+ "ShippingAddressComplementControl": {
7488
+ "name": "ShippingAddressComplementControl",
6394
7489
  "importPath": "@vtex/faststore/components",
6395
7490
  "requiresContext": "shipping-address",
7491
+ "providesContext": "field",
6396
7492
  "editor": {
6397
- "label": "Saved Address Submit",
7493
+ "label": "Complement Control",
6398
7494
  "category": "action"
6399
7495
  },
6400
7496
  "schema": {
6401
7497
  "label": {
6402
7498
  "type": "string",
6403
- "default": "selecionar",
6404
- "label": "Button label"
7499
+ "label": "Field label"
6405
7500
  },
6406
- "pendingLabel": {
7501
+ "placeholder": {
6407
7502
  "type": "string",
6408
- "default": "selecionando...",
6409
- "label": "Pending label"
7503
+ "label": "Placeholder"
6410
7504
  }
6411
7505
  },
6412
- "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. ",
6413
7507
  "docPath": "src/matter/shipping-address/shipping-address.md"
6414
7508
  },
6415
- "ShippingAddressSelectedSummary": {
6416
- "name": "ShippingAddressSelectedSummary",
6417
- "importPath": "@vtex/faststore/components",
6418
- "requiresContext": "shipping-address",
6419
- "providesContext": "address-summary",
6420
- "editor": {
6421
- "label": "Selected Address Summary",
6422
- "category": "commerce"
6423
- },
6424
- "schema": {},
6425
- "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.",
6426
- "docPath": "src/matter/shipping-address/shipping-address.md"
6427
- },
6428
- "ShippingAddressEditController": {
6429
- "name": "ShippingAddressEditController",
7509
+ "ShippingAddressNeighborhoodControl": {
7510
+ "name": "ShippingAddressNeighborhoodControl",
6430
7511
  "importPath": "@vtex/faststore/components",
6431
7512
  "requiresContext": "shipping-address",
6432
- "providesContext": "shipping-address-section",
7513
+ "providesContext": "field",
6433
7514
  "editor": {
6434
- "label": "Shipping Address Edit Controller",
6435
- "category": "commerce"
6436
- },
6437
- "schema": {},
6438
- "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.",
6439
- "docPath": "src/matter/shipping-address/shipping-address.md"
6440
- },
6441
- "ShippingAddressSummaryView": {
6442
- "name": "ShippingAddressSummaryView",
6443
- "importPath": "@vtex/faststore/components",
6444
- "requiresContext": "shipping-address-section",
6445
- "editor": {
6446
- "label": "Shipping Address Summary View",
6447
- "category": "commerce"
6448
- },
6449
- "schema": {},
6450
- "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.",
6451
- "docPath": "src/matter/shipping-address/shipping-address.md"
6452
- },
6453
- "ShippingAddressEditForm": {
6454
- "name": "ShippingAddressEditForm",
6455
- "importPath": "@vtex/faststore/components",
6456
- "requiresContext": "shipping-address-section",
6457
- "editor": {
6458
- "label": "Shipping Address Edit Form",
6459
- "category": "commerce"
6460
- },
6461
- "schema": {},
6462
- "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.",
6463
- "docPath": "src/matter/shipping-address/shipping-address.md"
6464
- },
6465
- "ShippingAddressEditButton": {
6466
- "name": "ShippingAddressEditButton",
6467
- "importPath": "@vtex/faststore/components",
6468
- "requiresContext": "shipping-address-section",
6469
- "editor": {
6470
- "label": "Shipping Address Edit Button",
7515
+ "label": "Neighborhood Control",
6471
7516
  "category": "action"
6472
7517
  },
6473
7518
  "schema": {
6474
7519
  "label": {
6475
7520
  "type": "string",
6476
- "default": "editar",
6477
- "label": "Button label"
7521
+ "label": "Field label"
7522
+ },
7523
+ "placeholder": {
7524
+ "type": "string",
7525
+ "label": "Placeholder"
6478
7526
  }
6479
7527
  },
6480
- "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). ",
6481
7529
  "docPath": "src/matter/shipping-address/shipping-address.md"
6482
7530
  },
6483
- "ShippingAddressCancelButton": {
6484
- "name": "ShippingAddressCancelButton",
7531
+ "ShippingAddressCountryControl": {
7532
+ "name": "ShippingAddressCountryControl",
6485
7533
  "importPath": "@vtex/faststore/components",
6486
- "requiresContext": "shipping-address-section",
7534
+ "requiresContext": "shipping-address",
7535
+ "providesContext": "field",
6487
7536
  "editor": {
6488
- "label": "Shipping Address Cancel Button",
7537
+ "label": "Country Control",
6489
7538
  "category": "action"
6490
7539
  },
6491
7540
  "schema": {
6492
7541
  "label": {
6493
7542
  "type": "string",
6494
- "default": "cancelar",
6495
- "label": "Button label"
7543
+ "label": "Field label"
6496
7544
  }
6497
7545
  },
6498
- "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.",
6499
7547
  "docPath": "src/matter/shipping-address/shipping-address.md"
6500
7548
  },
6501
7549
  "ShippingSimulatorRoot": {