@vtex/faststore 0.0.5 → 0.0.7

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 (326) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/dist/actions.json +181 -0
  3. package/dist/catalog.json +1673 -484
  4. package/dist/cli/UnreachableCaseError-Crd168Vu.js +10 -0
  5. package/dist/cli/UnreachableCaseError-Crd168Vu.js.map +1 -0
  6. package/dist/cli/cacheControl-CEojH_TM.js +158 -0
  7. package/dist/cli/cacheControl-CEojH_TM.js.map +1 -0
  8. package/dist/cli/cachePolicy-m2vASMRW.js +26 -0
  9. package/dist/cli/cachePolicy-m2vASMRW.js.map +1 -0
  10. package/dist/cli/computeCoreSchemaHash-DPJZj-qJ.js +10 -0
  11. package/dist/cli/computeCoreSchemaHash-DPJZj-qJ.js.map +1 -0
  12. package/dist/cli/default-BCQHcwbL.js +253 -0
  13. package/dist/cli/default-BCQHcwbL.js.map +1 -0
  14. package/dist/cli/disableSuggestions-yO9UqiWn.js +21 -0
  15. package/dist/cli/disableSuggestions-yO9UqiWn.js.map +1 -0
  16. package/dist/cli/dist-C1JhdHfo.js +2001 -0
  17. package/dist/cli/dist-C1JhdHfo.js.map +1 -0
  18. package/dist/cli/graphql-DG9thCDG.js +14589 -0
  19. package/dist/cli/graphql-DG9thCDG.js.map +1 -0
  20. package/dist/cli/index.d.ts +350 -0
  21. package/dist/cli/index.js +35047 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/cli/index.min-BsIHDfFK.js +613 -0
  24. package/dist/cli/index.min-BsIHDfFK.js.map +1 -0
  25. package/dist/cli/inlineTrace-uLgOJ3TH.js +52 -0
  26. package/dist/cli/inlineTrace-uLgOJ3TH.js.map +1 -0
  27. package/dist/cli/internalPlugin-DnuwN4_4.js +11 -0
  28. package/dist/cli/internalPlugin-DnuwN4_4.js.map +1 -0
  29. package/dist/cli/packageVersion-DQAnIEil.js +6 -0
  30. package/dist/cli/packageVersion-DQAnIEil.js.map +1 -0
  31. package/dist/cli/rolldown-runtime-BMI-E3GI.js +44 -0
  32. package/dist/cli/schemaIsSubgraph-DoGh3OYj.js +17 -0
  33. package/dist/cli/schemaIsSubgraph-DoGh3OYj.js.map +1 -0
  34. package/dist/cli/schemaReporting-K-me-3-v.js +199 -0
  35. package/dist/cli/schemaReporting-K-me-3-v.js.map +1 -0
  36. package/dist/cli/server-runtime.js +49859 -0
  37. package/dist/cli/server-runtime.js.map +1 -0
  38. package/dist/cli/traceTreeBuilder-BIcV2U7b.js +9118 -0
  39. package/dist/cli/traceTreeBuilder-BIcV2U7b.js.map +1 -0
  40. package/dist/cli/usageReporting-Bpl8vSZX.js +10201 -0
  41. package/dist/cli/usageReporting-Bpl8vSZX.js.map +1 -0
  42. package/dist/cli/v4-CBhFvC49.js +42 -0
  43. package/dist/cli/v4-CBhFvC49.js.map +1 -0
  44. package/dist/client.d.ts +2 -1
  45. package/dist/client.js +2 -1
  46. package/dist/components.d.ts +32 -9
  47. package/dist/components.js +35 -14
  48. package/dist/content-types.json +93 -0
  49. package/dist/core/dist/define-component.d.ts +37 -0
  50. package/dist/core/dist/index.d.ts +2 -2
  51. package/dist/docs/access-code-sign-in.md +1 -1
  52. package/dist/docs/account-entry-point.md +1 -1
  53. package/dist/docs/account-menu-identity.md +160 -0
  54. package/dist/docs/account-menu.md +106 -23
  55. package/dist/docs/address-summary.md +24 -3
  56. package/dist/docs/alert-dialog.md +204 -0
  57. package/dist/docs/avatar.md +103 -0
  58. package/dist/docs/billing-address.md +284 -0
  59. package/dist/docs/card-entry.md +250 -0
  60. package/dist/docs/cardholder-document.md +142 -0
  61. package/dist/docs/client-preferences-fieldset.md +148 -0
  62. package/dist/docs/client-preferences.md +2 -1
  63. package/dist/docs/client-profile-fieldset.md +184 -0
  64. package/dist/docs/client-profile.md +1 -1
  65. package/dist/docs/document-field.md +58 -4
  66. package/dist/docs/field.md +317 -0
  67. package/dist/docs/form.md +307 -0
  68. package/dist/docs/identity-edit.md +6 -6
  69. package/dist/docs/identity-summary.md +5 -5
  70. package/dist/docs/installments.md +248 -0
  71. package/dist/docs/my-account-profile.md +2 -1
  72. package/dist/docs/order-placed-payment-summary.md +138 -0
  73. package/dist/docs/payment-method-badges.md +232 -0
  74. package/dist/docs/payment-methods.md +1 -0
  75. package/dist/docs/payment.md +218 -0
  76. package/dist/docs/phone-field.md +58 -4
  77. package/dist/docs/place-order.md +157 -0
  78. package/dist/docs/product-shelf.md +20 -13
  79. package/dist/docs/save-card.md +186 -0
  80. package/dist/docs/saved-cards.md +218 -0
  81. package/dist/docs/select.md +465 -0
  82. package/dist/docs/shipping-address.md +110 -258
  83. package/dist/index.d.ts +5 -2
  84. package/dist/internal/client.d.ts +3 -1
  85. package/dist/internal/client.js +4 -2
  86. package/dist/internal/content.d.ts +2 -2
  87. package/dist/internal/server.d.ts +4 -1
  88. package/dist/internal/server.js +4 -1
  89. package/dist/matter/access-code-sign-in/access-code-sign-in.js +9 -8
  90. package/dist/matter/access-code-sign-in/access-code-sign-in.js.map +1 -1
  91. package/dist/matter/account-access-gate/account-access-gate.js.map +1 -1
  92. package/dist/matter/account-entry-point/account-entry-point.js +1 -1
  93. package/dist/matter/account-entry-point/account-entry-point.js.map +1 -1
  94. package/dist/matter/account-menu/account-menu.d.ts +70 -0
  95. package/dist/matter/account-menu/account-menu.js +201 -9
  96. package/dist/matter/account-menu/account-menu.js.map +1 -1
  97. package/dist/matter/account-menu/sign-out-failure.js +50 -0
  98. package/dist/matter/account-menu/sign-out-failure.js.map +1 -0
  99. package/dist/matter/account-menu-identity/account-menu-identity.d.ts +21 -0
  100. package/dist/matter/account-menu-identity/account-menu-identity.js +88 -0
  101. package/dist/matter/account-menu-identity/account-menu-identity.js.map +1 -0
  102. package/dist/matter/billing-address/billing-address.d.ts +165 -0
  103. package/dist/matter/billing-address/billing-address.js +408 -0
  104. package/dist/matter/billing-address/billing-address.js.map +1 -0
  105. package/dist/matter/card-entry/card-capture.d.ts +25 -0
  106. package/dist/matter/card-entry/card-capture.js +25 -0
  107. package/dist/matter/card-entry/card-capture.js.map +1 -0
  108. package/dist/matter/card-entry/card-entry.d.ts +120 -0
  109. package/dist/matter/card-entry/card-entry.js +833 -0
  110. package/dist/matter/card-entry/card-entry.js.map +1 -0
  111. package/dist/matter/cardholder-document/cardholder-document.d.ts +45 -0
  112. package/dist/matter/cardholder-document/cardholder-document.js +70 -0
  113. package/dist/matter/cardholder-document/cardholder-document.js.map +1 -0
  114. package/dist/matter/cart/cart.js +1 -1
  115. package/dist/matter/client-preferences/client-preferences-fieldset.d.ts +77 -0
  116. package/dist/matter/client-preferences/client-preferences-fieldset.js +299 -0
  117. package/dist/matter/client-preferences/client-preferences-fieldset.js.map +1 -0
  118. package/dist/matter/client-preferences/client-preferences.d.ts +3 -5
  119. package/dist/matter/client-preferences/client-preferences.js +6 -6
  120. package/dist/matter/client-preferences/client-preferences.js.map +1 -1
  121. package/dist/matter/client-profile/client-profile.d.ts +4 -6
  122. package/dist/matter/client-profile/client-profile.js +9 -6
  123. package/dist/matter/client-profile/client-profile.js.map +1 -1
  124. package/dist/matter/client-profile-form/client-profile-fieldset.d.ts +119 -0
  125. package/dist/matter/client-profile-form/client-profile-fieldset.js +488 -0
  126. package/dist/matter/client-profile-form/client-profile-fieldset.js.map +1 -0
  127. package/dist/matter/identity-edit/identity-edit.js +2 -2
  128. package/dist/matter/identity-edit/identity-edit.js.map +1 -1
  129. package/dist/matter/identity-summary/identity-summary.js +3 -2
  130. package/dist/matter/identity-summary/identity-summary.js.map +1 -1
  131. package/dist/matter/installments/installments-select.d.ts +42 -0
  132. package/dist/matter/installments/installments-select.js +167 -0
  133. package/dist/matter/installments/installments-select.js.map +1 -0
  134. package/dist/matter/installments/installments.d.ts +58 -0
  135. package/dist/matter/installments/installments.js +176 -0
  136. package/dist/matter/installments/installments.js.map +1 -0
  137. package/dist/matter/installments/use-installments-selection.d.ts +29 -0
  138. package/dist/matter/installments/use-installments-selection.js +95 -0
  139. package/dist/matter/installments/use-installments-selection.js.map +1 -0
  140. package/dist/matter/my-account-profile/my-account-profile.d.ts +3 -0
  141. package/dist/matter/my-account-profile/my-account-profile.js +6 -5
  142. package/dist/matter/my-account-profile/my-account-profile.js.map +1 -1
  143. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.d.ts +63 -0
  144. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js +305 -0
  145. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js.map +1 -0
  146. package/dist/matter/payment/payment-card-capture.d.ts +19 -0
  147. package/dist/matter/payment/payment-card-capture.js +129 -0
  148. package/dist/matter/payment/payment-card-capture.js.map +1 -0
  149. package/dist/matter/payment/payment-controller.d.ts +24 -0
  150. package/dist/matter/payment/payment-controller.js +108 -0
  151. package/dist/matter/payment/payment-controller.js.map +1 -0
  152. package/dist/matter/payment/payment-method-badges.d.ts +57 -0
  153. package/dist/matter/payment/payment-method-badges.js +192 -0
  154. package/dist/matter/payment/payment-method-badges.js.map +1 -0
  155. package/dist/matter/payment/payment.d.ts +89 -0
  156. package/dist/matter/payment/payment.js +264 -0
  157. package/dist/matter/payment/payment.js.map +1 -0
  158. package/dist/matter/payment/use-payment-method-selection.d.ts +302 -0
  159. package/dist/matter/payment/use-payment-method-selection.js +458 -0
  160. package/dist/matter/payment/use-payment-method-selection.js.map +1 -0
  161. package/dist/matter/payment/use-payment-submit-gate.d.ts +111 -0
  162. package/dist/matter/payment/use-payment-submit-gate.js +144 -0
  163. package/dist/matter/payment/use-payment-submit-gate.js.map +1 -0
  164. package/dist/matter/place-order/place-order.d.ts +74 -0
  165. package/dist/matter/place-order/place-order.js +379 -0
  166. package/dist/matter/place-order/place-order.js.map +1 -0
  167. package/dist/matter/product-list/product-list.d.ts +1 -0
  168. package/dist/matter/product-list/product-list.js.map +1 -1
  169. package/dist/matter/product-shelf/product-shelf.d.ts +62 -31
  170. package/dist/matter/product-shelf/product-shelf.js +159 -57
  171. package/dist/matter/product-shelf/product-shelf.js.map +1 -1
  172. package/dist/matter/region/region.js +1 -1
  173. package/dist/matter/region/region.js.map +1 -1
  174. package/dist/matter/save-card/save-card.d.ts +49 -0
  175. package/dist/matter/save-card/save-card.js +188 -0
  176. package/dist/matter/save-card/save-card.js.map +1 -0
  177. package/dist/matter/saved-cards/saved-cards.d.ts +79 -0
  178. package/dist/matter/saved-cards/saved-cards.js +388 -0
  179. package/dist/matter/saved-cards/saved-cards.js.map +1 -0
  180. package/dist/matter/shipping-address/country-descriptors.js +20 -10
  181. package/dist/matter/shipping-address/country-descriptors.js.map +1 -1
  182. package/dist/matter/shipping-address/shipping-address.d.ts +113 -174
  183. package/dist/matter/shipping-address/shipping-address.js +480 -791
  184. package/dist/matter/shipping-address/shipping-address.js.map +1 -1
  185. package/dist/matter/variant-selector/variant-selector.js +1 -1
  186. package/dist/particles/address-summary/address-summary.d.ts +24 -0
  187. package/dist/particles/address-summary/address-summary.js +83 -2
  188. package/dist/particles/address-summary/address-summary.js.map +1 -1
  189. package/dist/particles/alert-dialog/alert-dialog.d.ts +68 -0
  190. package/dist/particles/alert-dialog/alert-dialog.js +187 -0
  191. package/dist/particles/alert-dialog/alert-dialog.js.map +1 -0
  192. package/dist/particles/avatar/avatar.d.ts +17 -0
  193. package/dist/particles/avatar/avatar.js +65 -0
  194. package/dist/particles/avatar/avatar.js.map +1 -0
  195. package/dist/particles/checkbox/checkbox.d.ts +7 -3
  196. package/dist/particles/checkbox/checkbox.js +4 -1
  197. package/dist/particles/checkbox/checkbox.js.map +1 -1
  198. package/dist/particles/document-field/document-field.d.ts +48 -5
  199. package/dist/particles/document-field/document-field.js +189 -32
  200. package/dist/particles/document-field/document-field.js.map +1 -1
  201. package/dist/particles/field/bound-field-registry.js +52 -0
  202. package/dist/particles/field/bound-field-registry.js.map +1 -0
  203. package/dist/particles/field/field.d.ts +116 -0
  204. package/dist/particles/field/field.js +497 -6
  205. package/dist/particles/field/field.js.map +1 -1
  206. package/dist/particles/fieldset/fieldset.js +2 -2
  207. package/dist/particles/fieldset/fieldset.js.map +1 -1
  208. package/dist/particles/form/form.d.ts +104 -0
  209. package/dist/particles/form/form.js +485 -0
  210. package/dist/particles/form/form.js.map +1 -0
  211. package/dist/particles/phone-field/phone-field.d.ts +38 -10
  212. package/dist/particles/phone-field/phone-field.js +183 -39
  213. package/dist/particles/phone-field/phone-field.js.map +1 -1
  214. package/dist/particles/postal-code-field/postal-code-field.js +2 -2
  215. package/dist/particles/postal-code-field/postal-code-field.js.map +1 -1
  216. package/dist/particles/select/field-select.d.ts +43 -0
  217. package/dist/particles/select/field-select.js +150 -0
  218. package/dist/particles/select/field-select.js.map +1 -0
  219. package/dist/particles/select/select.d.ts +2 -0
  220. package/dist/particles/select/select.js.map +1 -1
  221. package/dist/particles/shared/compose-refs.js +21 -0
  222. package/dist/particles/shared/compose-refs.js.map +1 -0
  223. package/dist/schema.graphql +766 -28
  224. package/dist/sdk/actions/analytics-action-provider.d.ts +15 -0
  225. package/dist/sdk/actions/analytics-action-provider.js +19 -0
  226. package/dist/sdk/actions/analytics-action-provider.js.map +1 -0
  227. package/dist/sdk/actions/index.d.ts +3 -1
  228. package/dist/sdk/actions/index.js +3 -1
  229. package/dist/sdk/actions/payment-action-provider.d.ts +22 -0
  230. package/dist/sdk/actions/payment-action-provider.js +26 -0
  231. package/dist/sdk/actions/payment-action-provider.js.map +1 -0
  232. package/dist/sdk/actions/types.d.ts +6 -2
  233. package/dist/sdk/analytics/analytics-destination.d.ts +43 -0
  234. package/dist/sdk/analytics/analytics-destination.js +90 -0
  235. package/dist/sdk/analytics/analytics-destination.js.map +1 -0
  236. package/dist/sdk/analytics/use-analytics-actions.d.ts +57 -0
  237. package/dist/sdk/analytics/use-analytics-actions.js +109 -0
  238. package/dist/sdk/analytics/use-analytics-actions.js.map +1 -0
  239. package/dist/sdk/cart/use-cart-actions.js +10 -9
  240. package/dist/sdk/cart/use-cart-actions.js.map +1 -1
  241. package/dist/sdk/cart/use-cart-validate-on-open.js +2 -1
  242. package/dist/sdk/cart/use-cart-validate-on-open.js.map +1 -1
  243. package/dist/sdk/content/create-content-runtime.d.ts +22 -1
  244. package/dist/sdk/content/create-content-runtime.js +89 -1
  245. package/dist/sdk/content/create-content-runtime.js.map +1 -1
  246. package/dist/sdk/data/empty-content-value.js +16 -0
  247. package/dist/sdk/data/empty-content-value.js.map +1 -0
  248. package/dist/sdk/data/entity-resolution-context.js +31 -0
  249. package/dist/sdk/data/entity-resolution-context.js.map +1 -0
  250. package/dist/sdk/data/entity-subscriber.js +18 -8
  251. package/dist/sdk/data/entity-subscriber.js.map +1 -1
  252. package/dist/sdk/data/hot-data-provider.js +2 -1
  253. package/dist/sdk/data/hot-data-provider.js.map +1 -1
  254. package/dist/sdk/data/index.js +2 -1
  255. package/dist/sdk/data/page-reactive-data-root.d.ts +36 -0
  256. package/dist/sdk/data/page-reactive-data-root.js +4 -2
  257. package/dist/sdk/data/page-reactive-data-root.js.map +1 -1
  258. package/dist/sdk/data/reactive-data-provider.js +7 -3
  259. package/dist/sdk/data/reactive-data-provider.js.map +1 -1
  260. package/dist/sdk/data/reactive-list-item-data-provider.js +12 -4
  261. package/dist/sdk/data/reactive-list-item-data-provider.js.map +1 -1
  262. package/dist/sdk/data/use-reactive-data-settled.js +39 -0
  263. package/dist/sdk/data/use-reactive-data-settled.js.map +1 -0
  264. package/dist/sdk/data/use-reactive-entity.js +5 -1
  265. package/dist/sdk/data/use-reactive-entity.js.map +1 -1
  266. package/dist/sdk/data/variables-from-content.d.ts +43 -0
  267. package/dist/sdk/data/variables-from-content.js +57 -0
  268. package/dist/sdk/data/variables-from-content.js.map +1 -0
  269. package/dist/sdk/generated/fragment-types.js +2 -0
  270. package/dist/sdk/generated/fragment-types.js.map +1 -1
  271. package/dist/sdk/generated/gql.js +2 -1
  272. package/dist/sdk/generated/gql.js.map +1 -1
  273. package/dist/sdk/generated/graphql.js +85 -1
  274. package/dist/sdk/generated/graphql.js.map +1 -1
  275. package/dist/sdk/i18n/messages/en-US.js +3 -0
  276. package/dist/sdk/i18n/messages/en-US.json +3 -0
  277. package/dist/sdk/i18n/messages/en-US.json.d.ts +3 -0
  278. package/dist/sdk/i18n/messages/es-ES.js +3 -0
  279. package/dist/sdk/i18n/messages/es-ES.json +3 -0
  280. package/dist/sdk/i18n/messages/pt-BR.js +3 -0
  281. package/dist/sdk/i18n/messages/pt-BR.json +3 -0
  282. package/dist/sdk/identity/use-identity-actions.js +8 -6
  283. package/dist/sdk/identity/use-identity-actions.js.map +1 -1
  284. package/dist/sdk/payment/gateway-origin.js +35 -0
  285. package/dist/sdk/payment/gateway-origin.js.map +1 -0
  286. package/dist/sdk/payment/gateway.d.ts +85 -0
  287. package/dist/sdk/payment/gateway.js +183 -0
  288. package/dist/sdk/payment/gateway.js.map +1 -0
  289. package/dist/sdk/payment/operations.d.ts +52 -0
  290. package/dist/sdk/payment/operations.js +223 -0
  291. package/dist/sdk/payment/operations.js.map +1 -0
  292. package/dist/sdk/payment/security-code-mask.js +71 -0
  293. package/dist/sdk/payment/security-code-mask.js.map +1 -0
  294. package/dist/sdk/payment/submission-registry.d.ts +33 -0
  295. package/dist/sdk/payment/submission-registry.js +58 -0
  296. package/dist/sdk/payment/submission-registry.js.map +1 -0
  297. package/dist/sdk/payment/use-payment-actions.d.ts +78 -0
  298. package/dist/sdk/payment/use-payment-actions.js +276 -0
  299. package/dist/sdk/payment/use-payment-actions.js.map +1 -0
  300. package/dist/sdk/payment/use-place-order.d.ts +65 -0
  301. package/dist/sdk/payment/use-place-order.js +640 -0
  302. package/dist/sdk/payment/use-place-order.js.map +1 -0
  303. package/dist/sdk/region/use-region-actions.js +2 -1
  304. package/dist/sdk/region/use-region-actions.js.map +1 -1
  305. package/dist/sdk/session/read-server-session.d.ts +21 -0
  306. package/dist/sdk/session/read-server-session.js +61 -0
  307. package/dist/sdk/session/read-server-session.js.map +1 -0
  308. package/dist/sdk/session/use-session-actions.js +5 -4
  309. package/dist/sdk/session/use-session-actions.js.map +1 -1
  310. package/dist/sdk/session/use-session-revalidation.js +2 -1
  311. package/dist/sdk/session/use-session-revalidation.js.map +1 -1
  312. package/dist/sdk/shipping/use-shipping-actions.js +4 -3
  313. package/dist/sdk/shipping/use-shipping-actions.js.map +1 -1
  314. package/dist/utils/loggable-error-name.js +49 -0
  315. package/dist/utils/loggable-error-name.js.map +1 -0
  316. package/dist/utils/resolve-authored-copy.js +18 -0
  317. package/dist/utils/resolve-authored-copy.js.map +1 -0
  318. package/dist/utils/safe-href.d.ts +11 -0
  319. package/dist/utils/substitute-template.js +33 -0
  320. package/dist/utils/substitute-template.js.map +1 -0
  321. package/package.json +14 -2
  322. package/src/styles/tailwind.css +34 -0
  323. package/dist/docs/client-profile-form.md +0 -192
  324. package/dist/matter/client-profile-form/client-profile-form.d.ts +0 -126
  325. package/dist/matter/client-profile-form/client-profile-form.js +0 -662
  326. 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,182 @@
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
+ },
338
+ "Avatar": {
339
+ "name": "Avatar",
340
+ "importPath": "@vtex/faststore/components",
341
+ "editor": {
342
+ "label": "Avatar",
343
+ "category": "content"
344
+ },
345
+ "schema": {
346
+ "name": {
347
+ "type": "string",
348
+ "label": "Name"
349
+ },
350
+ "src": {
351
+ "type": "string",
352
+ "label": "Image URL"
353
+ },
354
+ "alt": {
355
+ "type": "string",
356
+ "label": "Alt Text"
357
+ }
358
+ },
359
+ "guideline": "A person or account marker: an image with an initials fallback derived from `name`. Decorative unless `alt` is set, so give it an `alt` whenever no adjacent text names the person. Style it through data-fs-avatar.",
360
+ "docPath": "src/particles/avatar/avatar.md"
361
+ },
186
362
  "Badge": {
187
363
  "name": "Badge",
188
364
  "importPath": "@vtex/faststore/components",
@@ -442,6 +618,7 @@
442
618
  "DocumentField": {
443
619
  "name": "DocumentField",
444
620
  "importPath": "@vtex/faststore/components",
621
+ "providesContext": "document-field",
445
622
  "editor": {
446
623
  "label": "Document Field",
447
624
  "category": "content"
@@ -464,10 +641,12 @@
464
641
  "default": "CPF",
465
642
  "label": "Document type"
466
643
  },
467
- "required": {
468
- "type": "boolean",
469
- "default": false,
470
- "label": "Required"
644
+ "requirement": {
645
+ "type": [
646
+ "mandatory",
647
+ "optional"
648
+ ],
649
+ "label": "Requirement"
471
650
  },
472
651
  "disabled": {
473
652
  "type": "boolean",
@@ -475,7 +654,19 @@
475
654
  "label": "Disabled"
476
655
  }
477
656
  },
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.",
657
+ "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.",
658
+ "docPath": "src/particles/document-field/document-field.md"
659
+ },
660
+ "DocumentFieldInput": {
661
+ "name": "DocumentFieldInput",
662
+ "importPath": "@vtex/faststore/components",
663
+ "requiresContext": "document-field",
664
+ "editor": {
665
+ "label": "Document Field Input",
666
+ "category": "action"
667
+ },
668
+ "schema": {},
669
+ "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
670
  "docPath": "src/particles/document-field/document-field.md"
480
671
  },
481
672
  "DrawerRoot": {
@@ -611,6 +802,7 @@
611
802
  "FieldRoot": {
612
803
  "name": "FieldRoot",
613
804
  "importPath": "@vtex/faststore/components",
805
+ "providesContext": "field",
614
806
  "editor": {
615
807
  "label": "Field Root",
616
808
  "category": "layout"
@@ -622,57 +814,80 @@
622
814
  "label": "Disabled"
623
815
  }
624
816
  },
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."
817
+ "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.",
818
+ "docPath": "src/particles/field/field.md"
626
819
  },
627
820
  "FieldLabel": {
628
821
  "name": "FieldLabel",
629
822
  "importPath": "@vtex/faststore/components",
823
+ "requiresContext": "field",
630
824
  "editor": {
631
825
  "label": "Field Label",
632
826
  "category": "layout"
633
827
  },
634
828
  "schema": {},
635
- "guideline": "Accessible label inside Field.Root. Automatically associated with Field.Control's input via ARIA. Place before Field.Control in the DOM."
829
+ "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.",
830
+ "docPath": "src/particles/field/field.md"
636
831
  },
637
832
  "FieldControl": {
638
833
  "name": "FieldControl",
639
834
  "importPath": "@vtex/faststore/components",
835
+ "requiresContext": "field",
640
836
  "editor": {
641
837
  "label": "Field Control",
642
838
  "category": "layout"
643
839
  },
644
840
  "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."
841
+ "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.",
842
+ "docPath": "src/particles/field/field.md"
646
843
  },
647
844
  "FieldDescription": {
648
845
  "name": "FieldDescription",
649
846
  "importPath": "@vtex/faststore/components",
847
+ "requiresContext": "field",
650
848
  "editor": {
651
849
  "label": "Field Description",
652
850
  "category": "layout"
653
851
  },
654
852
  "schema": {},
655
- "guideline": "Helper text inside Field.Root. Automatically linked to the control via aria-describedby. Always visible regardless of validation state."
853
+ "guideline": "Helper text inside Field.Root. Automatically linked to the control via aria-describedby. Always visible regardless of validation state.",
854
+ "docPath": "src/particles/field/field.md"
656
855
  },
657
856
  "FieldError": {
658
857
  "name": "FieldError",
659
858
  "importPath": "@vtex/faststore/components",
859
+ "requiresContext": "field",
660
860
  "editor": {
661
861
  "label": "Field Error",
662
862
  "category": "layout"
663
863
  },
664
864
  "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."
865
+ "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.",
866
+ "docPath": "src/particles/field/field.md"
666
867
  },
667
868
  "FieldValidity": {
668
869
  "name": "FieldValidity",
669
870
  "importPath": "@vtex/faststore/components",
871
+ "requiresContext": "field",
670
872
  "editor": {
671
873
  "label": "Field Validity",
672
874
  "category": "layout"
673
875
  },
674
876
  "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."
877
+ "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.",
878
+ "docPath": "src/particles/field/field.md"
879
+ },
880
+ "FieldCheckbox": {
881
+ "name": "FieldCheckbox",
882
+ "importPath": "@vtex/faststore/components",
883
+ "requiresContext": "field",
884
+ "editor": {
885
+ "label": "Field Checkbox",
886
+ "category": "action"
887
+ },
888
+ "schema": {},
889
+ "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.",
890
+ "docPath": "src/particles/field/field.md"
676
891
  },
677
892
  "FieldsetRoot": {
678
893
  "name": "FieldsetRoot",
@@ -682,7 +897,7 @@
682
897
  "category": "layout"
683
898
  },
684
899
  "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."
900
+ "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
901
  },
687
902
  "FieldsetLegend": {
688
903
  "name": "FieldsetLegend",
@@ -692,7 +907,7 @@
692
907
  "category": "layout"
693
908
  },
694
909
  "schema": {},
695
- "guideline": "Visible title for a Fieldset.Root. Renders as a styled <legend> element."
910
+ "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
911
  },
697
912
  "FooterCopyright": {
698
913
  "name": "FooterCopyright",
@@ -764,6 +979,103 @@
764
979
  "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
980
  "docPath": "src/particles/footer-social/footer-social.md"
766
981
  },
982
+ "FormRoot": {
983
+ "name": "FormRoot",
984
+ "importPath": "@vtex/faststore/components",
985
+ "providesContext": "form",
986
+ "editor": {
987
+ "label": "Form",
988
+ "category": "action"
989
+ },
990
+ "schema": {},
991
+ "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.",
992
+ "docPath": "src/particles/form/form.md"
993
+ },
994
+ "FormSubmit": {
995
+ "name": "FormSubmit",
996
+ "importPath": "@vtex/faststore/components",
997
+ "requiresContext": "form",
998
+ "editor": {
999
+ "label": "Form Submit",
1000
+ "category": "action"
1001
+ },
1002
+ "schema": {
1003
+ "label": {
1004
+ "type": "string",
1005
+ "label": "Label"
1006
+ }
1007
+ },
1008
+ "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.",
1009
+ "docPath": "src/particles/form/form.md"
1010
+ },
1011
+ "FormEnterSubmit": {
1012
+ "name": "FormEnterSubmit",
1013
+ "importPath": "@vtex/faststore/components",
1014
+ "requiresContext": "form",
1015
+ "editor": {
1016
+ "label": "Form Enter Submit",
1017
+ "category": "action"
1018
+ },
1019
+ "schema": {
1020
+ "label": {
1021
+ "type": "string",
1022
+ "label": "Label"
1023
+ }
1024
+ },
1025
+ "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.",
1026
+ "docPath": "src/particles/form/form.md"
1027
+ },
1028
+ "FormError": {
1029
+ "name": "FormError",
1030
+ "importPath": "@vtex/faststore/components",
1031
+ "requiresContext": "form",
1032
+ "editor": {
1033
+ "label": "Form Error",
1034
+ "category": "content"
1035
+ },
1036
+ "schema": {
1037
+ "fallbackMessage": {
1038
+ "type": "string",
1039
+ "label": "Fallback message"
1040
+ }
1041
+ },
1042
+ "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.",
1043
+ "docPath": "src/particles/form/form.md"
1044
+ },
1045
+ "FormClear": {
1046
+ "name": "FormClear",
1047
+ "importPath": "@vtex/faststore/components",
1048
+ "requiresContext": "form",
1049
+ "editor": {
1050
+ "label": "Form Clear",
1051
+ "category": "action"
1052
+ },
1053
+ "schema": {
1054
+ "label": {
1055
+ "type": "string",
1056
+ "label": "Label"
1057
+ }
1058
+ },
1059
+ "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.",
1060
+ "docPath": "src/particles/form/form.md"
1061
+ },
1062
+ "FormReset": {
1063
+ "name": "FormReset",
1064
+ "importPath": "@vtex/faststore/components",
1065
+ "requiresContext": "form",
1066
+ "editor": {
1067
+ "label": "Form Reset",
1068
+ "category": "action"
1069
+ },
1070
+ "schema": {
1071
+ "label": {
1072
+ "type": "string",
1073
+ "label": "Label"
1074
+ }
1075
+ },
1076
+ "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.",
1077
+ "docPath": "src/particles/form/form.md"
1078
+ },
767
1079
  "GalleryRoot": {
768
1080
  "name": "GalleryRoot",
769
1081
  "importPath": "@vtex/faststore/components",
@@ -1964,6 +2276,7 @@
1964
2276
  "PhoneField": {
1965
2277
  "name": "PhoneField",
1966
2278
  "importPath": "@vtex/faststore/components",
2279
+ "providesContext": "phone-field",
1967
2280
  "editor": {
1968
2281
  "label": "Phone Field",
1969
2282
  "category": "action"
@@ -1980,8 +2293,10 @@
1980
2293
  "label": "Label"
1981
2294
  },
1982
2295
  "requirement": {
1983
- "type": "string",
1984
- "default": "mandatory",
2296
+ "type": [
2297
+ "mandatory",
2298
+ "optional"
2299
+ ],
1985
2300
  "label": "Requirement"
1986
2301
  },
1987
2302
  "errorInvalid": {
@@ -1995,7 +2310,19 @@
1995
2310
  "label": "Required error message"
1996
2311
  }
1997
2312
  },
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.",
2313
+ "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.",
2314
+ "docPath": "src/particles/phone-field/phone-field.md"
2315
+ },
2316
+ "PhoneFieldInput": {
2317
+ "name": "PhoneFieldInput",
2318
+ "importPath": "@vtex/faststore/components",
2319
+ "requiresContext": "phone-field",
2320
+ "editor": {
2321
+ "label": "Phone Field Input",
2322
+ "category": "action"
2323
+ },
2324
+ "schema": {},
2325
+ "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
2326
  "docPath": "src/particles/phone-field/phone-field.md"
2000
2327
  },
2001
2328
  "PopoverRoot": {
@@ -2171,6 +2498,7 @@
2171
2498
  "schema": {
2172
2499
  "mask": {
2173
2500
  "type": "string",
2501
+ "default": "99999-999",
2174
2502
  "label": "Mask pattern"
2175
2503
  },
2176
2504
  "label": {
@@ -2360,6 +2688,60 @@
2360
2688
  "schema": {},
2361
2689
  "guideline": "Corner piece displayed when both vertical and horizontal scrollbars are visible."
2362
2690
  },
2691
+ "FieldSelectRoot": {
2692
+ "name": "FieldSelectRoot",
2693
+ "importPath": "@vtex/faststore/components",
2694
+ "requiresContext": "field",
2695
+ "editor": {
2696
+ "label": "Field Select Root",
2697
+ "category": "layout"
2698
+ },
2699
+ "schema": {
2700
+ "modal": {
2701
+ "type": "boolean",
2702
+ "default": true,
2703
+ "label": "Modal"
2704
+ }
2705
+ },
2706
+ "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.",
2707
+ "docPath": "src/particles/select/select.md"
2708
+ },
2709
+ "FieldSelectTrigger": {
2710
+ "name": "FieldSelectTrigger",
2711
+ "importPath": "@vtex/faststore/components",
2712
+ "requiresContext": "field",
2713
+ "editor": {
2714
+ "label": "Field Select Trigger",
2715
+ "category": "action"
2716
+ },
2717
+ "schema": {},
2718
+ "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.",
2719
+ "docPath": "src/particles/select/select.md"
2720
+ },
2721
+ "FieldSelectValue": {
2722
+ "name": "FieldSelectValue",
2723
+ "importPath": "@vtex/faststore/components",
2724
+ "requiresContext": "field",
2725
+ "editor": {
2726
+ "label": "Field Select Value",
2727
+ "category": "layout"
2728
+ },
2729
+ "schema": {},
2730
+ "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.",
2731
+ "docPath": "src/particles/select/select.md"
2732
+ },
2733
+ "FieldSelectOptions": {
2734
+ "name": "FieldSelectOptions",
2735
+ "importPath": "@vtex/faststore/components",
2736
+ "requiresContext": "field",
2737
+ "editor": {
2738
+ "label": "Field Select Options",
2739
+ "category": "content"
2740
+ },
2741
+ "schema": {},
2742
+ "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.",
2743
+ "docPath": "src/particles/select/select.md"
2744
+ },
2363
2745
  "SelectRoot": {
2364
2746
  "name": "SelectRoot",
2365
2747
  "importPath": "@vtex/faststore/components",
@@ -2389,7 +2771,8 @@
2389
2771
  "label": "Read Only"
2390
2772
  }
2391
2773
  },
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."
2774
+ "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.",
2775
+ "docPath": "src/particles/select/select.md"
2393
2776
  },
2394
2777
  "SelectLabel": {
2395
2778
  "name": "SelectLabel",
@@ -2399,7 +2782,8 @@
2399
2782
  "category": "layout"
2400
2783
  },
2401
2784
  "schema": {},
2402
- "guideline": "Accessible label associated with the trigger. Always place outside Select.Trigger so screen readers announce it separately."
2785
+ "guideline": "Accessible label associated with the trigger. Always place outside Select.Trigger so screen readers announce it separately.",
2786
+ "docPath": "src/particles/select/select.md"
2403
2787
  },
2404
2788
  "SelectTrigger": {
2405
2789
  "name": "SelectTrigger",
@@ -2415,7 +2799,8 @@
2415
2799
  "label": "Disabled"
2416
2800
  }
2417
2801
  },
2418
- "guideline": "Opens and closes the popup on click. Use data-open and data-placeholder CSS attributes for open-state and empty-state styling."
2802
+ "guideline": "Opens and closes the popup on click. Use data-open and data-placeholder CSS attributes for open-state and empty-state styling.",
2803
+ "docPath": "src/particles/select/select.md"
2419
2804
  },
2420
2805
  "SelectValue": {
2421
2806
  "name": "SelectValue",
@@ -2425,7 +2810,8 @@
2425
2810
  "category": "layout"
2426
2811
  },
2427
2812
  "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]."
2813
+ "guideline": "Renders the selected item's text, or placeholder when nothing is selected. Style the placeholder state via [data-fs-select-value][data-placeholder].",
2814
+ "docPath": "src/particles/select/select.md"
2429
2815
  },
2430
2816
  "SelectIcon": {
2431
2817
  "name": "SelectIcon",
@@ -2435,7 +2821,8 @@
2435
2821
  "category": "layout"
2436
2822
  },
2437
2823
  "schema": {},
2438
- "guideline": "Decorative indicator (e.g. chevron) inside the trigger. Rotates or changes when the popup opens via data-open."
2824
+ "guideline": "Decorative indicator (e.g. chevron) inside the trigger. Rotates or changes when the popup opens via data-open.",
2825
+ "docPath": "src/particles/select/select.md"
2439
2826
  },
2440
2827
  "SelectPortal": {
2441
2828
  "name": "SelectPortal",
@@ -2445,7 +2832,8 @@
2445
2832
  "category": "layout"
2446
2833
  },
2447
2834
  "schema": {},
2448
- "guideline": "Teleports popup content to <body>. Always wrap Select.Positioner with this to avoid overflow/z-index issues."
2835
+ "guideline": "Teleports popup content to <body>. Always wrap Select.Positioner with this to avoid overflow/z-index issues.",
2836
+ "docPath": "src/particles/select/select.md"
2449
2837
  },
2450
2838
  "SelectBackdrop": {
2451
2839
  "name": "SelectBackdrop",
@@ -2455,7 +2843,8 @@
2455
2843
  "category": "layout"
2456
2844
  },
2457
2845
  "schema": {},
2458
- "guideline": "Invisible overlay that closes the select when clicked outside. Required when modal=true to trap interaction."
2846
+ "guideline": "Invisible overlay that closes the select when clicked outside. Required when modal=true to trap interaction.",
2847
+ "docPath": "src/particles/select/select.md"
2459
2848
  },
2460
2849
  "SelectPositioner": {
2461
2850
  "name": "SelectPositioner",
@@ -2495,7 +2884,8 @@
2495
2884
  "label": "Align Item With Trigger"
2496
2885
  }
2497
2886
  },
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."
2887
+ "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.",
2888
+ "docPath": "src/particles/select/select.md"
2499
2889
  },
2500
2890
  "SelectScrollUpArrow": {
2501
2891
  "name": "SelectScrollUpArrow",
@@ -2511,7 +2901,8 @@
2511
2901
  "label": "Keep Mounted"
2512
2902
  }
2513
2903
  },
2514
- "guideline": "Scrolls the list upward when hovered. Appears automatically when the list overflows at the top."
2904
+ "guideline": "Scrolls the list upward when hovered. Appears automatically when the list overflows at the top.",
2905
+ "docPath": "src/particles/select/select.md"
2515
2906
  },
2516
2907
  "SelectPopup": {
2517
2908
  "name": "SelectPopup",
@@ -2521,7 +2912,8 @@
2521
2912
  "category": "layout"
2522
2913
  },
2523
2914
  "schema": {},
2524
- "guideline": "Visible container for the select list. Apply background, shadow, and border styles here."
2915
+ "guideline": "Visible container for the select list. Apply background, shadow, and border styles here.",
2916
+ "docPath": "src/particles/select/select.md"
2525
2917
  },
2526
2918
  "SelectArrow": {
2527
2919
  "name": "SelectArrow",
@@ -2531,7 +2923,8 @@
2531
2923
  "category": "layout"
2532
2924
  },
2533
2925
  "schema": {},
2534
- "guideline": "Pointing arrow attached to the popup indicating the anchor. Optional — omit when not using an arrow indicator."
2926
+ "guideline": "Pointing arrow attached to the popup indicating the anchor. Optional — omit when not using an arrow indicator.",
2927
+ "docPath": "src/particles/select/select.md"
2535
2928
  },
2536
2929
  "SelectList": {
2537
2930
  "name": "SelectList",
@@ -2541,7 +2934,8 @@
2541
2934
  "category": "layout"
2542
2935
  },
2543
2936
  "schema": {},
2544
- "guideline": "Scrollable container for all Select.Item elements. Apply max-height and overflow for scrolling."
2937
+ "guideline": "Scrollable container for all Select.Item elements. Apply max-height and overflow for scrolling.",
2938
+ "docPath": "src/particles/select/select.md"
2545
2939
  },
2546
2940
  "SelectItem": {
2547
2941
  "name": "SelectItem",
@@ -2561,7 +2955,8 @@
2561
2955
  "label": "Disabled"
2562
2956
  }
2563
2957
  },
2564
- "guideline": "One selectable option. Requires a unique value prop. Style selected and highlighted states via data-selected and data-highlighted attributes."
2958
+ "guideline": "One selectable option. Requires a unique value prop. Style selected and highlighted states via data-selected and data-highlighted attributes.",
2959
+ "docPath": "src/particles/select/select.md"
2565
2960
  },
2566
2961
  "SelectItemText": {
2567
2962
  "name": "SelectItemText",
@@ -2571,7 +2966,8 @@
2571
2966
  "category": "layout"
2572
2967
  },
2573
2968
  "schema": {},
2574
- "guideline": "The visible text label of an item. Base UI uses this for keyboard navigation matching."
2969
+ "guideline": "The visible text label of an item. Base UI uses this for keyboard navigation matching.",
2970
+ "docPath": "src/particles/select/select.md"
2575
2971
  },
2576
2972
  "SelectItemIndicator": {
2577
2973
  "name": "SelectItemIndicator",
@@ -2587,7 +2983,8 @@
2587
2983
  "label": "Keep Mounted"
2588
2984
  }
2589
2985
  },
2590
- "guideline": "Checkmark or indicator shown only on the selected item. Set keepMounted=true to animate in/out."
2986
+ "guideline": "Checkmark or indicator shown only on the selected item. Set keepMounted=true to animate in/out.",
2987
+ "docPath": "src/particles/select/select.md"
2591
2988
  },
2592
2989
  "SelectSeparator": {
2593
2990
  "name": "SelectSeparator",
@@ -2597,7 +2994,8 @@
2597
2994
  "category": "layout"
2598
2995
  },
2599
2996
  "schema": {},
2600
- "guideline": "Visual divider between items or groups. Use between unrelated option groups."
2997
+ "guideline": "Visual divider between items or groups. Use between unrelated option groups.",
2998
+ "docPath": "src/particles/select/select.md"
2601
2999
  },
2602
3000
  "SelectGroup": {
2603
3001
  "name": "SelectGroup",
@@ -2607,7 +3005,8 @@
2607
3005
  "category": "layout"
2608
3006
  },
2609
3007
  "schema": {},
2610
- "guideline": "Groups related items under a shared SelectGroupLabel for semantic and visual grouping."
3008
+ "guideline": "Groups related items under a shared SelectGroupLabel for semantic and visual grouping.",
3009
+ "docPath": "src/particles/select/select.md"
2611
3010
  },
2612
3011
  "SelectGroupLabel": {
2613
3012
  "name": "SelectGroupLabel",
@@ -2617,7 +3016,8 @@
2617
3016
  "category": "layout"
2618
3017
  },
2619
3018
  "schema": {},
2620
- "guideline": "Non-interactive label for a Select.Group. Announced by screen readers as a group name."
3019
+ "guideline": "Non-interactive label for a Select.Group. Announced by screen readers as a group name.",
3020
+ "docPath": "src/particles/select/select.md"
2621
3021
  },
2622
3022
  "SelectScrollDownArrow": {
2623
3023
  "name": "SelectScrollDownArrow",
@@ -2633,7 +3033,8 @@
2633
3033
  "label": "Keep Mounted"
2634
3034
  }
2635
3035
  },
2636
- "guideline": "Scrolls the list downward when hovered. Appears when the list overflows at the bottom."
3036
+ "guideline": "Scrolls the list downward when hovered. Appears when the list overflows at the bottom.",
3037
+ "docPath": "src/particles/select/select.md"
2637
3038
  },
2638
3039
  "Separator": {
2639
3040
  "name": "Separator",
@@ -3298,38 +3699,228 @@
3298
3699
  "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
3700
  "docPath": "src/matter/account-menu/account-menu.md"
3300
3701
  },
3301
- "BreadcrumbRoot": {
3302
- "name": "BreadcrumbRoot",
3702
+ "AccountMenuIndexRedirect": {
3703
+ "name": "AccountMenuIndexRedirect",
3303
3704
  "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",
3705
+ "contentTypeId": "account-menu-index-redirect",
3706
+ "requiresContext": "account-menu",
3305
3707
  "editor": {
3306
- "label": "Breadcrumb Root",
3708
+ "label": "Account Menu Index Redirect",
3307
3709
  "category": "navigation"
3308
3710
  },
3309
3711
  "schema": {
3310
- "label": {
3712
+ "loadingLabel": {
3311
3713
  "type": "string",
3312
- "default": "Breadcrumb",
3313
- "label": "Aria Label"
3714
+ "label": "Loading Announcement"
3715
+ },
3716
+ "emptyMessage": {
3717
+ "type": "string",
3718
+ "default": "No account section is configured.",
3719
+ "label": "No Section Message"
3314
3720
  }
3315
3721
  },
3316
- "guideline": "Root container for breadcrumb navigation; compose as BreadcrumbRoot > BreadcrumbList > [BreadcrumbLink + BreadcrumbSeparator]."
3722
+ "guideline": "The whole of the account's root page: it replaces the current history entry with the first section of the merchant's list that stays in the account, skipping one marked external, one whose destination was refused or is not site-relative, and the root itself. It shows the access gate's loading look until the section opens. A list with no such section leaves the root terminal — no navigation, and the no-section message in its place — rather than falling back to the library's defaults. Place it alone on the /pvt/account page, inside AccountMenuRoot and under AccountAccessGate, which the my-account layout provides; never on a section's own page, which it would navigate away from.",
3723
+ "docPath": "src/matter/account-menu/account-menu.md"
3317
3724
  },
3318
- "BreadcrumbList": {
3319
- "name": "BreadcrumbList",
3725
+ "AccountMenuSignOut": {
3726
+ "name": "AccountMenuSignOut",
3320
3727
  "importPath": "@vtex/faststore/components",
3321
- "editor": {
3322
- "label": "Breadcrumb List",
3323
- "category": "navigation"
3728
+ "contentTypeId": "account-menu-sign-out",
3729
+ "actions": {
3730
+ "session": [
3731
+ "logout"
3732
+ ]
3324
3733
  },
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
3734
  "editor": {
3332
- "label": "Breadcrumb Link",
3735
+ "label": "Account Menu Sign Out",
3736
+ "category": "navigation"
3737
+ },
3738
+ "schema": {
3739
+ "label": {
3740
+ "type": "string",
3741
+ "default": "Sign out",
3742
+ "label": "Label"
3743
+ },
3744
+ "errorMessage": {
3745
+ "type": "string",
3746
+ "default": "We couldn't sign you out. Please try again.",
3747
+ "label": "Sign-out Failed Message"
3748
+ }
3749
+ },
3750
+ "guideline": "The account sidebar's way out: it dispatches $actions.session.logout, tells AccountAccessGate the departure is deliberate so the gate stands down instead of sending the shopper to sign in, and then loads the storefront home as a new document, which is what keeps the account out of the client router's cache. A logout that reports an error keeps the shopper on the account page with the failure message rather than landing a still-signed-in shopper on the home page. Compose it inside AccountMenuRoot beside AccountMenuList, under the gate the my-account layout provides — the back-forward cache is the gate's to revalidate, not this control's.",
3751
+ "docPath": "src/matter/account-menu/account-menu.md"
3752
+ },
3753
+ "AccountMenuIdentity": {
3754
+ "name": "AccountMenuIdentity",
3755
+ "importPath": "@vtex/faststore/components",
3756
+ "fragment": "\n fragment AccountMenuIdentityData on Query {\n customerProfile {\n __typename\n id\n firstName\n lastName\n email\n }\n }\n",
3757
+ "fetchStrategy": "reactive",
3758
+ "requiresContext": "session",
3759
+ "skeleton": "AccountMenuIdentitySkeleton",
3760
+ "editor": {
3761
+ "label": "Account Menu Identity",
3762
+ "category": "identity"
3763
+ },
3764
+ "schema": {},
3765
+ "guideline": "The shopper's name and initials avatar, read reactively from the persistent profile. Compose it in the my-account layout, never on a page, so its fragment joins the layout's query, which runs in the browser where the shopper's cookie is; place it under AccountAccessGate, inside AccountMenuRoot beside AccountMenuList and never inside it, so it stays outside the navigation landmark. It reads the session, so a SessionRoot must be an ancestor. It renders a skeleton until the layout's query settles, and nothing for a session that is not loggedIn, for a read that returned no profile, or for a profile with neither a name nor an email. Style it through data-fs-account-menu-identity, and hide it below the md breakpoint with the store's swatch.",
3766
+ "docPath": "src/matter/account-menu-identity/account-menu-identity.md"
3767
+ },
3768
+ "AccountMenuIdentitySkeleton": {
3769
+ "name": "AccountMenuIdentitySkeleton",
3770
+ "importPath": "@vtex/faststore/components",
3771
+ "editor": {
3772
+ "label": "Account Menu Identity Skeleton",
3773
+ "category": "identity"
3774
+ },
3775
+ "schema": {},
3776
+ "guideline": "Loading placeholder rendered by AccountMenuIdentity while the profile is unresolved. Declares no context requirement — it renders before the matter has anything to show.",
3777
+ "docPath": "src/matter/account-menu-identity/account-menu-identity.md"
3778
+ },
3779
+ "BillingAddress": {
3780
+ "name": "BillingAddress",
3781
+ "importPath": "@vtex/faststore/components",
3782
+ "requiresContext": "payment",
3783
+ "actions": {
3784
+ "payment": [
3785
+ "setBillingAddress"
3786
+ ]
3787
+ },
3788
+ "editor": {
3789
+ "label": "Billing Address",
3790
+ "category": "commerce"
3791
+ },
3792
+ "schema": {
3793
+ "sameAsDeliveryLabel": {
3794
+ "type": "string",
3795
+ "default": "Billing address same as delivery address",
3796
+ "label": "Same-as-delivery toggle label"
3797
+ },
3798
+ "defaultCountry": {
3799
+ "type": "string",
3800
+ "default": "BRA",
3801
+ "label": "Default country (ISO-3)"
3802
+ },
3803
+ "countryLabel": {
3804
+ "type": "string",
3805
+ "default": "Country",
3806
+ "label": "Country field label"
3807
+ },
3808
+ "submitLabel": {
3809
+ "type": "string",
3810
+ "default": "Save billing address",
3811
+ "label": "Submit button label"
3812
+ },
3813
+ "submitPendingLabel": {
3814
+ "type": "string",
3815
+ "default": "Saving...",
3816
+ "label": "Submit button pending label"
3817
+ },
3818
+ "requiredNoticeLabel": {
3819
+ "type": "string",
3820
+ "default": "This payment method requires a billing address.",
3821
+ "label": "Required-billing-address notice label"
3822
+ },
3823
+ "unsavedAddressNoticeLabel": {
3824
+ "type": "string",
3825
+ "default": "No billing address has been saved yet — the delivery address will be used unless you save one below.",
3826
+ "label": "Unsaved-address notice label"
3827
+ },
3828
+ "billingMatchNoticeLabel": {
3829
+ "type": "string",
3830
+ "default": "Your billing address must match the one on your card or bank statement, or your bank may decline the order.",
3831
+ "label": "Billing-match disclaimer"
3832
+ },
3833
+ "billingMatchNoticeVisible": {
3834
+ "type": "boolean",
3835
+ "default": true,
3836
+ "label": "Show the billing-match disclaimer"
3837
+ },
3838
+ "recipientNameLabel": {
3839
+ "type": "string",
3840
+ "default": "Recipient's name",
3841
+ "label": "Recipient name field label"
3842
+ },
3843
+ "streetLabel": {
3844
+ "type": "string",
3845
+ "default": "Street",
3846
+ "label": "Street field label"
3847
+ },
3848
+ "numberLabel": {
3849
+ "type": "string",
3850
+ "default": "Number",
3851
+ "label": "Number field label"
3852
+ },
3853
+ "complementLabel": {
3854
+ "type": "string",
3855
+ "default": "Complement (optional)",
3856
+ "label": "Complement field label"
3857
+ },
3858
+ "neighborhoodLabel": {
3859
+ "type": "string",
3860
+ "default": "Neighborhood",
3861
+ "label": "Neighborhood field label"
3862
+ },
3863
+ "cityLabel": {
3864
+ "type": "string",
3865
+ "default": "City",
3866
+ "label": "City field label"
3867
+ },
3868
+ "stateLabel": {
3869
+ "type": "string",
3870
+ "default": "State",
3871
+ "label": "State field label"
3872
+ },
3873
+ "postalCodeLabel": {
3874
+ "type": "string",
3875
+ "default": "Postal code",
3876
+ "label": "Postal code field label"
3877
+ },
3878
+ "fieldRequiredMessage": {
3879
+ "type": "string",
3880
+ "default": "This field is required.",
3881
+ "label": "Field required message"
3882
+ },
3883
+ "disabled": {
3884
+ "type": "boolean",
3885
+ "default": false,
3886
+ "label": "Disabled"
3887
+ }
3888
+ },
3889
+ "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.",
3890
+ "docPath": "src/matter/billing-address/billing-address.md"
3891
+ },
3892
+ "BreadcrumbRoot": {
3893
+ "name": "BreadcrumbRoot",
3894
+ "importPath": "@vtex/faststore/components",
3895
+ "fragment": "\n fragment BreadcrumbData on Query {\n productBySlug(slug: $slug) {\n breadcrumbs {\n name\n url\n position\n }\n }\n }\n",
3896
+ "editor": {
3897
+ "label": "Breadcrumb Root",
3898
+ "category": "navigation"
3899
+ },
3900
+ "schema": {
3901
+ "label": {
3902
+ "type": "string",
3903
+ "default": "Breadcrumb",
3904
+ "label": "Aria Label"
3905
+ }
3906
+ },
3907
+ "guideline": "Root container for breadcrumb navigation; compose as BreadcrumbRoot > BreadcrumbList > [BreadcrumbLink + BreadcrumbSeparator]."
3908
+ },
3909
+ "BreadcrumbList": {
3910
+ "name": "BreadcrumbList",
3911
+ "importPath": "@vtex/faststore/components",
3912
+ "editor": {
3913
+ "label": "Breadcrumb List",
3914
+ "category": "navigation"
3915
+ },
3916
+ "schema": {},
3917
+ "guideline": "Ordered list of breadcrumb items; must be a direct child of BreadcrumbRoot."
3918
+ },
3919
+ "BreadcrumbLink": {
3920
+ "name": "BreadcrumbLink",
3921
+ "importPath": "@vtex/faststore/components",
3922
+ "editor": {
3923
+ "label": "Breadcrumb Link",
3333
3924
  "category": "navigation"
3334
3925
  },
3335
3926
  "schema": {},
@@ -3391,6 +3982,145 @@
3391
3982
  "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
3983
  "docPath": "src/matter/buy-button/buy-button.md"
3393
3984
  },
3985
+ "CardEntry": {
3986
+ "name": "CardEntry",
3987
+ "importPath": "@vtex/faststore/components",
3988
+ "requiresContext": "card-capture",
3989
+ "hardened": true,
3990
+ "editor": {
3991
+ "label": "Card Entry",
3992
+ "category": "commerce"
3993
+ },
3994
+ "schema": {
3995
+ "legend": {
3996
+ "type": "string",
3997
+ "default": "Card details",
3998
+ "label": "Legend"
3999
+ },
4000
+ "numberLabel": {
4001
+ "type": "string",
4002
+ "default": "Card number",
4003
+ "label": "Number label"
4004
+ },
4005
+ "numberPlaceholder": {
4006
+ "type": "string",
4007
+ "label": "Number placeholder"
4008
+ },
4009
+ "holderNameLabel": {
4010
+ "type": "string",
4011
+ "default": "Cardholder name",
4012
+ "label": "Holder name label"
4013
+ },
4014
+ "holderNamePlaceholder": {
4015
+ "type": "string",
4016
+ "label": "Holder name placeholder"
4017
+ },
4018
+ "expirationLabel": {
4019
+ "type": "string",
4020
+ "default": "Expiration date",
4021
+ "label": "Expiration label"
4022
+ },
4023
+ "expirationPlaceholder": {
4024
+ "type": "string",
4025
+ "default": "MM/YY",
4026
+ "label": "Expiration placeholder"
4027
+ },
4028
+ "cvvLabel": {
4029
+ "type": "string",
4030
+ "default": "Security code",
4031
+ "label": "CVV label"
4032
+ },
4033
+ "cvvPlaceholder": {
4034
+ "type": "string",
4035
+ "label": "CVV placeholder"
4036
+ },
4037
+ "cvvDescription": {
4038
+ "type": "string",
4039
+ "default": "The 3-4 digit number on your card",
4040
+ "label": "CVV description"
4041
+ },
4042
+ "numberRequiredMessage": {
4043
+ "type": "string",
4044
+ "default": "Card number is required",
4045
+ "label": "Number required message"
4046
+ },
4047
+ "numberInvalidMessage": {
4048
+ "type": "string",
4049
+ "default": "Enter a valid card number",
4050
+ "label": "Number invalid message"
4051
+ },
4052
+ "holderNameRequiredMessage": {
4053
+ "type": "string",
4054
+ "default": "Cardholder name is required",
4055
+ "label": "Holder name required message"
4056
+ },
4057
+ "expirationRequiredMessage": {
4058
+ "type": "string",
4059
+ "default": "Expiration date is required",
4060
+ "label": "Expiration required message"
4061
+ },
4062
+ "expirationInvalidMessage": {
4063
+ "type": "string",
4064
+ "default": "Enter a valid expiration date",
4065
+ "label": "Expiration invalid message"
4066
+ },
4067
+ "expirationExpiredMessage": {
4068
+ "type": "string",
4069
+ "default": "This card has expired",
4070
+ "label": "Expiration expired message"
4071
+ },
4072
+ "cvvRequiredMessage": {
4073
+ "type": "string",
4074
+ "default": "Security code is required",
4075
+ "label": "CVV required message"
4076
+ },
4077
+ "cvvInvalidMessage": {
4078
+ "type": "string",
4079
+ "default": "Enter a valid security code",
4080
+ "label": "CVV invalid message"
4081
+ },
4082
+ "disabled": {
4083
+ "type": "boolean",
4084
+ "default": false,
4085
+ "label": "Disabled"
4086
+ }
4087
+ },
4088
+ "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.",
4089
+ "docPath": "src/matter/card-entry/card-entry.md"
4090
+ },
4091
+ "CardholderDocument": {
4092
+ "name": "CardholderDocument",
4093
+ "importPath": "@vtex/faststore/components",
4094
+ "requiresContext": "payment",
4095
+ "editor": {
4096
+ "label": "Cardholder Document",
4097
+ "category": "commerce"
4098
+ },
4099
+ "schema": {
4100
+ "label": {
4101
+ "type": "string",
4102
+ "default": "CPF",
4103
+ "label": "Label"
4104
+ },
4105
+ "placeholder": {
4106
+ "type": "string",
4107
+ "default": "000.000.000-00",
4108
+ "label": "Placeholder"
4109
+ },
4110
+ "errorMessage": {
4111
+ "type": "string",
4112
+ "default": "Invalid CPF",
4113
+ "label": "Error message"
4114
+ },
4115
+ "disabled": {
4116
+ "type": "boolean",
4117
+ "default": false,
4118
+ "label": "Disabled"
4119
+ }
4120
+ },
4121
+ "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.",
4122
+ "docPath": "src/matter/cardholder-document/cardholder-document.md"
4123
+ },
3394
4124
  "CartRoot": {
3395
4125
  "name": "CartRoot",
3396
4126
  "importPath": "@vtex/faststore/components",
@@ -4205,12 +4935,93 @@
4205
4935
  },
4206
4936
  "docPath": "src/matter/cart-totalizer/cart-totalizer.md"
4207
4937
  },
4938
+ "ClientPreferencesFieldset": {
4939
+ "name": "ClientPreferencesFieldset",
4940
+ "importPath": "@vtex/faststore/components",
4941
+ "fragment": "\n fragment ClientPreferencesFieldsetData on Query {\n clientPreferences {\n __typename\n id\n optinNewsLetter\n savePersonalData\n }\n }\n",
4942
+ "fetchStrategy": "reactive",
4943
+ "skeleton": "ClientPreferencesFieldsetSkeleton",
4944
+ "requiresContext": [
4945
+ "form",
4946
+ "session"
4947
+ ],
4948
+ "providesContext": "client-preferences",
4949
+ "actions": {
4950
+ "identity": [
4951
+ "clientPreferencesUpdate"
4952
+ ]
4953
+ },
4954
+ "editor": {
4955
+ "label": "Client Preferences Fieldset",
4956
+ "category": "identity"
4957
+ },
4958
+ "schema": {
4959
+ "skeletonCount": {
4960
+ "type": "number",
4961
+ "default": 2,
4962
+ "label": "Skeleton rows"
4963
+ },
4964
+ "loadingLabel": {
4965
+ "type": "string",
4966
+ "default": "Loading your preferences",
4967
+ "label": "Loading announcement"
4968
+ },
4969
+ "loadedLabel": {
4970
+ "type": "string",
4971
+ "default": "Your preferences are ready",
4972
+ "label": "Loaded announcement"
4973
+ },
4974
+ "groupLabel": {
4975
+ "type": "string",
4976
+ "default": "Your preferences",
4977
+ "label": "Accessible group name"
4978
+ }
4979
+ },
4980
+ "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.",
4981
+ "docPath": "src/matter/client-preferences/client-preferences-fieldset.md"
4982
+ },
4983
+ "ClientPreferencesNewsletterControl": {
4984
+ "name": "ClientPreferencesNewsletterControl",
4985
+ "importPath": "@vtex/faststore/components",
4986
+ "requiresContext": "client-preferences",
4987
+ "providesContext": "field",
4988
+ "editor": {
4989
+ "label": "Client Preferences Newsletter Control",
4990
+ "category": "identity"
4991
+ },
4992
+ "schema": {
4993
+ "label": {
4994
+ "type": "string",
4995
+ "label": "Label"
4996
+ }
4997
+ },
4998
+ "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.",
4999
+ "docPath": "src/matter/client-preferences/client-preferences-fieldset.md"
5000
+ },
5001
+ "ClientPreferencesSavePersonalDataControl": {
5002
+ "name": "ClientPreferencesSavePersonalDataControl",
5003
+ "importPath": "@vtex/faststore/components",
5004
+ "requiresContext": "client-preferences",
5005
+ "providesContext": "field",
5006
+ "editor": {
5007
+ "label": "Client Preferences Save Personal Data Control",
5008
+ "category": "identity"
5009
+ },
5010
+ "schema": {
5011
+ "label": {
5012
+ "type": "string",
5013
+ "label": "Label"
5014
+ }
5015
+ },
5016
+ "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.",
5017
+ "docPath": "src/matter/client-preferences/client-preferences-fieldset.md"
5018
+ },
4208
5019
  "ClientPreferencesRoot": {
4209
5020
  "name": "ClientPreferencesRoot",
4210
5021
  "importPath": "@vtex/faststore/components",
4211
5022
  "fragment": "\n fragment ClientPreferencesData on Query {\n clientPreferences {\n __typename\n id\n optinNewsLetter\n savePersonalData\n }\n }\n",
4212
5023
  "fetchStrategy": "reactive",
4213
- "providesContext": "client-preferences",
5024
+ "providesContext": "client-preferences-toggle",
4214
5025
  "requiresContext": "session",
4215
5026
  "editor": {
4216
5027
  "label": "Client Preferences Root",
@@ -4223,7 +5034,7 @@
4223
5034
  "NewsletterOptInControl": {
4224
5035
  "name": "NewsletterOptInControl",
4225
5036
  "importPath": "@vtex/faststore/components",
4226
- "requiresContext": "client-preferences",
5037
+ "requiresContext": "client-preferences-toggle",
4227
5038
  "actions": {
4228
5039
  "identity": [
4229
5040
  "clientPreferencesUpdate"
@@ -4245,7 +5056,7 @@
4245
5056
  "SavePersonalDataOptInControl": {
4246
5057
  "name": "SavePersonalDataOptInControl",
4247
5058
  "importPath": "@vtex/faststore/components",
4248
- "requiresContext": "client-preferences",
5059
+ "requiresContext": "client-preferences-toggle",
4249
5060
  "actions": {
4250
5061
  "identity": [
4251
5062
  "clientPreferencesUpdate"
@@ -4304,7 +5115,10 @@
4304
5115
  "label": "Country (US or BR)"
4305
5116
  },
4306
5117
  "requirement": {
4307
- "type": "string",
5118
+ "type": [
5119
+ "mandatory",
5120
+ "optional"
5121
+ ],
4308
5122
  "default": "mandatory",
4309
5123
  "label": "Requirement"
4310
5124
  },
@@ -4322,22 +5136,25 @@
4322
5136
  "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
5137
  "docPath": "src/matter/client-profile/client-profile.md"
4324
5138
  },
4325
- "ClientProfileFormRoot": {
4326
- "name": "ClientProfileFormRoot",
5139
+ "ClientProfileFieldset": {
5140
+ "name": "ClientProfileFieldset",
4327
5141
  "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",
5142
+ "fragment": "\n fragment ClientProfileFieldsetData on Query {\n clientProfile {\n __typename\n id\n firstName\n lastName\n phone\n document\n }\n }\n",
4329
5143
  "fetchStrategy": "reactive",
4330
- "requiresContext": "session",
4331
- "providesContext": "client-profile-form",
5144
+ "skeleton": "ClientProfileFieldsetSkeleton",
5145
+ "requiresContext": [
5146
+ "form",
5147
+ "session"
5148
+ ],
5149
+ "providesContext": "client-profile-fieldset",
4332
5150
  "actions": {
4333
5151
  "identity": [
4334
- "clientProfileUpdate",
4335
- "clientPreferencesUpdate"
5152
+ "clientProfileUpdate"
4336
5153
  ]
4337
5154
  },
4338
5155
  "editor": {
4339
- "label": "Client Profile Form Root",
4340
- "category": "action"
5156
+ "label": "Client Profile Fieldset",
5157
+ "category": "identity"
4341
5158
  },
4342
5159
  "schema": {
4343
5160
  "country": {
@@ -4348,205 +5165,143 @@
4348
5165
  "documentType": {
4349
5166
  "type": "string",
4350
5167
  "label": "Document type (e.g. CPF)"
4351
- }
4352
- },
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"
4355
- },
4356
- "ClientProfileFormFieldset": {
4357
- "name": "ClientProfileFormFieldset",
4358
- "importPath": "@vtex/faststore/components",
4359
- "requiresContext": "client-profile-form",
4360
- "editor": {
4361
- "label": "Client Profile Form Fieldset",
4362
- "category": "layout"
4363
- },
4364
- "schema": {
4365
- "legend": {
5168
+ },
5169
+ "skeletonCount": {
5170
+ "type": "number",
5171
+ "default": 4,
5172
+ "label": "Skeleton rows"
5173
+ },
5174
+ "loadingLabel": {
4366
5175
  "type": "string",
4367
- "label": "Legend"
5176
+ "default": "Loading your details",
5177
+ "label": "Loading announcement"
4368
5178
  },
4369
- "section": {
5179
+ "loadedLabel": {
4370
5180
  "type": "string",
4371
- "label": "Section name (data-fs hook)"
4372
- }
4373
- },
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"
4376
- },
4377
- "ClientProfileFormEmailField": {
4378
- "name": "ClientProfileFormEmailField",
4379
- "importPath": "@vtex/faststore/components",
4380
- "requiresContext": "client-profile-form",
4381
- "editor": {
4382
- "label": "Client Profile Email Field",
4383
- "category": "action"
4384
- },
4385
- "schema": {
4386
- "label": {
5181
+ "default": "Your details are ready",
5182
+ "label": "Loaded announcement"
5183
+ },
5184
+ "groupLabel": {
4387
5185
  "type": "string",
4388
- "default": "Email",
4389
- "label": "Label"
5186
+ "default": "Your details",
5187
+ "label": "Accessible group name"
4390
5188
  }
4391
5189
  },
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"
5190
+ "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.",
5191
+ "docPath": "src/matter/client-profile-form/client-profile-fieldset.md"
4394
5192
  },
4395
- "ClientProfileFormFirstNameField": {
4396
- "name": "ClientProfileFormFirstNameField",
5193
+ "ClientProfileFirstNameControl": {
5194
+ "name": "ClientProfileFirstNameControl",
4397
5195
  "importPath": "@vtex/faststore/components",
4398
- "requiresContext": "client-profile-form",
5196
+ "requiresContext": "client-profile-fieldset",
5197
+ "providesContext": "field",
4399
5198
  "editor": {
4400
- "label": "Client Profile First Name Field",
4401
- "category": "action"
5199
+ "label": "Client Profile First Name Control",
5200
+ "category": "identity"
4402
5201
  },
4403
5202
  "schema": {
4404
5203
  "label": {
4405
5204
  "type": "string",
4406
- "default": "First name",
4407
5205
  "label": "Label"
4408
- }
4409
- },
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"
4412
- },
4413
- "ClientProfileFormLastNameField": {
4414
- "name": "ClientProfileFormLastNameField",
4415
- "importPath": "@vtex/faststore/components",
4416
- "requiresContext": "client-profile-form",
4417
- "editor": {
4418
- "label": "Client Profile Last Name Field",
4419
- "category": "action"
4420
- },
4421
- "schema": {
4422
- "label": {
5206
+ },
5207
+ "placeholder": {
4423
5208
  "type": "string",
4424
- "default": "Last name",
4425
- "label": "Label"
5209
+ "label": "Placeholder"
4426
5210
  }
4427
5211
  },
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"
5212
+ "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.",
5213
+ "docPath": "src/matter/client-profile-form/client-profile-fieldset.md"
4430
5214
  },
4431
- "ClientProfileFormPhoneField": {
4432
- "name": "ClientProfileFormPhoneField",
5215
+ "ClientProfileLastNameControl": {
5216
+ "name": "ClientProfileLastNameControl",
4433
5217
  "importPath": "@vtex/faststore/components",
4434
- "requiresContext": "client-profile-form",
5218
+ "requiresContext": "client-profile-fieldset",
5219
+ "providesContext": "field",
4435
5220
  "editor": {
4436
- "label": "Client Profile Phone Field",
4437
- "category": "action"
5221
+ "label": "Client Profile Last Name Control",
5222
+ "category": "identity"
4438
5223
  },
4439
5224
  "schema": {
4440
5225
  "label": {
4441
5226
  "type": "string",
4442
- "default": "Phone number",
4443
5227
  "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": {
5228
+ },
5229
+ "placeholder": {
4459
5230
  "type": "string",
4460
- "default": "CPF",
4461
- "label": "Label"
5231
+ "label": "Placeholder"
4462
5232
  }
4463
5233
  },
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"
5234
+ "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.",
5235
+ "docPath": "src/matter/client-profile-form/client-profile-fieldset.md"
4466
5236
  },
4467
- "ClientProfileFormNewsletterCheckbox": {
4468
- "name": "ClientProfileFormNewsletterCheckbox",
5237
+ "ClientProfileFieldsetPhoneControl": {
5238
+ "name": "ClientProfileFieldsetPhoneControl",
4469
5239
  "importPath": "@vtex/faststore/components",
4470
- "requiresContext": "client-profile-form",
5240
+ "requiresContext": "client-profile-fieldset",
5241
+ "providesContext": [
5242
+ "field",
5243
+ "phone-field"
5244
+ ],
4471
5245
  "editor": {
4472
- "label": "Client Profile Newsletter Checkbox",
4473
- "category": "action"
5246
+ "label": "Client Profile Fieldset Phone Control",
5247
+ "category": "identity"
4474
5248
  },
4475
5249
  "schema": {
4476
5250
  "label": {
4477
5251
  "type": "string",
4478
- "default": "Email me with news and offers",
4479
5252
  "label": "Label"
5253
+ },
5254
+ "placeholder": {
5255
+ "type": "string",
5256
+ "label": "Placeholder"
5257
+ },
5258
+ "requirement": {
5259
+ "type": [
5260
+ "mandatory",
5261
+ "optional"
5262
+ ],
5263
+ "label": "Requirement"
5264
+ },
5265
+ "errorInvalid": {
5266
+ "type": "string",
5267
+ "label": "Invalid error message"
5268
+ },
5269
+ "errorRequired": {
5270
+ "type": "string",
5271
+ "label": "Required error message"
4480
5272
  }
4481
5273
  },
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"
5274
+ "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.",
5275
+ "docPath": "src/matter/client-profile-form/client-profile-fieldset.md"
4484
5276
  },
4485
- "ClientProfileFormSavePersonalDataCheckbox": {
4486
- "name": "ClientProfileFormSavePersonalDataCheckbox",
5277
+ "ClientProfileDocumentControl": {
5278
+ "name": "ClientProfileDocumentControl",
4487
5279
  "importPath": "@vtex/faststore/components",
4488
- "requiresContext": "client-profile-form",
5280
+ "requiresContext": "client-profile-fieldset",
5281
+ "providesContext": [
5282
+ "field",
5283
+ "document-field"
5284
+ ],
4489
5285
  "editor": {
4490
- "label": "Client Profile Save-Personal-Data Checkbox",
4491
- "category": "action"
5286
+ "label": "Client Profile Document Control",
5287
+ "category": "identity"
4492
5288
  },
4493
5289
  "schema": {
4494
5290
  "label": {
4495
5291
  "type": "string",
4496
- "default": "Save my information for next time",
4497
5292
  "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": {
5293
+ },
5294
+ "placeholder": {
4525
5295
  "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": {
5296
+ "label": "Placeholder"
5297
+ },
5298
+ "errorMessage": {
4543
5299
  "type": "string",
4544
- "default": "Save and continue",
4545
- "label": "Button label"
5300
+ "label": "Error message"
4546
5301
  }
4547
5302
  },
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"
5303
+ "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.",
5304
+ "docPath": "src/matter/client-profile-form/client-profile-fieldset.md"
4550
5305
  },
4551
5306
  "DeliveryOptionsAccordion": {
4552
5307
  "name": "DeliveryOptionsAccordion",
@@ -4770,7 +5525,7 @@
4770
5525
  "category": "commerce"
4771
5526
  },
4772
5527
  "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.",
5528
+ "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
5529
  "docPath": "src/matter/identity-edit/identity-edit.md"
4775
5530
  },
4776
5531
  "IdentitySummaryView": {
@@ -4794,7 +5549,7 @@
4794
5549
  "category": "commerce"
4795
5550
  },
4796
5551
  "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.",
5552
+ "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
5553
  "docPath": "src/matter/identity-edit/identity-edit.md"
4799
5554
  },
4800
5555
  "IdentityEditButton": {
@@ -4856,7 +5611,7 @@
4856
5611
  "label": "Sign-out error message"
4857
5612
  }
4858
5613
  },
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.",
5614
+ "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
5615
  "docPath": "src/matter/identity-summary/identity-summary.md"
4861
5616
  },
4862
5617
  "IdentitySummarySelectedSummary": {
@@ -4977,6 +5732,91 @@
4977
5732
  "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
5733
  "docPath": "src/matter/identity-summary/identity-summary.md"
4979
5734
  },
5735
+ "InstallmentsSelect": {
5736
+ "name": "InstallmentsSelect",
5737
+ "importPath": "@vtex/faststore/components",
5738
+ "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",
5739
+ "fetchStrategy": "reactive",
5740
+ "requiresContext": "payment",
5741
+ "actions": {
5742
+ "payment": [
5743
+ "setInstallments"
5744
+ ]
5745
+ },
5746
+ "docPath": "src/matter/installments/installments.md",
5747
+ "editor": {
5748
+ "label": "Installments Select",
5749
+ "category": "commerce"
5750
+ },
5751
+ "schema": {
5752
+ "installmentTemplate": {
5753
+ "type": "string",
5754
+ "default": "{count}x of {value}",
5755
+ "label": "Installment template"
5756
+ },
5757
+ "interestFreeLabel": {
5758
+ "type": "string",
5759
+ "default": "interest-free",
5760
+ "label": "Interest-free label"
5761
+ },
5762
+ "interestTemplate": {
5763
+ "type": "string",
5764
+ "default": "{rate}% interest",
5765
+ "label": "Interest template"
5766
+ },
5767
+ "label": {
5768
+ "type": "string",
5769
+ "default": "Installments",
5770
+ "label": "Accessible label"
5771
+ },
5772
+ "placeholder": {
5773
+ "type": "string",
5774
+ "default": "Select an installment plan",
5775
+ "label": "Placeholder"
5776
+ }
5777
+ },
5778
+ "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."
5779
+ },
5780
+ "Installments": {
5781
+ "name": "Installments",
5782
+ "importPath": "@vtex/faststore/components",
5783
+ "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",
5784
+ "fetchStrategy": "reactive",
5785
+ "requiresContext": "payment",
5786
+ "actions": {
5787
+ "payment": [
5788
+ "setInstallments"
5789
+ ]
5790
+ },
5791
+ "editor": {
5792
+ "label": "Installments",
5793
+ "category": "commerce"
5794
+ },
5795
+ "schema": {
5796
+ "installmentTemplate": {
5797
+ "type": "string",
5798
+ "default": "{count}x of {value}",
5799
+ "label": "Installment template"
5800
+ },
5801
+ "interestFreeLabel": {
5802
+ "type": "string",
5803
+ "default": "interest-free",
5804
+ "label": "Interest-free label"
5805
+ },
5806
+ "interestTemplate": {
5807
+ "type": "string",
5808
+ "default": "{rate}% interest",
5809
+ "label": "Interest template"
5810
+ },
5811
+ "legend": {
5812
+ "type": "string",
5813
+ "default": "Installments",
5814
+ "label": "Legend"
5815
+ }
5816
+ },
5817
+ "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.",
5818
+ "docPath": "src/matter/installments/installments.md"
5819
+ },
4980
5820
  "MyAccountProfileRoot": {
4981
5821
  "name": "MyAccountProfileRoot",
4982
5822
  "importPath": "@vtex/faststore/components",
@@ -5001,10 +5841,12 @@
5001
5841
  },
5002
5842
  "saveFailedMessage": {
5003
5843
  "type": "string",
5844
+ "default": "Unable to save your profile. Please try again.",
5004
5845
  "label": "Save failure message"
5005
5846
  },
5006
5847
  "savedMessage": {
5007
5848
  "type": "string",
5849
+ "default": "Your profile has been saved.",
5008
5850
  "label": "Save success message"
5009
5851
  }
5010
5852
  },
@@ -5247,84 +6089,366 @@
5247
6089
  "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
6090
  "docPath": "src/matter/my-account-profile/my-account-profile.md"
5249
6091
  },
5250
- "PricingRoot": {
5251
- "name": "PricingRoot",
6092
+ "OrderPlacedPaymentSummary": {
6093
+ "name": "OrderPlacedPaymentSummary",
5252
6094
  "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",
6095
+ "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",
6096
+ "fetchStrategy": "reactive",
5256
6097
  "editor": {
5257
- "label": "Pricing",
6098
+ "label": "Order Placed Payment Summary",
5258
6099
  "category": "commerce"
5259
6100
  },
5260
6101
  "schema": {
5261
- "selectedVariantId": {
6102
+ "lastFourTemplate": {
5262
6103
  "type": "string",
5263
- "label": "Selected Variant ID"
6104
+ "default": "•••• {lastFour}",
6105
+ "label": "Last-four template"
6106
+ },
6107
+ "noPaymentRecordLabel": {
6108
+ "type": "string",
6109
+ "default": "Payment method not available",
6110
+ "label": "No payment record label"
6111
+ },
6112
+ "unresolvedOrderLabel": {
6113
+ "type": "string",
6114
+ "default": "Could not load the payment details",
6115
+ "label": "Unresolved order label"
6116
+ },
6117
+ "multiSellerNotice": {
6118
+ "type": "string",
6119
+ "default": "This order was split across {count} sellers; the payment summary does not cover split orders",
6120
+ "label": "Multi-seller notice"
6121
+ },
6122
+ "installmentTemplate": {
6123
+ "type": "string",
6124
+ "default": "{count}x of {total}",
6125
+ "label": "Installment template"
5264
6126
  }
5265
6127
  },
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"
6128
+ "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.",
6129
+ "docPath": "src/matter/order-placed-payment-summary/order-placed-payment-summary.md"
5268
6130
  },
5269
- "PricingSellingPrice": {
5270
- "name": "PricingSellingPrice",
6131
+ "PaymentSectionController": {
6132
+ "name": "PaymentSectionController",
5271
6133
  "importPath": "@vtex/faststore/components",
6134
+ "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",
6135
+ "fetchStrategy": "reactive",
6136
+ "actions": {
6137
+ "payment": [
6138
+ "setMethod",
6139
+ "sendPayments"
6140
+ ],
6141
+ "analytics": [
6142
+ "track"
6143
+ ]
6144
+ },
6145
+ "providesContext": [
6146
+ "payment",
6147
+ "card-capture"
6148
+ ],
6149
+ "hardened": true,
5272
6150
  "editor": {
5273
- "label": "Selling Price",
6151
+ "label": "Payment Section Controller",
5274
6152
  "category": "commerce"
5275
6153
  },
5276
- "schema": {},
5277
- "guideline": "Displays the current selling price; must be a descendant of PricingRoot.",
5278
- "docPath": "src/matter/pricing/pricing.md"
6154
+ "schema": {
6155
+ "group": {
6156
+ "type": "array",
6157
+ "default": [
6158
+ "creditCardPaymentGroup",
6159
+ "debitCardPaymentGroup"
6160
+ ],
6161
+ "label": "Payment method group"
6162
+ }
6163
+ },
6164
+ "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.",
6165
+ "docPath": "src/matter/payment/payment.md"
5279
6166
  },
5280
- "PricingListPrice": {
5281
- "name": "PricingListPrice",
6167
+ "PaymentMethodBadges": {
6168
+ "name": "PaymentMethodBadges",
5282
6169
  "importPath": "@vtex/faststore/components",
6170
+ "requiresContext": "payment",
5283
6171
  "editor": {
5284
- "label": "List Price",
6172
+ "label": "Payment Method Badges",
5285
6173
  "category": "commerce"
5286
6174
  },
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"
6175
+ "schema": {
6176
+ "heading": {
6177
+ "type": "string",
6178
+ "label": "Heading"
6179
+ }
6180
+ },
6181
+ "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.",
6182
+ "docPath": "src/matter/payment/payment-method-badges.md"
5290
6183
  },
5291
- "PricingSpotPrice": {
5292
- "name": "PricingSpotPrice",
6184
+ "AcceptedPaymentMethodBadges": {
6185
+ "name": "AcceptedPaymentMethodBadges",
5293
6186
  "importPath": "@vtex/faststore/components",
6187
+ "fragment": "\n fragment AcceptedPaymentMethodBadgesData on Query {\n payment {\n __typename\n id\n methods {\n __typename\n id\n name\n }\n }\n }\n",
6188
+ "fetchStrategy": "reactive",
5294
6189
  "editor": {
5295
- "label": "Spot Price",
6190
+ "label": "Accepted Payment Method Badges",
5296
6191
  "category": "commerce"
5297
6192
  },
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"
6193
+ "schema": {
6194
+ "heading": {
6195
+ "type": "string",
6196
+ "label": "Heading"
6197
+ }
6198
+ },
6199
+ "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.",
6200
+ "docPath": "src/matter/payment/payment-method-badges.md"
5301
6201
  },
5302
- "PricingInstallments": {
5303
- "name": "PricingInstallments",
6202
+ "PaymentSectionRoot": {
6203
+ "name": "PaymentSectionRoot",
5304
6204
  "importPath": "@vtex/faststore/components",
6205
+ "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",
6206
+ "fetchStrategy": "reactive",
6207
+ "actions": {
6208
+ "payment": [
6209
+ "setMethod",
6210
+ "sendPayments"
6211
+ ],
6212
+ "analytics": [
6213
+ "track"
6214
+ ]
6215
+ },
6216
+ "providesContext": [
6217
+ "payment",
6218
+ "card-capture"
6219
+ ],
6220
+ "hardened": true,
5305
6221
  "editor": {
5306
- "label": "Installments",
6222
+ "label": "Payment Section",
5307
6223
  "category": "commerce"
5308
6224
  },
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"
6225
+ "schema": {
6226
+ "group": {
6227
+ "type": "array",
6228
+ "default": [
6229
+ "creditCardPaymentGroup",
6230
+ "debitCardPaymentGroup"
6231
+ ],
6232
+ "label": "Payment method group"
6233
+ }
6234
+ },
6235
+ "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.",
6236
+ "docPath": "src/matter/payment/payment.md"
5312
6237
  },
5313
- "PricingInstallmentPlans": {
5314
- "name": "PricingInstallmentPlans",
6238
+ "PaymentMethodList": {
6239
+ "name": "PaymentMethodList",
5315
6240
  "importPath": "@vtex/faststore/components",
6241
+ "requiresContext": "payment",
5316
6242
  "editor": {
5317
- "label": "Installment Plans",
6243
+ "label": "Payment Method List",
5318
6244
  "category": "commerce"
5319
6245
  },
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"
5323
- },
5324
- "PricingInstallmentPlan": {
5325
- "name": "PricingInstallmentPlan",
5326
- "importPath": "@vtex/faststore/components",
5327
- "editor": {
6246
+ "schema": {
6247
+ "legend": {
6248
+ "type": "string",
6249
+ "default": "Payment method",
6250
+ "label": "Legend"
6251
+ },
6252
+ "cardLabel": {
6253
+ "type": "string",
6254
+ "default": "Pay with Credit / Debit Card",
6255
+ "label": "Card option label"
6256
+ }
6257
+ },
6258
+ "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.",
6259
+ "docPath": "src/matter/payment/payment.md"
6260
+ },
6261
+ "PlaceOrder": {
6262
+ "name": "PlaceOrder",
6263
+ "importPath": "@vtex/faststore/components",
6264
+ "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",
6265
+ "fetchStrategy": "reactive",
6266
+ "actions": {
6267
+ "payment": [
6268
+ "startTransaction",
6269
+ "gatewayCallback"
6270
+ ],
6271
+ "analytics": [
6272
+ "track"
6273
+ ]
6274
+ },
6275
+ "requiresContext": "payment",
6276
+ "editor": {
6277
+ "label": "Place Order",
6278
+ "category": "commerce"
6279
+ },
6280
+ "schema": {
6281
+ "label": {
6282
+ "type": "string",
6283
+ "default": "Place order",
6284
+ "label": "Button label"
6285
+ },
6286
+ "placingLabel": {
6287
+ "type": "string",
6288
+ "default": "Placing order...",
6289
+ "label": "Button label while placing"
6290
+ },
6291
+ "resumeLabel": {
6292
+ "type": "string",
6293
+ "default": "Complete your order",
6294
+ "label": "Button label while a surviving attempt offers a resume"
6295
+ },
6296
+ "successMessage": {
6297
+ "type": "string",
6298
+ "default": "Order placed successfully.",
6299
+ "label": "Success message"
6300
+ },
6301
+ "missingSubmissionMessage": {
6302
+ "type": "string",
6303
+ "default": "Enter your payment details before placing the order.",
6304
+ "label": "Missing payment submission message"
6305
+ },
6306
+ "missingMethodMessage": {
6307
+ "type": "string",
6308
+ "default": "Choose a payment method before placing the order.",
6309
+ "label": "Missing payment method message"
6310
+ },
6311
+ "invalidTransactionMessage": {
6312
+ "type": "string",
6313
+ "default": "Unable to start the payment. Please try again.",
6314
+ "label": "Invalid transaction message"
6315
+ },
6316
+ "networkErrorMessage": {
6317
+ "type": "string",
6318
+ "default": "Unable to complete the request. Please try again.",
6319
+ "label": "Network error message"
6320
+ },
6321
+ "missingDocumentMessage": {
6322
+ "type": "string",
6323
+ "default": "Enter your document before placing the order.",
6324
+ "label": "Missing document message"
6325
+ },
6326
+ "invalidDocumentMessage": {
6327
+ "type": "string",
6328
+ "default": "Enter a valid document before placing the order.",
6329
+ "label": "Invalid document message"
6330
+ },
6331
+ "unavailableMethodMessage": {
6332
+ "type": "string",
6333
+ "default": "Choose another payment method before placing the order.",
6334
+ "label": "Unavailable payment method message"
6335
+ },
6336
+ "unsavedBillingAddressMessage": {
6337
+ "type": "string",
6338
+ "default": "Save your billing address before placing the order.",
6339
+ "label": "Unsaved billing address message"
6340
+ },
6341
+ "invalidCardDataMessage": {
6342
+ "type": "string",
6343
+ "default": "Enter valid card details before placing the order.",
6344
+ "label": "Invalid card data message"
6345
+ },
6346
+ "invalidSecurityCodeMessage": {
6347
+ "type": "string",
6348
+ "default": "Enter a valid security code before placing the order.",
6349
+ "label": "Invalid security code message"
6350
+ },
6351
+ "gatewayErrorMessage": {
6352
+ "type": "string",
6353
+ "default": "Unable to complete the payment. Please try again.",
6354
+ "label": "Gateway error message"
6355
+ },
6356
+ "inFlightMessage": {
6357
+ "type": "string",
6358
+ "default": "This order is already being placed. Please wait.",
6359
+ "label": "Order already in flight message"
6360
+ },
6361
+ "unconfirmedMessage": {
6362
+ "type": "string",
6363
+ "default": "We could not confirm your order yet. Your payment may still be processing, so please do not pay again.",
6364
+ "label": "Unconfirmed order message"
6365
+ },
6366
+ "successHref": {
6367
+ "type": "string",
6368
+ "label": "Confirmation route template ({orderGroup} token)"
6369
+ }
6370
+ },
6371
+ "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.",
6372
+ "docPath": "src/matter/place-order/place-order.md"
6373
+ },
6374
+ "PricingRoot": {
6375
+ "name": "PricingRoot",
6376
+ "importPath": "@vtex/faststore/components",
6377
+ "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",
6378
+ "fetchStrategy": "lazy",
6379
+ "skeleton": "PricingSkeleton",
6380
+ "editor": {
6381
+ "label": "Pricing",
6382
+ "category": "commerce"
6383
+ },
6384
+ "schema": {
6385
+ "selectedVariantId": {
6386
+ "type": "string",
6387
+ "label": "Selected Variant ID"
6388
+ }
6389
+ },
6390
+ "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.",
6391
+ "docPath": "src/matter/pricing/pricing.md"
6392
+ },
6393
+ "PricingSellingPrice": {
6394
+ "name": "PricingSellingPrice",
6395
+ "importPath": "@vtex/faststore/components",
6396
+ "editor": {
6397
+ "label": "Selling Price",
6398
+ "category": "commerce"
6399
+ },
6400
+ "schema": {},
6401
+ "guideline": "Displays the current selling price; must be a descendant of PricingRoot.",
6402
+ "docPath": "src/matter/pricing/pricing.md"
6403
+ },
6404
+ "PricingListPrice": {
6405
+ "name": "PricingListPrice",
6406
+ "importPath": "@vtex/faststore/components",
6407
+ "editor": {
6408
+ "label": "List Price",
6409
+ "category": "commerce"
6410
+ },
6411
+ "schema": {},
6412
+ "guideline": "Displays the original (strikethrough) list price; only renders when a discount exists. Must be a descendant of PricingRoot.",
6413
+ "docPath": "src/matter/pricing/pricing.md"
6414
+ },
6415
+ "PricingSpotPrice": {
6416
+ "name": "PricingSpotPrice",
6417
+ "importPath": "@vtex/faststore/components",
6418
+ "editor": {
6419
+ "label": "Spot Price",
6420
+ "category": "commerce"
6421
+ },
6422
+ "schema": {},
6423
+ "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.",
6424
+ "docPath": "src/matter/pricing/pricing.md"
6425
+ },
6426
+ "PricingInstallments": {
6427
+ "name": "PricingInstallments",
6428
+ "importPath": "@vtex/faststore/components",
6429
+ "editor": {
6430
+ "label": "Installments",
6431
+ "category": "commerce"
6432
+ },
6433
+ "schema": {},
6434
+ "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.",
6435
+ "docPath": "src/matter/pricing/pricing.md"
6436
+ },
6437
+ "PricingInstallmentPlans": {
6438
+ "name": "PricingInstallmentPlans",
6439
+ "importPath": "@vtex/faststore/components",
6440
+ "editor": {
6441
+ "label": "Installment Plans",
6442
+ "category": "commerce"
6443
+ },
6444
+ "schema": {},
6445
+ "guideline": "Renders one row per payment method; use PricingInstallments instead when only the single best plan is needed. Must be a descendant of PricingRoot.",
6446
+ "docPath": "src/matter/pricing/pricing.md"
6447
+ },
6448
+ "PricingInstallmentPlan": {
6449
+ "name": "PricingInstallmentPlan",
6450
+ "importPath": "@vtex/faststore/components",
6451
+ "editor": {
5328
6452
  "label": "Installment Plan",
5329
6453
  "category": "commerce"
5330
6454
  },
@@ -5863,24 +6987,74 @@
5863
6987
  "ProductShelfRoot": {
5864
6988
  "name": "ProductShelfRoot",
5865
6989
  "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",
6990
+ "fragment": "\n fragment ProductShelfData on Query {\n products(\n first: $first\n orderBy: $orderBy\n filter: {\n categoryIds: $categoryId\n brandIds: $brandId\n collectionId: $collectionId\n searchTerm: $searchTerm\n availableOnly: $availableOnly\n }\n ) {\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
6991
  "fetchStrategy": "lazy",
5868
6992
  "skeleton": "ProductShelfSkeleton",
6993
+ "contentTypeId": "product-shelf",
6994
+ "variables": {
6995
+ "orderBy": {
6996
+ "from": "sort",
6997
+ "values": {
6998
+ "relevance": {
6999
+ "field": "RELEVANCE",
7000
+ "direction": "DESC"
7001
+ },
7002
+ "price_asc": {
7003
+ "field": "PRICE",
7004
+ "direction": "ASC"
7005
+ },
7006
+ "price_desc": {
7007
+ "field": "PRICE",
7008
+ "direction": "DESC"
7009
+ },
7010
+ "name_asc": {
7011
+ "field": "TITLE",
7012
+ "direction": "ASC"
7013
+ },
7014
+ "name_desc": {
7015
+ "field": "TITLE",
7016
+ "direction": "DESC"
7017
+ },
7018
+ "release": {
7019
+ "field": "RELEASE_DATE",
7020
+ "direction": "DESC"
7021
+ },
7022
+ "orders": {
7023
+ "field": "BEST_SELLING",
7024
+ "direction": "DESC"
7025
+ },
7026
+ "discount": {
7027
+ "field": "RELEVANCE",
7028
+ "direction": "DESC"
7029
+ }
7030
+ }
7031
+ }
7032
+ },
5869
7033
  "editor": {
5870
7034
  "label": "Product Shelf Root",
5871
7035
  "category": "commerce"
5872
7036
  },
5873
7037
  "providesContext": "product-shelf",
5874
7038
  "schema": {
5875
- "first": {
7039
+ "itemsPerPage": {
5876
7040
  "type": "number",
5877
7041
  "default": 5,
5878
- "label": "Number of Products"
7042
+ "label": "Items Per Page"
5879
7043
  },
5880
- "itemsPerPage": {
7044
+ "usePriceWithTaxes": {
7045
+ "type": "boolean",
7046
+ "default": false,
7047
+ "label": "Use Price With Taxes"
7048
+ },
7049
+ "taxesLabel": {
7050
+ "type": "string",
7051
+ "default": "Tax included",
7052
+ "label": "Taxes Label"
7053
+ },
7054
+ "first": {
5881
7055
  "type": "number",
5882
7056
  "default": 5,
5883
- "label": "Items Per Page"
7057
+ "label": "Number of Products"
5884
7058
  },
5885
7059
  "sort": {
5886
7060
  "type": [
@@ -5912,27 +7086,13 @@
5912
7086
  "type": "string",
5913
7087
  "label": "Collection ID"
5914
7088
  },
5915
- "specifications": {
5916
- "type": "array",
5917
- "label": "Specification Filters"
5918
- },
5919
7089
  "availableOnly": {
5920
7090
  "type": "boolean",
5921
7091
  "default": false,
5922
7092
  "label": "Available Only"
5923
- },
5924
- "usePriceWithTaxes": {
5925
- "type": "boolean",
5926
- "default": false,
5927
- "label": "Use Price With Taxes"
5928
- },
5929
- "taxesLabel": {
5930
- "type": "string",
5931
- "default": "Tax included",
5932
- "label": "Taxes Label"
5933
7093
  }
5934
7094
  },
5935
- "guideline": "Data-owning root of a facet-sourced product shelf. Owns a products(filter:) fragment and receives $data lazily. Compose as: ProductShelfRoot > (ProductShelfHeading + CarouselRoot > (ProductShelfItems + CarouselPrevious + CarouselNext + CarouselBullets)). Compose ProductShelfHeading with the title as its children to render a heading; set the source with categoryId / brandId / collectionId / searchTerm / specifications and tune first, sort, availableOnly. Renders a skeleton while loading and nothing when the result is empty. Bind itemsPerPage to the CarouselRoot so paging matches the shelf config. See product-shelf.md.",
7095
+ "guideline": "Data-owning root of a facet-sourced product shelf. Owns a products(first:, orderBy:, filter:) fragment whose variables bind to this element: the merchant fills them in the CMS (content model product-shelf) and the props of the same name are the defaults. Receives $data lazily. Compose as: ProductShelfRoot > (ProductShelfHeading + CarouselRoot > (ProductShelfItems + CarouselPrevious + CarouselNext + CarouselBullets)). Compose ProductShelfHeading with the title as its children to render a heading; set the source with categoryId / brandId / collectionId / searchTerm and tune first, sort, availableOnly. Renders a skeleton while loading and nothing when the result is empty. Bind itemsPerPage to the CarouselRoot so paging matches the shelf config. See product-shelf.md.",
5936
7096
  "docPath": "src/matter/product-shelf/product-shelf.md"
5937
7097
  },
5938
7098
  "ProductShelfItems": {
@@ -6138,6 +7298,118 @@
6138
7298
  "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
7299
  "docPath": "src/matter/region/region.md"
6140
7300
  },
7301
+ "SaveCard": {
7302
+ "name": "SaveCard",
7303
+ "importPath": "@vtex/faststore/components",
7304
+ "fragment": "\n fragment SaveCardData on Query {\n clientPreferences {\n __typename\n id\n savePersonalData\n }\n }\n",
7305
+ "fetchStrategy": "reactive",
7306
+ "requiresContext": [
7307
+ "payment",
7308
+ "session"
7309
+ ],
7310
+ "actions": {
7311
+ "payment": [
7312
+ "saveCard"
7313
+ ]
7314
+ },
7315
+ "editor": {
7316
+ "label": "Save Card",
7317
+ "category": "commerce"
7318
+ },
7319
+ "schema": {
7320
+ "label": {
7321
+ "type": "string",
7322
+ "default": "Save this card for next time",
7323
+ "label": "Toggle label"
7324
+ },
7325
+ "nicknameLabel": {
7326
+ "type": "string",
7327
+ "default": "Card nickname",
7328
+ "label": "Nickname field label"
7329
+ },
7330
+ "nicknamePlaceholder": {
7331
+ "type": "string",
7332
+ "label": "Nickname field placeholder"
7333
+ },
7334
+ "consentNoticeLabel": {
7335
+ "type": "string",
7336
+ "default": "Checking this also lets us store your personal data for future purchases.",
7337
+ "label": "Consent notice label"
7338
+ },
7339
+ "disabled": {
7340
+ "type": "boolean",
7341
+ "default": false,
7342
+ "label": "Disabled"
7343
+ }
7344
+ },
7345
+ "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.",
7346
+ "docPath": "src/matter/save-card/save-card.md"
7347
+ },
7348
+ "SavedCards": {
7349
+ "name": "SavedCards",
7350
+ "importPath": "@vtex/faststore/components",
7351
+ "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",
7352
+ "fetchStrategy": "reactive",
7353
+ "requiresContext": "payment",
7354
+ "providesContext": "saved-card",
7355
+ "editor": {
7356
+ "label": "Saved Cards",
7357
+ "category": "commerce"
7358
+ },
7359
+ "schema": {
7360
+ "legend": {
7361
+ "type": "string",
7362
+ "default": "Saved cards",
7363
+ "label": "Legend"
7364
+ }
7365
+ },
7366
+ "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.",
7367
+ "docPath": "src/matter/saved-cards/saved-cards.md"
7368
+ },
7369
+ "SavedCardOption": {
7370
+ "name": "SavedCardOption",
7371
+ "importPath": "@vtex/faststore/components",
7372
+ "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",
7373
+ "fetchStrategy": "reactive-list-item",
7374
+ "requiresContext": "saved-card",
7375
+ "providesContext": "saved-card-data",
7376
+ "editor": {
7377
+ "label": "Saved Card Option",
7378
+ "category": "commerce"
7379
+ },
7380
+ "schema": {},
7381
+ "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.",
7382
+ "docPath": "src/matter/saved-cards/saved-cards.md"
7383
+ },
7384
+ "SavedCardCvvField": {
7385
+ "name": "SavedCardCvvField",
7386
+ "importPath": "@vtex/faststore/components",
7387
+ "requiresContext": "saved-card-data",
7388
+ "actions": {
7389
+ "payment": [
7390
+ "sendPayments"
7391
+ ]
7392
+ },
7393
+ "hardened": true,
7394
+ "editor": {
7395
+ "label": "Saved Card CVV Field",
7396
+ "category": "commerce"
7397
+ },
7398
+ "schema": {
7399
+ "securityCodeLabel": {
7400
+ "type": "string",
7401
+ "default": "Security code",
7402
+ "label": "Security code label"
7403
+ },
7404
+ "securityCodeDescription": {
7405
+ "type": "string",
7406
+ "default": "The 3-4 digit number on your card",
7407
+ "label": "Security code description"
7408
+ }
7409
+ },
7410
+ "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.",
7411
+ "docPath": "src/matter/saved-cards/saved-cards.md"
7412
+ },
6141
7413
  "SessionRoot": {
6142
7414
  "name": "SessionRoot",
6143
7415
  "importPath": "@vtex/faststore/components",
@@ -6174,328 +7446,245 @@
6174
7446
  "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
7447
  "docPath": "src/matter/session/session.md"
6176
7448
  },
6177
- "ShippingAddressRoot": {
6178
- "name": "ShippingAddressRoot",
7449
+ "ShippingAddressFieldset": {
7450
+ "name": "ShippingAddressFieldset",
6179
7451
  "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",
7452
+ "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
7453
  "fetchStrategy": "reactive",
6182
- "providesContext": "shipping-address",
7454
+ "skeleton": "ShippingAddressFieldsetSkeleton",
6183
7455
  "actions": {
6184
7456
  "shipping": [
6185
7457
  "setAddress"
6186
7458
  ]
6187
7459
  },
7460
+ "requiresContext": "form",
7461
+ "providesContext": "shipping-address",
6188
7462
  "editor": {
6189
- "label": "Shipping Address Root",
6190
- "category": "content"
7463
+ "label": "Shipping Address Fieldset",
7464
+ "category": "commerce"
6191
7465
  },
6192
7466
  "schema": {
6193
7467
  "defaultCountry": {
6194
7468
  "type": "string",
6195
7469
  "default": "BRA",
6196
7470
  "label": "Default country (ISO-3)"
7471
+ },
7472
+ "skeletonCount": {
7473
+ "type": "number",
7474
+ "default": 9,
7475
+ "label": "Skeleton rows"
7476
+ },
7477
+ "loadingLabel": {
7478
+ "type": "string",
7479
+ "default": "Loading your delivery address",
7480
+ "label": "Loading announcement"
7481
+ },
7482
+ "loadedLabel": {
7483
+ "type": "string",
7484
+ "default": "Your delivery address is ready",
7485
+ "label": "Loaded announcement"
7486
+ },
7487
+ "groupLabel": {
7488
+ "type": "string",
7489
+ "default": "Your delivery address",
7490
+ "label": "Accessible group name"
6197
7491
  }
6198
7492
  },
6199
- "guideline": "Country-adaptive single-address delivery form; batches all fields and writes once via shipping.setAddress. See shipping-address.md.",
7493
+ "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
7494
  "docPath": "src/matter/shipping-address/shipping-address.md"
6201
7495
  },
6202
7496
  "ShippingAddressRecipientNameControl": {
6203
7497
  "name": "ShippingAddressRecipientNameControl",
6204
7498
  "importPath": "@vtex/faststore/components",
6205
7499
  "requiresContext": "shipping-address",
7500
+ "providesContext": "field",
6206
7501
  "editor": {
6207
7502
  "label": "Recipient Name Control",
6208
7503
  "category": "action"
6209
7504
  },
6210
- "schema": {},
6211
- "guideline": "Recipient-name input field; required for submit. Must be a descendant of ShippingAddressRoot.",
7505
+ "schema": {
7506
+ "label": {
7507
+ "type": "string",
7508
+ "label": "Field label"
7509
+ },
7510
+ "placeholder": {
7511
+ "type": "string",
7512
+ "label": "Placeholder"
7513
+ }
7514
+ },
7515
+ "guideline": "Recipient-name input field; required for submit. ",
6212
7516
  "docPath": "src/matter/shipping-address/shipping-address.md"
6213
7517
  },
6214
7518
  "ShippingAddressStreetControl": {
6215
7519
  "name": "ShippingAddressStreetControl",
6216
7520
  "importPath": "@vtex/faststore/components",
6217
7521
  "requiresContext": "shipping-address",
7522
+ "providesContext": "field",
6218
7523
  "editor": {
6219
7524
  "label": "Street Control",
6220
7525
  "category": "action"
6221
7526
  },
6222
- "schema": {},
6223
- "guideline": "Street name input field. Must be a descendant of ShippingAddressRoot.",
7527
+ "schema": {
7528
+ "label": {
7529
+ "type": "string",
7530
+ "label": "Field label"
7531
+ },
7532
+ "placeholder": {
7533
+ "type": "string",
7534
+ "label": "Placeholder"
7535
+ }
7536
+ },
7537
+ "guideline": "Street name input field. ",
6224
7538
  "docPath": "src/matter/shipping-address/shipping-address.md"
6225
7539
  },
6226
7540
  "ShippingAddressNumberControl": {
6227
7541
  "name": "ShippingAddressNumberControl",
6228
7542
  "importPath": "@vtex/faststore/components",
6229
7543
  "requiresContext": "shipping-address",
7544
+ "providesContext": "field",
6230
7545
  "editor": {
6231
7546
  "label": "Number Control",
6232
7547
  "category": "action"
6233
7548
  },
6234
- "schema": {},
6235
- "guideline": "Street number input field. Must be a descendant of ShippingAddressRoot.",
7549
+ "schema": {
7550
+ "label": {
7551
+ "type": "string",
7552
+ "label": "Field label"
7553
+ },
7554
+ "placeholder": {
7555
+ "type": "string",
7556
+ "label": "Placeholder"
7557
+ }
7558
+ },
7559
+ "guideline": "Street number input field. ",
6236
7560
  "docPath": "src/matter/shipping-address/shipping-address.md"
6237
7561
  },
6238
7562
  "ShippingAddressCityControl": {
6239
7563
  "name": "ShippingAddressCityControl",
6240
7564
  "importPath": "@vtex/faststore/components",
6241
7565
  "requiresContext": "shipping-address",
7566
+ "providesContext": "field",
6242
7567
  "editor": {
6243
7568
  "label": "City Control",
6244
7569
  "category": "action"
6245
7570
  },
6246
- "schema": {},
6247
- "guideline": "City name input field. Must be a descendant of ShippingAddressRoot.",
7571
+ "schema": {
7572
+ "label": {
7573
+ "type": "string",
7574
+ "label": "Field label"
7575
+ },
7576
+ "placeholder": {
7577
+ "type": "string",
7578
+ "label": "Placeholder"
7579
+ }
7580
+ },
7581
+ "guideline": "City name input field. ",
6248
7582
  "docPath": "src/matter/shipping-address/shipping-address.md"
6249
7583
  },
6250
7584
  "ShippingAddressStateControl": {
6251
7585
  "name": "ShippingAddressStateControl",
6252
7586
  "importPath": "@vtex/faststore/components",
6253
7587
  "requiresContext": "shipping-address",
7588
+ "providesContext": "field",
6254
7589
  "editor": {
6255
7590
  "label": "State Control",
6256
7591
  "category": "action"
6257
7592
  },
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
7593
  "schema": {
6307
7594
  "label": {
6308
7595
  "type": "string",
6309
- "default": "país",
6310
7596
  "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": {
7597
+ },
7598
+ "placeholder": {
6338
7599
  "type": "string",
6339
- "label": "Saved address ID"
7600
+ "label": "Placeholder"
6340
7601
  }
6341
7602
  },
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.",
7603
+ "guideline": "State/province input field. ",
6343
7604
  "docPath": "src/matter/shipping-address/shipping-address.md"
6344
7605
  },
6345
- "ShippingAddressSubmit": {
6346
- "name": "ShippingAddressSubmit",
7606
+ "ShippingAddressPostalCodeControl": {
7607
+ "name": "ShippingAddressPostalCodeControl",
6347
7608
  "importPath": "@vtex/faststore/components",
6348
7609
  "requiresContext": "shipping-address",
7610
+ "providesContext": "field",
6349
7611
  "editor": {
6350
- "label": "Shipping Address Submit",
7612
+ "label": "Postal Code Control",
6351
7613
  "category": "action"
6352
7614
  },
6353
7615
  "schema": {
6354
7616
  "label": {
6355
7617
  "type": "string",
6356
- "default": "salvar endereço",
6357
- "label": "Button label"
7618
+ "label": "Field label"
6358
7619
  },
6359
- "pendingLabel": {
7620
+ "placeholder": {
6360
7621
  "type": "string",
6361
- "default": "salvando...",
6362
- "label": "Pending label"
7622
+ "label": "Placeholder"
6363
7623
  }
6364
7624
  },
6365
- "guideline": "Submit button; dispatches the batched address write. Disabled until recipient name is non-blank. Must be a descendant of ShippingAddressRoot.",
7625
+ "guideline": "Postal code input field. ",
6366
7626
  "docPath": "src/matter/shipping-address/shipping-address.md"
6367
7627
  },
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.",
6390
- "docPath": "src/matter/shipping-address/shipping-address.md"
6391
- },
6392
- "ShippingAddressSavedAddressSubmit": {
6393
- "name": "ShippingAddressSavedAddressSubmit",
7628
+ "ShippingAddressComplementControl": {
7629
+ "name": "ShippingAddressComplementControl",
6394
7630
  "importPath": "@vtex/faststore/components",
6395
7631
  "requiresContext": "shipping-address",
7632
+ "providesContext": "field",
6396
7633
  "editor": {
6397
- "label": "Saved Address Submit",
7634
+ "label": "Complement Control",
6398
7635
  "category": "action"
6399
7636
  },
6400
7637
  "schema": {
6401
7638
  "label": {
6402
7639
  "type": "string",
6403
- "default": "selecionar",
6404
- "label": "Button label"
7640
+ "label": "Field label"
6405
7641
  },
6406
- "pendingLabel": {
7642
+ "placeholder": {
6407
7643
  "type": "string",
6408
- "default": "selecionando...",
6409
- "label": "Pending label"
7644
+ "label": "Placeholder"
6410
7645
  }
6411
7646
  },
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.",
7647
+ "guideline": "Complement (apartment, suite, etc.) input field. ",
6413
7648
  "docPath": "src/matter/shipping-address/shipping-address.md"
6414
7649
  },
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",
7650
+ "ShippingAddressNeighborhoodControl": {
7651
+ "name": "ShippingAddressNeighborhoodControl",
6430
7652
  "importPath": "@vtex/faststore/components",
6431
7653
  "requiresContext": "shipping-address",
6432
- "providesContext": "shipping-address-section",
6433
- "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",
7654
+ "providesContext": "field",
6469
7655
  "editor": {
6470
- "label": "Shipping Address Edit Button",
7656
+ "label": "Neighborhood Control",
6471
7657
  "category": "action"
6472
7658
  },
6473
7659
  "schema": {
6474
7660
  "label": {
6475
7661
  "type": "string",
6476
- "default": "editar",
6477
- "label": "Button label"
7662
+ "label": "Field label"
7663
+ },
7664
+ "placeholder": {
7665
+ "type": "string",
7666
+ "label": "Placeholder"
6478
7667
  }
6479
7668
  },
6480
- "guideline": "CTA that switches the view/edit mode to edit. Typically placed inside a ShippingAddressSummaryView, next to SelectedSummary. Must be inside ShippingAddressEditController.",
7669
+ "guideline": "Neighborhood (bairro) input field; shown only for countries that have this field (BR in v1). ",
6481
7670
  "docPath": "src/matter/shipping-address/shipping-address.md"
6482
7671
  },
6483
- "ShippingAddressCancelButton": {
6484
- "name": "ShippingAddressCancelButton",
7672
+ "ShippingAddressCountryControl": {
7673
+ "name": "ShippingAddressCountryControl",
6485
7674
  "importPath": "@vtex/faststore/components",
6486
- "requiresContext": "shipping-address-section",
7675
+ "requiresContext": "shipping-address",
7676
+ "providesContext": "field",
6487
7677
  "editor": {
6488
- "label": "Shipping Address Cancel Button",
7678
+ "label": "Country Control",
6489
7679
  "category": "action"
6490
7680
  },
6491
7681
  "schema": {
6492
7682
  "label": {
6493
7683
  "type": "string",
6494
- "default": "cancelar",
6495
- "label": "Button label"
7684
+ "label": "Field label"
6496
7685
  }
6497
7686
  },
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.",
7687
+ "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
7688
  "docPath": "src/matter/shipping-address/shipping-address.md"
6500
7689
  },
6501
7690
  "ShippingSimulatorRoot": {