@vtex/faststore 0.0.10 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +0 -1
  3. package/dist/actions.json +6 -1
  4. package/dist/catalog.json +789 -1701
  5. package/dist/cli/index.d.ts +66 -28
  6. package/dist/cli/index.js +7371 -512
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/cli/server-runtime.js +41 -60
  9. package/dist/cli/server-runtime.js.map +1 -1
  10. package/dist/client.d.ts +3 -3
  11. package/dist/client.js +2 -2
  12. package/dist/components.d.ts +63 -57
  13. package/dist/components.js +60 -54
  14. package/dist/content-types.json +5785 -754
  15. package/dist/core/dist/define-component.d.ts +1 -1
  16. package/dist/core/dist/define-content-type.d.ts +50 -2
  17. package/dist/core/dist/define-content-type.js +107 -3
  18. package/dist/core/dist/define-content-type.js.map +1 -1
  19. package/dist/core/dist/index.d.ts +2 -2
  20. package/dist/docs/access-code-field.md +1 -1
  21. package/dist/docs/access-code-sign-in.md +126 -77
  22. package/dist/docs/account-address-book.md +210 -95
  23. package/dist/docs/account-menu.md +14 -15
  24. package/dist/docs/account-saved-cards.md +44 -39
  25. package/dist/docs/alert-dialog.md +3 -1
  26. package/dist/docs/avatar.md +4 -2
  27. package/dist/docs/billing-address.md +99 -30
  28. package/dist/docs/binding-switcher.md +5 -2
  29. package/dist/docs/buy-button.md +7 -8
  30. package/dist/docs/card-entry.md +39 -26
  31. package/dist/docs/card-summary.md +18 -8
  32. package/dist/docs/cardholder-document.md +5 -3
  33. package/dist/docs/carousel.md +5 -4
  34. package/dist/docs/cart-destination.md +39 -26
  35. package/dist/docs/cart-item.md +29 -14
  36. package/dist/docs/cart-totalizer.md +7 -5
  37. package/dist/docs/cart.md +135 -41
  38. package/dist/docs/challenge-return.md +135 -0
  39. package/dist/docs/client-preferences-fieldset.md +10 -5
  40. package/dist/docs/client-preferences.md +31 -8
  41. package/dist/docs/client-profile-fieldset.md +20 -6
  42. package/dist/docs/client-profile.md +12 -3
  43. package/dist/docs/copy-text.md +9 -7
  44. package/dist/docs/document-field.md +1 -1
  45. package/dist/docs/email-field.md +2 -1
  46. package/dist/docs/email-identification.md +12 -2
  47. package/dist/docs/footer-copyright.md +4 -2
  48. package/dist/docs/form.md +54 -18
  49. package/dist/docs/free-shipping-progress.md +6 -5
  50. package/dist/docs/identity-edit.md +8 -2
  51. package/dist/docs/identity-summary.md +18 -5
  52. package/dist/docs/installments.md +46 -32
  53. package/dist/docs/my-account-profile.md +16 -11
  54. package/dist/docs/navigation-link.md +5 -3
  55. package/dist/docs/order-cancel.md +3 -1
  56. package/dist/docs/order-delivery-address.md +7 -5
  57. package/dist/docs/order-delivery-group.md +1 -3
  58. package/dist/docs/order-details-back.md +1 -1
  59. package/dist/docs/order-details-header.md +1 -4
  60. package/dist/docs/order-invoice-download.md +60 -0
  61. package/dist/docs/order-list-row.md +1 -1
  62. package/dist/docs/order-list-search.md +13 -20
  63. package/dist/docs/order-list-views.md +11 -17
  64. package/dist/docs/order-list.md +12 -5
  65. package/dist/docs/order-payment.md +9 -7
  66. package/dist/docs/order-placed-date.md +1 -1
  67. package/dist/docs/order-placed-payment-summary.md +28 -15
  68. package/dist/docs/order-placed.md +49 -14
  69. package/dist/docs/order-progress.md +1 -1
  70. package/dist/docs/order-status-badge.md +20 -9
  71. package/dist/docs/order-summary.md +2 -2
  72. package/dist/docs/order-tracking-link.md +58 -0
  73. package/dist/docs/payment-method-badges.md +30 -4
  74. package/dist/docs/payment-methods.md +1 -1
  75. package/dist/docs/payment.md +36 -17
  76. package/dist/docs/phone-field.md +4 -4
  77. package/dist/docs/place-order.md +84 -36
  78. package/dist/docs/postal-code-field.md +3 -1
  79. package/dist/docs/pricing.md +21 -23
  80. package/dist/docs/product-gallery.md +19 -20
  81. package/dist/docs/product-information.md +13 -9
  82. package/dist/docs/product-list.md +7 -6
  83. package/dist/docs/product-shelf.md +0 -1
  84. package/dist/docs/promotion.md +4 -2
  85. package/dist/docs/region.md +23 -15
  86. package/dist/docs/save-card.md +7 -6
  87. package/dist/docs/saved-cards.md +65 -36
  88. package/dist/docs/shipping-address.md +57 -21
  89. package/dist/docs/shipping-simulator.md +53 -15
  90. package/dist/docs/sign-in-disclosure.md +176 -0
  91. package/dist/docs/sign-in-form.md +78 -47
  92. package/dist/docs/sign-in-redirect.md +4 -2
  93. package/dist/docs/sign-in.md +173 -0
  94. package/dist/docs/toast.md +15 -4
  95. package/dist/docs/variant-selector.md +15 -11
  96. package/dist/graphql/types.d.ts +4 -14
  97. package/dist/index.d.ts +2 -2
  98. package/dist/internal/client.d.ts +1 -3
  99. package/dist/internal/client.js +1 -1
  100. package/dist/internal/server.d.ts +7 -4
  101. package/dist/internal/server.js +7 -4
  102. package/dist/matter/access-code-sign-in/access-code-sign-in.d.ts +250 -66
  103. package/dist/matter/access-code-sign-in/access-code-sign-in.js +459 -188
  104. package/dist/matter/access-code-sign-in/access-code-sign-in.js.map +1 -1
  105. package/dist/matter/account-address-book/account-address-book-delete.d.ts +78 -40
  106. package/dist/matter/account-address-book/account-address-book-delete.js +86 -50
  107. package/dist/matter/account-address-book/account-address-book-delete.js.map +1 -1
  108. package/dist/matter/account-address-book/account-address-book-deliverability.d.ts +21 -4
  109. package/dist/matter/account-address-book/account-address-book-deliverability.js +45 -17
  110. package/dist/matter/account-address-book/account-address-book-deliverability.js.map +1 -1
  111. package/dist/matter/account-address-book/account-address-book-form-parts.d.ts +74 -19
  112. package/dist/matter/account-address-book/account-address-book-form-parts.js +77 -26
  113. package/dist/matter/account-address-book/account-address-book-form-parts.js.map +1 -1
  114. package/dist/matter/account-address-book/account-address-book-profile-notice.d.ts +27 -6
  115. package/dist/matter/account-address-book/account-address-book-profile-notice.js +55 -28
  116. package/dist/matter/account-address-book/account-address-book-profile-notice.js.map +1 -1
  117. package/dist/matter/account-address-book/account-address-book.d.ts +67 -14
  118. package/dist/matter/account-address-book/account-address-book.js +74 -33
  119. package/dist/matter/account-address-book/account-address-book.js.map +1 -1
  120. package/dist/matter/account-address-book/account-address-country-switch.js +3 -3
  121. package/dist/matter/account-address-book/account-address-country-switch.js.map +1 -1
  122. package/dist/matter/account-address-book/account-address-country.d.ts +66 -20
  123. package/dist/matter/account-address-book/account-address-country.js +83 -49
  124. package/dist/matter/account-address-book/account-address-country.js.map +1 -1
  125. package/dist/matter/account-address-book/account-address-form-context.d.ts +8 -4
  126. package/dist/matter/account-address-book/account-address-form-context.js.map +1 -1
  127. package/dist/matter/account-address-book/account-address-form.d.ts +468 -45
  128. package/dist/matter/account-address-book/account-address-form.js +518 -155
  129. package/dist/matter/account-address-book/account-address-form.js.map +1 -1
  130. package/dist/matter/account-address-book/account-address-record.d.ts +27 -6
  131. package/dist/matter/account-address-book/account-address-record.js +32 -17
  132. package/dist/matter/account-address-book/account-address-record.js.map +1 -1
  133. package/dist/matter/account-menu/account-menu.d.ts +34 -17
  134. package/dist/matter/account-menu/account-menu.js +46 -54
  135. package/dist/matter/account-menu/account-menu.js.map +1 -1
  136. package/dist/matter/account-menu-identity/account-menu-identity.js +1 -1
  137. package/dist/matter/account-saved-cards/account-saved-cards.d.ts +108 -28
  138. package/dist/matter/account-saved-cards/account-saved-cards.js +177 -122
  139. package/dist/matter/account-saved-cards/account-saved-cards.js.map +1 -1
  140. package/dist/matter/billing-address/billing-address.d.ts +156 -74
  141. package/dist/matter/billing-address/billing-address.js +227 -156
  142. package/dist/matter/billing-address/billing-address.js.map +1 -1
  143. package/dist/matter/breadcrumb/breadcrumb.d.ts +21 -3
  144. package/dist/matter/breadcrumb/breadcrumb.js +24 -9
  145. package/dist/matter/breadcrumb/breadcrumb.js.map +1 -1
  146. package/dist/matter/buy-button/buy-button.d.ts +8 -11
  147. package/dist/matter/buy-button/buy-button.js +10 -19
  148. package/dist/matter/buy-button/buy-button.js.map +1 -1
  149. package/dist/matter/card-entry/card-capture.js +12 -4
  150. package/dist/matter/card-entry/card-capture.js.map +1 -1
  151. package/dist/matter/card-entry/card-entry.d.ts +123 -32
  152. package/dist/matter/card-entry/card-entry.js +348 -221
  153. package/dist/matter/card-entry/card-entry.js.map +1 -1
  154. package/dist/matter/cart/cart-namespace.d.ts +7 -1
  155. package/dist/matter/cart/cart-namespace.js +7 -1
  156. package/dist/matter/cart/cart-namespace.js.map +1 -1
  157. package/dist/matter/cart/cart.d.ts +402 -61
  158. package/dist/matter/cart/cart.js +624 -153
  159. package/dist/matter/cart/cart.js.map +1 -1
  160. package/dist/matter/cart-destination/cart-destination.d.ts +30 -19
  161. package/dist/matter/cart-destination/cart-destination.js +160 -70
  162. package/dist/matter/cart-destination/cart-destination.js.map +1 -1
  163. package/dist/matter/cart-item/cart-item.d.ts +144 -17
  164. package/dist/matter/cart-item/cart-item.js +166 -49
  165. package/dist/matter/cart-item/cart-item.js.map +1 -1
  166. package/dist/matter/cart-item-compositions/cart-item-compositions.js +1 -1
  167. package/dist/matter/cart-item-compositions/cart-item-compositions.js.map +1 -1
  168. package/dist/matter/cart-item-customizations/cart-item-customizations.js +1 -1
  169. package/dist/matter/cart-item-customizations/cart-item-customizations.js.map +1 -1
  170. package/dist/matter/cart-item-discounts/cart-item-discounts.js +1 -1
  171. package/dist/matter/cart-item-discounts/cart-item-discounts.js.map +1 -1
  172. package/dist/matter/cart-item-seller-info/cart-item-seller-info.js +1 -1
  173. package/dist/matter/cart-item-seller-info/cart-item-seller-info.js.map +1 -1
  174. package/dist/matter/cart-item-variations/cart-item-variations.js +1 -1
  175. package/dist/matter/cart-item-variations/cart-item-variations.js.map +1 -1
  176. package/dist/matter/cart-totalizer/cart-totalizer.d.ts +43 -9
  177. package/dist/matter/cart-totalizer/cart-totalizer.js +46 -17
  178. package/dist/matter/cart-totalizer/cart-totalizer.js.map +1 -1
  179. package/dist/matter/challenge-return/challenge-return.d.ts +62 -0
  180. package/dist/matter/challenge-return/challenge-return.js +241 -0
  181. package/dist/matter/challenge-return/challenge-return.js.map +1 -0
  182. package/dist/matter/client-preferences/client-preferences-fieldset.d.ts +86 -17
  183. package/dist/matter/client-preferences/client-preferences-fieldset.js +126 -54
  184. package/dist/matter/client-preferences/client-preferences-fieldset.js.map +1 -1
  185. package/dist/matter/client-preferences/client-preferences.d.ts +50 -7
  186. package/dist/matter/client-preferences/client-preferences.js +84 -15
  187. package/dist/matter/client-preferences/client-preferences.js.map +1 -1
  188. package/dist/matter/client-profile/client-profile.d.ts +44 -9
  189. package/dist/matter/client-profile/client-profile.js +64 -24
  190. package/dist/matter/client-profile/client-profile.js.map +1 -1
  191. package/dist/matter/client-profile-form/client-profile-fieldset.d.ts +119 -22
  192. package/dist/matter/client-profile-form/client-profile-fieldset.js +161 -73
  193. package/dist/matter/client-profile-form/client-profile-fieldset.js.map +1 -1
  194. package/dist/matter/delivery-options/delivery-options-accordion.d.ts +49 -4
  195. package/dist/matter/delivery-options/delivery-options-accordion.js +67 -14
  196. package/dist/matter/delivery-options/delivery-options-accordion.js.map +1 -1
  197. package/dist/matter/delivery-options/delivery-options-controller.d.ts +69 -9
  198. package/dist/matter/delivery-options/delivery-options-controller.js +80 -14
  199. package/dist/matter/delivery-options/delivery-options-controller.js.map +1 -1
  200. package/dist/matter/delivery-options/delivery-options.d.ts +37 -2
  201. package/dist/matter/delivery-options/delivery-options.js +75 -12
  202. package/dist/matter/delivery-options/delivery-options.js.map +1 -1
  203. package/dist/matter/delivery-options/use-delivery-option-selection.d.ts +1 -0
  204. package/dist/matter/delivery-options/use-delivery-option-selection.js +1 -1
  205. package/dist/matter/delivery-options/use-delivery-option-selection.js.map +1 -1
  206. package/dist/matter/email-identification/email-identification.d.ts +25 -3
  207. package/dist/matter/email-identification/email-identification.js +49 -12
  208. package/dist/matter/email-identification/email-identification.js.map +1 -1
  209. package/dist/matter/free-shipping-progress/free-shipping-progress.d.ts +79 -7
  210. package/dist/matter/free-shipping-progress/free-shipping-progress.js +77 -20
  211. package/dist/matter/free-shipping-progress/free-shipping-progress.js.map +1 -1
  212. package/dist/matter/identity-edit/identity-edit.d.ts +52 -10
  213. package/dist/matter/identity-edit/identity-edit.js +47 -19
  214. package/dist/matter/identity-edit/identity-edit.js.map +1 -1
  215. package/dist/matter/identity-summary/identity-summary.d.ts +76 -22
  216. package/dist/matter/identity-summary/identity-summary.js +95 -45
  217. package/dist/matter/identity-summary/identity-summary.js.map +1 -1
  218. package/dist/matter/installments/installments-select.d.ts +98 -16
  219. package/dist/matter/installments/installments-select.js +156 -48
  220. package/dist/matter/installments/installments-select.js.map +1 -1
  221. package/dist/matter/installments/installments.d.ts +96 -16
  222. package/dist/matter/installments/installments.js +115 -40
  223. package/dist/matter/installments/installments.js.map +1 -1
  224. package/dist/matter/installments/use-installments-selection.d.ts +1 -0
  225. package/dist/matter/installments/use-installments-selection.js +8 -3
  226. package/dist/matter/installments/use-installments-selection.js.map +1 -1
  227. package/dist/matter/my-account-profile/my-account-profile.d.ts +358 -103
  228. package/dist/matter/my-account-profile/my-account-profile.js +370 -174
  229. package/dist/matter/my-account-profile/my-account-profile.js.map +1 -1
  230. package/dist/matter/order-cancel/order-cancel.d.ts +65 -19
  231. package/dist/matter/order-cancel/order-cancel.js +118 -51
  232. package/dist/matter/order-cancel/order-cancel.js.map +1 -1
  233. package/dist/matter/order-delivery-address/order-delivery-address.d.ts +8 -18
  234. package/dist/matter/order-delivery-address/order-delivery-address.js +14 -23
  235. package/dist/matter/order-delivery-address/order-delivery-address.js.map +1 -1
  236. package/dist/matter/order-delivery-group/order-delivery-group.d.ts +40 -24
  237. package/dist/matter/order-delivery-group/order-delivery-group.js +64 -74
  238. package/dist/matter/order-delivery-group/order-delivery-group.js.map +1 -1
  239. package/dist/matter/order-details-header/order-details-header.d.ts +32 -15
  240. package/dist/matter/order-details-header/order-details-header.js +66 -58
  241. package/dist/matter/order-details-header/order-details-header.js.map +1 -1
  242. package/dist/matter/order-invoice-download/order-invoice-download.d.ts +78 -0
  243. package/dist/matter/order-invoice-download/order-invoice-download.js +173 -0
  244. package/dist/matter/order-invoice-download/order-invoice-download.js.map +1 -0
  245. package/dist/matter/order-list/order-list.d.ts +164 -19
  246. package/dist/matter/order-list/order-list.js +229 -87
  247. package/dist/matter/order-list/order-list.js.map +1 -1
  248. package/dist/matter/order-list-row/order-list-row.d.ts +6 -1
  249. package/dist/matter/order-list-row/order-list-row.js +3 -2
  250. package/dist/matter/order-list-row/order-list-row.js.map +1 -1
  251. package/dist/matter/order-list-search/order-list-search.d.ts +18 -26
  252. package/dist/matter/order-list-search/order-list-search.js +30 -69
  253. package/dist/matter/order-list-search/order-list-search.js.map +1 -1
  254. package/dist/matter/order-list-views/order-list-views.d.ts +15 -22
  255. package/dist/matter/order-list-views/order-list-views.js +22 -68
  256. package/dist/matter/order-list-views/order-list-views.js.map +1 -1
  257. package/dist/matter/order-payment/order-payment.d.ts +33 -10
  258. package/dist/matter/order-payment/order-payment.js +44 -39
  259. package/dist/matter/order-payment/order-payment.js.map +1 -1
  260. package/dist/matter/order-placed/order-placed-deliveries.d.ts +144 -12
  261. package/dist/matter/order-placed/order-placed-deliveries.js +115 -40
  262. package/dist/matter/order-placed/order-placed-deliveries.js.map +1 -1
  263. package/dist/matter/order-placed/order-placed.d.ts +198 -31
  264. package/dist/matter/order-placed/order-placed.js +230 -139
  265. package/dist/matter/order-placed/order-placed.js.map +1 -1
  266. package/dist/matter/order-placed-date/order-placed-date.d.ts +5 -8
  267. package/dist/matter/order-placed-date/order-placed-date.js +7 -8
  268. package/dist/matter/order-placed-date/order-placed-date.js.map +1 -1
  269. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.d.ts +90 -17
  270. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js +93 -117
  271. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js.map +1 -1
  272. package/dist/matter/order-progress/order-progress.d.ts +19 -8
  273. package/dist/matter/order-progress/order-progress.js +37 -45
  274. package/dist/matter/order-progress/order-progress.js.map +1 -1
  275. package/dist/matter/order-summary/order-summary.d.ts +19 -9
  276. package/dist/matter/order-summary/order-summary.js +38 -44
  277. package/dist/matter/order-summary/order-summary.js.map +1 -1
  278. package/dist/matter/order-tracking-link/order-tracking-link.d.ts +43 -0
  279. package/dist/matter/order-tracking-link/order-tracking-link.js +107 -0
  280. package/dist/matter/order-tracking-link/order-tracking-link.js.map +1 -0
  281. package/dist/matter/payment/payment-card-capture.js +17 -10
  282. package/dist/matter/payment/payment-card-capture.js.map +1 -1
  283. package/dist/matter/payment/payment-controller.d.ts +4 -2
  284. package/dist/matter/payment/payment-controller.js +30 -9
  285. package/dist/matter/payment/payment-controller.js.map +1 -1
  286. package/dist/matter/payment/payment-method-badges.js +1 -1
  287. package/dist/matter/payment/payment.d.ts +69 -19
  288. package/dist/matter/payment/payment.js +101 -35
  289. package/dist/matter/payment/payment.js.map +1 -1
  290. package/dist/matter/payment/use-payment-method-selection.d.ts +25 -4
  291. package/dist/matter/payment/use-payment-method-selection.js +94 -32
  292. package/dist/matter/payment/use-payment-method-selection.js.map +1 -1
  293. package/dist/matter/payment/use-payment-submit-gate.d.ts +14 -3
  294. package/dist/matter/payment/use-payment-submit-gate.js +47 -8
  295. package/dist/matter/payment/use-payment-submit-gate.js.map +1 -1
  296. package/dist/matter/place-order/place-order.d.ts +171 -57
  297. package/dist/matter/place-order/place-order.js +376 -185
  298. package/dist/matter/place-order/place-order.js.map +1 -1
  299. package/dist/matter/pricing/pricing.d.ts +152 -13
  300. package/dist/matter/pricing/pricing.js +153 -52
  301. package/dist/matter/pricing/pricing.js.map +1 -1
  302. package/dist/matter/product-information/product-information.d.ts +27 -4
  303. package/dist/matter/product-information/product-information.js +32 -15
  304. package/dist/matter/product-information/product-information.js.map +1 -1
  305. package/dist/matter/product-list/product-list.d.ts +24 -6
  306. package/dist/matter/product-list/product-list.js +32 -26
  307. package/dist/matter/product-list/product-list.js.map +1 -1
  308. package/dist/matter/product-shelf/product-shelf.d.ts +1 -3
  309. package/dist/matter/product-shelf/product-shelf.js +2 -15
  310. package/dist/matter/product-shelf/product-shelf.js.map +1 -1
  311. package/dist/matter/region/region.d.ts +33 -16
  312. package/dist/matter/region/region.js +59 -52
  313. package/dist/matter/region/region.js.map +1 -1
  314. package/dist/matter/save-card/save-card.d.ts +43 -8
  315. package/dist/matter/save-card/save-card.js +61 -23
  316. package/dist/matter/save-card/save-card.js.map +1 -1
  317. package/dist/matter/saved-cards/saved-cards.d.ts +113 -21
  318. package/dist/matter/saved-cards/saved-cards.js +349 -77
  319. package/dist/matter/saved-cards/saved-cards.js.map +1 -1
  320. package/dist/matter/shipping-address/address-payload.js +25 -0
  321. package/dist/matter/shipping-address/address-payload.js.map +1 -0
  322. package/dist/matter/shipping-address/country-descriptors.js +71 -71
  323. package/dist/matter/shipping-address/country-descriptors.js.map +1 -1
  324. package/dist/matter/shipping-address/library-country-descriptors.js +136 -0
  325. package/dist/matter/shipping-address/library-country-descriptors.js.map +1 -0
  326. package/dist/matter/shipping-address/shipping-address.d.ts +312 -45
  327. package/dist/matter/shipping-address/shipping-address.js +443 -188
  328. package/dist/matter/shipping-address/shipping-address.js.map +1 -1
  329. package/dist/matter/shipping-simulator/shipping-simulator.d.ts +250 -24
  330. package/dist/matter/shipping-simulator/shipping-simulator.js +257 -51
  331. package/dist/matter/shipping-simulator/shipping-simulator.js.map +1 -1
  332. package/dist/matter/sign-in/sign-in.d.ts +108 -0
  333. package/dist/matter/sign-in/sign-in.js +285 -0
  334. package/dist/matter/sign-in/sign-in.js.map +1 -0
  335. package/dist/matter/sign-in-disclosure/sign-in-disclosure.d.ts +81 -0
  336. package/dist/matter/sign-in-disclosure/sign-in-disclosure.js +232 -0
  337. package/dist/matter/sign-in-disclosure/sign-in-disclosure.js.map +1 -0
  338. package/dist/matter/sign-in-form/sign-in-form.d.ts +93 -62
  339. package/dist/matter/sign-in-form/sign-in-form.js +134 -144
  340. package/dist/matter/sign-in-form/sign-in-form.js.map +1 -1
  341. package/dist/particles/binding-switcher/binding-switcher.d.ts +29 -8
  342. package/dist/particles/binding-switcher/binding-switcher.js +37 -26
  343. package/dist/particles/binding-switcher/binding-switcher.js.map +1 -1
  344. package/dist/particles/card-summary/card-summary.d.ts +38 -8
  345. package/dist/particles/card-summary/card-summary.js +55 -22
  346. package/dist/particles/card-summary/card-summary.js.map +1 -1
  347. package/dist/particles/carousel/carousel.d.ts +99 -11
  348. package/dist/particles/carousel/carousel.js +103 -35
  349. package/dist/particles/carousel/carousel.js.map +1 -1
  350. package/dist/particles/copy-text/copy-text.js +5 -15
  351. package/dist/particles/copy-text/copy-text.js.map +1 -1
  352. package/dist/particles/dialog/dialog.d.ts +14 -6
  353. package/dist/particles/dialog/dialog.js +6 -3
  354. package/dist/particles/dialog/dialog.js.map +1 -1
  355. package/dist/particles/drawer/drawer.js +1 -1
  356. package/dist/particles/drawer/drawer.js.map +1 -1
  357. package/dist/particles/email-field/email-field.d.ts +2 -1
  358. package/dist/particles/email-field/email-field.js +2 -1
  359. package/dist/particles/email-field/email-field.js.map +1 -1
  360. package/dist/particles/footer-link-group/footer-link-group.js +1 -0
  361. package/dist/particles/footer-link-group/footer-link-group.js.map +1 -1
  362. package/dist/particles/form/form.d.ts +85 -13
  363. package/dist/particles/form/form.js +91 -42
  364. package/dist/particles/form/form.js.map +1 -1
  365. package/dist/particles/gallery/gallery.d.ts +129 -12
  366. package/dist/particles/gallery/gallery.js +121 -34
  367. package/dist/particles/gallery/gallery.js.map +1 -1
  368. package/dist/particles/order-details-back/order-details-back.d.ts +5 -3
  369. package/dist/particles/order-details-back/order-details-back.js +8 -10
  370. package/dist/particles/order-details-back/order-details-back.js.map +1 -1
  371. package/dist/particles/order-status-badge/order-status-badge.d.ts +3 -3
  372. package/dist/particles/order-status-badge/order-status-badge.js +4 -20
  373. package/dist/particles/order-status-badge/order-status-badge.js.map +1 -1
  374. package/dist/particles/password-field/password-field.d.ts +1 -1
  375. package/dist/particles/password-field/password-field.js +2 -4
  376. package/dist/particles/password-field/password-field.js.map +1 -1
  377. package/dist/particles/phone-field/phone-field.d.ts +4 -4
  378. package/dist/particles/phone-field/phone-field.js +8 -11
  379. package/dist/particles/phone-field/phone-field.js.map +1 -1
  380. package/dist/particles/spinner/spinner.d.ts +24 -4
  381. package/dist/particles/spinner/spinner.js +25 -9
  382. package/dist/particles/spinner/spinner.js.map +1 -1
  383. package/dist/particles/switch/switch.d.ts +4 -1
  384. package/dist/particles/switch/switch.js +3 -1
  385. package/dist/particles/switch/switch.js.map +1 -1
  386. package/dist/particles/toast/toast.d.ts +29 -3
  387. package/dist/particles/toast/toast.js +34 -10
  388. package/dist/particles/toast/toast.js.map +1 -1
  389. package/dist/schema.graphql +164 -56
  390. package/dist/sdk/address/address-fields.js +4 -4
  391. package/dist/sdk/address/address-fields.js.map +1 -1
  392. package/dist/sdk/address/constants.js +1 -6
  393. package/dist/sdk/address/constants.js.map +1 -1
  394. package/dist/sdk/address/messages.js +44 -44
  395. package/dist/sdk/address/messages.js.map +1 -1
  396. package/dist/sdk/address/postal-code.js +15 -2
  397. package/dist/sdk/address/postal-code.js.map +1 -1
  398. package/dist/sdk/address/types.d.ts +5 -3
  399. package/dist/sdk/address/validate-address.js +3 -3
  400. package/dist/sdk/address/validate-address.js.map +1 -1
  401. package/dist/sdk/analytics/use-analytics-actions.d.ts +1 -1
  402. package/dist/sdk/analytics/use-analytics-actions.js.map +1 -1
  403. package/dist/sdk/cart/use-cart-actions.js.map +1 -1
  404. package/dist/sdk/data/index.js +2 -2
  405. package/dist/sdk/data/reactive-list-item-data-provider.js +2 -2
  406. package/dist/sdk/generated/gql.js +1 -1
  407. package/dist/sdk/generated/gql.js.map +1 -1
  408. package/dist/sdk/generated/graphql.d.ts +20 -5
  409. package/dist/sdk/generated/graphql.js +6 -0
  410. package/dist/sdk/generated/graphql.js.map +1 -1
  411. package/dist/sdk/i18n/format-error-code.js +23 -0
  412. package/dist/sdk/i18n/format-error-code.js.map +1 -0
  413. package/dist/sdk/i18n/message-formatter.d.ts +22 -0
  414. package/dist/sdk/i18n/message-formatter.js +140 -0
  415. package/dist/sdk/i18n/message-formatter.js.map +1 -0
  416. package/dist/sdk/i18n/use-message-formatter.d.ts +8 -0
  417. package/dist/sdk/i18n/use-message-formatter.js +18 -0
  418. package/dist/sdk/i18n/use-message-formatter.js.map +1 -0
  419. package/dist/sdk/identity/use-identity-actions.js.map +1 -1
  420. package/dist/sdk/navigation/redirect.d.ts +2 -0
  421. package/dist/sdk/navigation/redirect.js +19 -1
  422. package/dist/sdk/navigation/redirect.js.map +1 -1
  423. package/dist/sdk/navigation/types.d.ts +13 -0
  424. package/dist/sdk/payment/bin-format.js +20 -0
  425. package/dist/sdk/payment/bin-format.js.map +1 -0
  426. package/dist/sdk/payment/challenge-return.js +37 -0
  427. package/dist/sdk/payment/challenge-return.js.map +1 -0
  428. package/dist/sdk/payment/confirmation-last-four.js +39 -0
  429. package/dist/sdk/payment/confirmation-last-four.js.map +1 -0
  430. package/dist/sdk/payment/gateway.d.ts +1 -1
  431. package/dist/sdk/payment/gateway.js +8 -2
  432. package/dist/sdk/payment/gateway.js.map +1 -1
  433. package/dist/sdk/payment/operations.d.ts +1 -0
  434. package/dist/sdk/payment/operations.js +28 -6
  435. package/dist/sdk/payment/operations.js.map +1 -1
  436. package/dist/sdk/payment/resumed-purchase.d.ts +1 -0
  437. package/dist/sdk/payment/resumed-purchase.js +119 -0
  438. package/dist/sdk/payment/resumed-purchase.js.map +1 -0
  439. package/dist/sdk/payment/security-code-mask.js +16 -23
  440. package/dist/sdk/payment/security-code-mask.js.map +1 -1
  441. package/dist/sdk/payment/submission-registry.js +6 -2
  442. package/dist/sdk/payment/submission-registry.js.map +1 -1
  443. package/dist/sdk/payment/use-payment-actions.d.ts +18 -3
  444. package/dist/sdk/payment/use-payment-actions.js +23 -3
  445. package/dist/sdk/payment/use-payment-actions.js.map +1 -1
  446. package/dist/sdk/payment/use-place-order.d.ts +10 -2
  447. package/dist/sdk/payment/use-place-order.js +138 -76
  448. package/dist/sdk/payment/use-place-order.js.map +1 -1
  449. package/dist/sdk/provider/storefront-provider.d.ts +1 -7
  450. package/dist/sdk/provider/storefront-provider.js +4 -11
  451. package/dist/sdk/provider/storefront-provider.js.map +1 -1
  452. package/dist/sdk/seo/entity-landing.d.ts +24 -0
  453. package/dist/sdk/seo/entity-landing.js +30 -0
  454. package/dist/sdk/seo/entity-landing.js.map +1 -0
  455. package/dist/sdk/seo/page-alternates.d.ts +3 -2
  456. package/dist/sdk/seo/page-alternates.js +4 -2
  457. package/dist/sdk/seo/page-alternates.js.map +1 -1
  458. package/dist/sdk/seo/search-landing.d.ts +42 -0
  459. package/dist/sdk/seo/search-landing.js +85 -0
  460. package/dist/sdk/seo/search-landing.js.map +1 -0
  461. package/dist/sdk/session/mock-session.d.ts +9 -0
  462. package/dist/sdk/session/mock-session.js +31 -0
  463. package/dist/sdk/session/mock-session.js.map +1 -0
  464. package/dist/sdk/session/read-server-session.d.ts +3 -0
  465. package/dist/sdk/session/read-server-session.js +5 -0
  466. package/dist/sdk/session/read-server-session.js.map +1 -1
  467. package/dist/sdk/session/return-path-segment.d.ts +10 -0
  468. package/dist/sdk/session/return-path-segment.js +15 -0
  469. package/dist/sdk/session/return-path-segment.js.map +1 -0
  470. package/dist/sdk/session/use-session-actions.js.map +1 -1
  471. package/dist/sdk/shipping/use-cart-shipping-simulation.js.map +1 -1
  472. package/dist/sdk/shipping/use-shipping-actions.js.map +1 -1
  473. package/dist/sdk/shipping/use-shipping-simulation.js.map +1 -1
  474. package/dist/utils/safe-href.d.ts +2 -0
  475. package/package.json +4 -3
  476. package/skills/storefront-asset/SKILL.md +2 -2
  477. package/skills/storefront-asset/references/api-side.md +27 -14
  478. package/skills/storefront-asset/references/findings.md +5 -2
  479. package/src/styles/tailwind.css +8 -0
  480. package/dist/matter/shipping-address/country-descriptors.d.ts +0 -1
  481. package/dist/message-locales.json +0 -7
  482. package/dist/sdk/i18n/client.d.ts +0 -4
  483. package/dist/sdk/i18n/client.js +0 -4
  484. package/dist/sdk/i18n/locales.d.ts +0 -8
  485. package/dist/sdk/i18n/locales.js +0 -57
  486. package/dist/sdk/i18n/locales.js.map +0 -1
  487. package/dist/sdk/i18n/messages/en-US.js +0 -183
  488. package/dist/sdk/i18n/messages/en-US.js.map +0 -1
  489. package/dist/sdk/i18n/messages/en-US.json +0 -178
  490. package/dist/sdk/i18n/messages/en-US.json.d.ts +0 -182
  491. package/dist/sdk/i18n/messages/es-ES.js +0 -183
  492. package/dist/sdk/i18n/messages/es-ES.js.map +0 -1
  493. package/dist/sdk/i18n/messages/es-ES.json +0 -178
  494. package/dist/sdk/i18n/messages/pt-BR.js +0 -183
  495. package/dist/sdk/i18n/messages/pt-BR.js.map +0 -1
  496. package/dist/sdk/i18n/messages/pt-BR.json +0 -178
  497. package/dist/sdk/i18n/provider.d.ts +0 -1
  498. package/dist/sdk/i18n/provider.js +0 -30
  499. package/dist/sdk/i18n/provider.js.map +0 -1
  500. package/dist/sdk/i18n/server.d.ts +0 -28
  501. package/dist/sdk/i18n/server.js +0 -59
  502. package/dist/sdk/i18n/server.js.map +0 -1
  503. package/dist/utils/resolve-authored-copy.js +0 -18
  504. package/dist/utils/resolve-authored-copy.js.map +0 -1
  505. package/dist/utils/substitute-template.js +0 -33
  506. package/dist/utils/substitute-template.js.map +0 -1
@@ -1,183 +1,183 @@
1
1
  "use client";
2
2
  import { defineComponent } from "../../core/dist/define-component.js";
3
+ import { defineContentType } from "../../core/dist/define-content-type.js";
3
4
  import "../../core/dist/index.js";
4
- import { EmailField, isValidEmail } from "../../particles/email-field/email-field.js";
5
+ import { useMessageFormatter } from "../../sdk/i18n/use-message-formatter.js";
6
+ import { isValidEmail } from "../../particles/email-field/email-field.js";
5
7
  import { useActionsOverride } from "../../sdk/actions/actions-override-context.js";
6
- import { useDataOverride } from "../../sdk/data/data-override-context.js";
7
8
  import { useSession } from "../session/session.js";
8
9
  import { Button } from "../../particles/button/button.js";
10
+ import { useSignIn } from "../sign-in/sign-in.js";
11
+ import { useSignInDisclosureOpen } from "../sign-in-disclosure/sign-in-disclosure.js";
9
12
  import { PasswordField } from "../../particles/password-field/password-field.js";
10
- import { useEffect, useState } from "react";
13
+ import { useEffect, useRef, useState } from "react";
11
14
  import { jsx, jsxs } from "react/jsx-runtime";
12
15
  //#region src/matter/sign-in-form/sign-in-form.tsx
13
- const fragment = `
14
- fragment SignInFormData on Query {
15
- clientProfile {
16
- __typename
17
- id
18
- email
19
- }
20
- }
21
- `;
16
+ const SignInFormContent = defineContentType({
17
+ id: "sign-in-form",
18
+ title: "Sign In Form",
19
+ description: "Labels and error messages of the password sign-in step.",
20
+ schema: {
21
+ type: "object",
22
+ additionalProperties: false,
23
+ properties: {
24
+ passwordLabel: {
25
+ type: "string",
26
+ title: "Password label",
27
+ format: "icu-message",
28
+ messageSource: "Password"
29
+ },
30
+ showPasswordLabel: {
31
+ type: "string",
32
+ title: "Show password label",
33
+ format: "icu-message",
34
+ messageSource: "Show password"
35
+ },
36
+ hidePasswordLabel: {
37
+ type: "string",
38
+ title: "Hide password label",
39
+ format: "icu-message",
40
+ messageSource: "Hide password"
41
+ },
42
+ submitLabel: {
43
+ type: "string",
44
+ title: "Submit label",
45
+ format: "icu-message",
46
+ messageSource: "Sign In"
47
+ },
48
+ passwordRequiredMessage: {
49
+ type: "string",
50
+ title: "Password required message",
51
+ format: "icu-message",
52
+ messageSource: "Enter your password."
53
+ },
54
+ invalidCredentialsMessage: {
55
+ type: "string",
56
+ title: "Invalid credentials message",
57
+ format: "icu-message",
58
+ messageSource: "Incorrect email or password. Please try again."
59
+ },
60
+ blockedMessage: {
61
+ type: "string",
62
+ title: "Blocked account message",
63
+ format: "icu-message",
64
+ messageSource: "Access to this account is temporarily blocked. Please try again later."
65
+ },
66
+ networkErrorMessage: {
67
+ type: "string",
68
+ title: "Network error message",
69
+ format: "icu-message",
70
+ messageSource: "Unable to complete the request. Please try again."
71
+ },
72
+ genericErrorMessage: {
73
+ type: "string",
74
+ title: "Generic error message",
75
+ format: "icu-message",
76
+ messageSource: "Unable to sign in. Please try again."
77
+ }
78
+ }
79
+ }
80
+ });
22
81
  /**
23
- * Maps the first resolved SessionUserError to caller-configurable copy. INVALID_ACCESS_CODE,
24
- * ACCESS_CODE_SEND_LIMIT, and MISSING_AUTH_CONTEXT are contractually unreachable from
25
- * loginWithPassword but share the untyped `code: string` field, so they fall through to the
82
+ * Maps the first resolved SessionUserError to the `sign-in-form` message that words it.
83
+ * INVALID_ACCESS_CODE, ACCESS_CODE_SEND_LIMIT, and MISSING_AUTH_CONTEXT are contractually unreachable
84
+ * from loginWithPassword but share the untyped `code: string` field, so they fall through to the
26
85
  * generic message defensively, alongside any future/unknown code.
27
86
  */
28
- function mapSessionErrorMessage(error, messages) {
87
+ function mapSessionErrorField(error) {
29
88
  if (!error) return null;
30
89
  switch (error.code) {
31
- case "INVALID_CREDENTIALS": return messages.invalidCredentialsMessage;
32
- case "BLOCKED": return messages.blockedMessage;
33
- case "NETWORK_ERROR": return messages.networkErrorMessage;
34
- default: return messages.genericErrorMessage;
90
+ case "INVALID_CREDENTIALS": return "invalidCredentialsMessage";
91
+ case "BLOCKED": return "blockedMessage";
92
+ case "NETWORK_ERROR": return "networkErrorMessage";
93
+ default: return "genericErrorMessage";
35
94
  }
36
95
  }
37
96
  const SignInFormDefinition = defineComponent({
38
97
  name: "SignInForm",
39
98
  importPath: "@vtex/faststore/components",
40
99
  component: SignInForm,
41
- fragment,
42
- fetchStrategy: "reactive",
100
+ content: SignInFormContent,
43
101
  actions: { session: ["loginWithPassword"] },
44
- requiresContext: "session",
102
+ requiresContext: "sign-in",
45
103
  editor: {
46
104
  label: "Sign In Form",
47
105
  category: "identity"
48
106
  },
49
- schema: {
50
- emailLabel: {
51
- type: "string",
52
- default: "Email",
53
- label: "Email label"
54
- },
55
- emailPlaceholder: {
56
- type: "string",
57
- default: "you@example.com",
58
- label: "Email placeholder"
59
- },
60
- passwordLabel: {
61
- type: "string",
62
- default: "Password",
63
- label: "Password label"
64
- },
65
- passwordPlaceholder: {
66
- type: "string",
67
- default: "",
68
- label: "Password placeholder"
69
- },
70
- showPasswordLabel: {
71
- type: "string",
72
- default: "Show password",
73
- label: "Show password label"
74
- },
75
- hidePasswordLabel: {
76
- type: "string",
77
- default: "Hide password",
78
- label: "Hide password label"
79
- },
80
- submitLabel: {
81
- type: "string",
82
- default: "Sign In",
83
- label: "Submit label"
84
- },
85
- invalidEmailMessage: {
86
- type: "string",
87
- default: "Enter a valid email address.",
88
- label: "Invalid email message"
89
- },
90
- passwordRequiredMessage: {
91
- type: "string",
92
- default: "Enter your password.",
93
- label: "Password required message"
94
- },
95
- invalidCredentialsMessage: {
96
- type: "string",
97
- default: "Incorrect email or password. Please try again.",
98
- label: "Invalid credentials message"
99
- },
100
- blockedMessage: {
101
- type: "string",
102
- default: "This account has been blocked. Please contact support.",
103
- label: "Blocked account message"
104
- },
105
- networkErrorMessage: {
106
- type: "string",
107
- default: "Unable to complete the request. Please try again.",
108
- label: "Network error message"
109
- },
110
- genericErrorMessage: {
111
- type: "string",
112
- default: "Unable to sign in. Please try again.",
113
- label: "Generic error message"
114
- }
115
- },
116
- guideline: "Combined email+password sign-in form dispatching $actions.session.loginWithPassword; pre-fills the email from clientProfile.email, self-hides once the session is loggedIn, and exposes data-fs-sign-in-form-pending while the submit is in flight. Must be inside SessionRoot. See sign-in-form.md."
107
+ schema: { passwordPlaceholder: {
108
+ type: "string",
109
+ default: "",
110
+ label: "Password placeholder"
111
+ } },
112
+ guideline: "Password step of the sign-in surface: a password field and a submit dispatching $actions.session.loginWithPassword with the shared SignInRoot email draft. Renders only while the account has resolved, enables passwords, the password method is showing and the shopper is not loggedIn; otherwise nothing. Rejected credentials render beside the password field, every other failure in data-fs-sign-in-form-error. Labels and error messages are $content fields of sign-in-form. Reads no data of its own and renders no email field: compose SignInEmailControl beside it. Must be inside SignInRoot. See sign-in-form.md."
117
113
  });
118
114
  /**
119
- * Matter that composes `EmailField` + `PasswordField` under one submit and dispatches
120
- * `$actions.session.loginWithPassword`. Reads the email pre-fill from `clientProfile.email`
121
- * (colocated reactive fragment) and the identity tri-state from `useSession()` (which also
122
- * enforces the `SessionRoot` ancestor), self-gating to `null` once the shopper is `loggedIn`.
123
- * Client-side validation (email format, password presence) blocks the dispatch before any network
124
- * round trip; the awaited dispatch's `userErrors` map to one form-level inline message, distinct
125
- * from any ancestor `UNAUTHORIZED` gate. While the write is in flight the form is disabled and
126
- * `data-fs-sign-in-form-pending` is present so a checkout-CTA guard can block.
115
+ * Password method of the sign-in surface. It declares no fragment and reads no data of its own: the
116
+ * gate is the `sign-in` context (`resolved`, `passwordEnabled` and `method === 'password'`) plus the
117
+ * session read (`state !== 'loggedIn'`), so a store enabling both methods shows the password step only
118
+ * while it is the method showing, and a store that disables passwords never shows it. It returns `null`
119
+ * rather than unmounting, so a half-typed password survives a method switch.
120
+ *
121
+ * The email is the shared draft `SignInRoot` owns, read at submit time and trimmed; this form renders no
122
+ * email field, and the submit stays disabled until that draft is a valid address. The password-presence
123
+ * check runs on submit. The awaited dispatch's first `userError` maps to a `sign-in-form` message:
124
+ * `INVALID_CREDENTIALS` is a claim about the password the shopper typed, so it renders on the
125
+ * `PasswordField`; every other code is a claim about the account or the request and renders in
126
+ * `data-fs-sign-in-form-error`. A dispatched attempt clears the password, accepted or rejected, and leaves the shared email alone.
127
+ * While the write is in flight the password and submit are disabled and `data-fs-sign-in-form-pending` is
128
+ * present so a checkout-CTA guard can block. The password clears when the session reaches `loggedIn`, and
129
+ * when a `SignInModalPanel` hosting it closes: this form never unmounts, so it would otherwise outlive the
130
+ * session it was typed for, and sit in the hidden panel after the shopper changed their mind.
127
131
  */
128
- function SignInForm({ emailLabel, emailPlaceholder, passwordLabel, passwordPlaceholder, showPasswordLabel, hidePasswordLabel, submitLabel = "Sign In", invalidEmailMessage = "Enter a valid email address.", passwordRequiredMessage = "Enter your password.", invalidCredentialsMessage = "Incorrect email or password. Please try again.", blockedMessage = "This account has been blocked. Please contact support.", networkErrorMessage = "Unable to complete the request. Please try again.", genericErrorMessage = "Unable to sign in. Please try again.", $data: $dataProp, $actions: $actionsProp, className }) {
129
- const $data = useDataOverride($dataProp);
132
+ function SignInForm({ passwordPlaceholder, $content, $actions: $actionsProp, className }) {
130
133
  const $actions = useActionsOverride($actionsProp);
131
134
  const { state } = useSession();
132
- const savedEmail = $data?.email ?? "";
133
- const [email, setEmail] = useState(savedEmail);
135
+ const { email, method, passwordEnabled, resolved } = useSignIn();
136
+ const { format } = useMessageFormatter(SignInFormContent, $content);
134
137
  const [password, setPassword] = useState("");
135
138
  const [pending, setPending] = useState(false);
136
- const [emailError, setEmailError] = useState(null);
137
139
  const [passwordError, setPasswordError] = useState(null);
138
140
  const [formError, setFormError] = useState(null);
141
+ const dispatching = useRef(false);
142
+ const panelOpen = useSignInDisclosureOpen();
139
143
  useEffect(() => {
140
- setEmail(savedEmail);
141
- }, [savedEmail]);
142
- if (state === "loggedIn") return null;
143
- function handleEmailChange(next) {
144
- setEmail(next);
145
- if (emailError) setEmailError(null);
146
- }
144
+ if (state === "loggedIn" || panelOpen === false) {
145
+ setPassword("");
146
+ setPasswordError(null);
147
+ setFormError(null);
148
+ }
149
+ }, [state, panelOpen]);
150
+ if (!(state !== "loggedIn" && resolved && passwordEnabled && method === "password")) return null;
151
+ const canSubmit = !pending && isValidEmail(email);
147
152
  function handlePasswordChange(next) {
148
153
  setPassword(next);
149
154
  if (passwordError) setPasswordError(null);
150
155
  }
151
156
  async function handleSubmit(event) {
152
157
  event.preventDefault();
153
- const trimmedEmail = email.trim();
154
- if (!isValidEmail(trimmedEmail)) {
155
- setEmailError(invalidEmailMessage);
156
- return;
157
- }
158
+ if (!canSubmit || dispatching.current) return;
158
159
  if (password.length === 0) {
159
- setPasswordError(passwordRequiredMessage);
160
+ setPasswordError("passwordRequiredMessage");
160
161
  return;
161
162
  }
162
- setEmailError(null);
163
+ const requestedEmail = email.trim();
163
164
  setPasswordError(null);
164
165
  setFormError(null);
166
+ dispatching.current = true;
165
167
  setPending(true);
166
168
  try {
167
169
  const errors = await $actions?.session?.loginWithPassword?.({
168
- email: trimmedEmail,
170
+ email: requestedEmail,
169
171
  password
170
172
  }) ?? [];
171
173
  if (errors.length > 0) {
172
- setFormError(mapSessionErrorMessage(errors[0], {
173
- invalidCredentialsMessage,
174
- blockedMessage,
175
- networkErrorMessage,
176
- genericErrorMessage
177
- }));
178
- setPassword("");
174
+ const field = mapSessionErrorField(errors[0]);
175
+ if (errors[0]?.code === "INVALID_CREDENTIALS") setPasswordError(field);
176
+ else setFormError(field);
179
177
  }
178
+ setPassword("");
180
179
  } finally {
180
+ dispatching.current = false;
181
181
  setPending(false);
182
182
  }
183
183
  }
@@ -187,42 +187,32 @@ function SignInForm({ emailLabel, emailPlaceholder, passwordLabel, passwordPlace
187
187
  ...pending ? { "data-fs-sign-in-form-pending": "" } : {},
188
188
  onSubmit: handleSubmit,
189
189
  children: [
190
- /* @__PURE__ */ jsx(EmailField, {
191
- label: emailLabel,
192
- placeholder: emailPlaceholder,
193
- value: email,
194
- disabled: pending,
195
- invalid: emailError != null,
196
- errorMessage: emailError ?? void 0,
197
- onValueChange: handleEmailChange,
198
- required: true
199
- }),
200
190
  /* @__PURE__ */ jsx(PasswordField, {
201
- label: passwordLabel,
191
+ label: format("passwordLabel"),
202
192
  placeholder: passwordPlaceholder,
203
193
  value: password,
204
194
  disabled: pending,
205
195
  invalid: passwordError != null,
206
- errorMessage: passwordError ?? void 0,
207
- showPasswordLabel,
208
- hidePasswordLabel,
196
+ errorMessage: passwordError ? format(passwordError) : void 0,
197
+ showPasswordLabel: format("showPasswordLabel"),
198
+ hidePasswordLabel: format("hidePasswordLabel"),
209
199
  onValueChange: handlePasswordChange
210
200
  }),
211
201
  formError ? /* @__PURE__ */ jsx("div", {
212
202
  "data-fs-sign-in-form-error": "",
213
203
  role: "alert",
214
- children: formError
204
+ children: format(formError)
215
205
  }) : null,
216
206
  /* @__PURE__ */ jsx(Button, {
217
207
  type: "submit",
218
- disabled: pending,
208
+ disabled: !canSubmit,
219
209
  "data-fs-sign-in-form-submit": "",
220
- children: submitLabel
210
+ children: format("submitLabel")
221
211
  })
222
212
  ]
223
213
  });
224
214
  }
225
215
  //#endregion
226
- export { SignInForm, SignInFormDefinition, mapSessionErrorMessage };
216
+ export { SignInForm, SignInFormContent, SignInFormDefinition, mapSessionErrorField };
227
217
 
228
218
  //# sourceMappingURL=sign-in-form.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sign-in-form.js","names":[],"sources":["../../../src/matter/sign-in-form/sign-in-form.tsx"],"sourcesContent":["'use client';\n\nimport { defineComponent } from '@vtex/fs-core';\nimport type { FormEvent } from 'react';\nimport { useEffect, useState } from 'react';\nimport { Button } from '../../particles/button/button.js';\nimport { EmailField, isValidEmail } from '../../particles/email-field/email-field.js';\nimport { PasswordField } from '../../particles/password-field/password-field.js';\nimport { useActionsOverride } from '../../sdk/actions/actions-override-context.js';\nimport type { ComponentActions } from '../../sdk/actions/types.js';\nimport { useDataOverride } from '../../sdk/data/data-override-context.js';\nimport type { SessionUserError } from '../../sdk/session/auth-operations.js';\nimport { useSession } from '../session/session.js';\n\n// ---------------------------------------------------------------------------\n// GraphQL Fragment (colocated, ADR-0011) — reads only clientProfile.email, the minimal slice this\n// matter owns for the pre-fill. Authored as a raw string (not the codegen graphql() factory),\n// mirroring EmailIdentificationControl; the compiler derives the entity fragment on `clientProfile`\n// and subscribes reactively.\n// ---------------------------------------------------------------------------\n\nconst fragment = /* GraphQL */ `\n fragment SignInFormData on Query {\n clientProfile {\n __typename\n id\n email\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** ClientProfile slice forwarded by the reactive runtime — only `email` is consumed for pre-fill. */\nexport type SignInFormSlice = Readonly<{ email?: string | null }>;\n\nexport type SignInFormMessages = Readonly<{\n invalidCredentialsMessage: string;\n blockedMessage: string;\n networkErrorMessage: string;\n genericErrorMessage: string;\n}>;\n\nexport type SignInFormProps = Readonly<{\n emailLabel?: string;\n emailPlaceholder?: string;\n passwordLabel?: string;\n passwordPlaceholder?: string;\n showPasswordLabel?: string;\n hidePasswordLabel?: string;\n submitLabel?: string;\n /** Inline error for an invalid email format (mirrors EmailIdentificationControl). */\n invalidEmailMessage?: string;\n /** Inline error when the password field is submitted empty (this form owns the presence check). */\n passwordRequiredMessage?: string;\n invalidCredentialsMessage?: string;\n blockedMessage?: string;\n networkErrorMessage?: string;\n genericErrorMessage?: string;\n /** ClientProfile slice forwarded by the reactive runtime; `null` until the entity resolves. */\n $data?: SignInFormSlice | null;\n /** Compiler-injected action surface; carries `session.loginWithPassword`. */\n $actions?: ComponentActions;\n className?: string;\n}>;\n\n// ---------------------------------------------------------------------------\n// Error mapping — pure, unit-tested.\n// ---------------------------------------------------------------------------\n\n/**\n * Maps the first resolved SessionUserError to caller-configurable copy. INVALID_ACCESS_CODE,\n * ACCESS_CODE_SEND_LIMIT, and MISSING_AUTH_CONTEXT are contractually unreachable from\n * loginWithPassword but share the untyped `code: string` field, so they fall through to the\n * generic message defensively, alongside any future/unknown code.\n */\nexport function mapSessionErrorMessage(\n error: SessionUserError | undefined,\n messages: SignInFormMessages,\n): string | null {\n if (!error) return null;\n switch (error.code) {\n case 'INVALID_CREDENTIALS':\n return messages.invalidCredentialsMessage;\n case 'BLOCKED':\n return messages.blockedMessage;\n case 'NETWORK_ERROR':\n return messages.networkErrorMessage;\n default:\n return messages.genericErrorMessage;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Definition\n// ---------------------------------------------------------------------------\n\nexport const SignInFormDefinition = defineComponent<SignInFormProps>({\n name: 'SignInForm',\n importPath: '@vtex/faststore/components',\n component: SignInForm,\n fragment,\n fetchStrategy: 'reactive',\n actions: { session: ['loginWithPassword'] },\n requiresContext: 'session',\n editor: { label: 'Sign In Form', category: 'identity' },\n schema: {\n emailLabel: { type: 'string', default: 'Email', label: 'Email label' },\n emailPlaceholder: { type: 'string', default: 'you@example.com', label: 'Email placeholder' },\n passwordLabel: { type: 'string', default: 'Password', label: 'Password label' },\n passwordPlaceholder: { type: 'string', default: '', label: 'Password placeholder' },\n showPasswordLabel: { type: 'string', default: 'Show password', label: 'Show password label' },\n hidePasswordLabel: { type: 'string', default: 'Hide password', label: 'Hide password label' },\n submitLabel: { type: 'string', default: 'Sign In', label: 'Submit label' },\n invalidEmailMessage: { type: 'string', default: 'Enter a valid email address.', label: 'Invalid email message' },\n passwordRequiredMessage: {\n type: 'string',\n default: 'Enter your password.',\n label: 'Password required message',\n },\n invalidCredentialsMessage: {\n type: 'string',\n default: 'Incorrect email or password. Please try again.',\n label: 'Invalid credentials message',\n },\n blockedMessage: {\n type: 'string',\n default: 'This account has been blocked. Please contact support.',\n label: 'Blocked account message',\n },\n networkErrorMessage: {\n type: 'string',\n default: 'Unable to complete the request. Please try again.',\n label: 'Network error message',\n },\n genericErrorMessage: {\n type: 'string',\n default: 'Unable to sign in. Please try again.',\n label: 'Generic error message',\n },\n },\n guideline:\n 'Combined email+password sign-in form dispatching $actions.session.loginWithPassword; pre-fills the email from clientProfile.email, self-hides once the session is loggedIn, and exposes data-fs-sign-in-form-pending while the submit is in flight. Must be inside SessionRoot. See sign-in-form.md.',\n});\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n/**\n * Matter that composes `EmailField` + `PasswordField` under one submit and dispatches\n * `$actions.session.loginWithPassword`. Reads the email pre-fill from `clientProfile.email`\n * (colocated reactive fragment) and the identity tri-state from `useSession()` (which also\n * enforces the `SessionRoot` ancestor), self-gating to `null` once the shopper is `loggedIn`.\n * Client-side validation (email format, password presence) blocks the dispatch before any network\n * round trip; the awaited dispatch's `userErrors` map to one form-level inline message, distinct\n * from any ancestor `UNAUTHORIZED` gate. While the write is in flight the form is disabled and\n * `data-fs-sign-in-form-pending` is present so a checkout-CTA guard can block.\n */\nexport function SignInForm({\n emailLabel,\n emailPlaceholder,\n passwordLabel,\n passwordPlaceholder,\n showPasswordLabel,\n hidePasswordLabel,\n submitLabel = 'Sign In',\n invalidEmailMessage = 'Enter a valid email address.',\n passwordRequiredMessage = 'Enter your password.',\n invalidCredentialsMessage = 'Incorrect email or password. Please try again.',\n blockedMessage = 'This account has been blocked. Please contact support.',\n networkErrorMessage = 'Unable to complete the request. Please try again.',\n genericErrorMessage = 'Unable to sign in. Please try again.',\n $data: $dataProp,\n $actions: $actionsProp,\n className,\n}: SignInFormProps) {\n const $data = useDataOverride($dataProp);\n const $actions = useActionsOverride($actionsProp);\n // Reads the tri-state for self-gating and, as a side effect, throws when rendered outside\n // <SessionRoot> — called unconditionally, before any early return.\n const { state } = useSession();\n\n const savedEmail = $data?.email ?? '';\n const [email, setEmail] = useState(savedEmail);\n const [password, setPassword] = useState('');\n const [pending, setPending] = useState(false);\n const [emailError, setEmailError] = useState<string | null>(null);\n const [passwordError, setPasswordError] = useState<string | null>(null);\n const [formError, setFormError] = useState<string | null>(null);\n\n // Sync the pre-fill when the saved profile email resolves or changes, mirroring\n // EmailIdentificationControl's pre-fill sync.\n useEffect(() => {\n setEmail(savedEmail);\n }, [savedEmail]);\n\n // An already-authenticated shopper is never offered a sign-in form.\n if (state === 'loggedIn') return null;\n\n function handleEmailChange(next: string) {\n setEmail(next);\n if (emailError) setEmailError(null);\n }\n\n function handlePasswordChange(next: string) {\n setPassword(next);\n if (passwordError) setPasswordError(null);\n }\n\n async function handleSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n\n const trimmedEmail = email.trim();\n if (!isValidEmail(trimmedEmail)) {\n setEmailError(invalidEmailMessage);\n return;\n }\n\n if (password.length === 0) {\n setPasswordError(passwordRequiredMessage);\n return;\n }\n\n // Client-side checks passed — clear any prior field-level/form-level errors before dispatching.\n setEmailError(null);\n setPasswordError(null);\n setFormError(null);\n setPending(true);\n\n try {\n // Awaited (async/pessimistic): the cache flip is read on the next render via useSession(),\n // never assumed here.\n const errors = (await $actions?.session?.loginWithPassword?.({ email: trimmedEmail, password })) ?? [];\n\n if (errors.length > 0) {\n setFormError(\n mapSessionErrorMessage(errors[0], {\n invalidCredentialsMessage,\n blockedMessage,\n networkErrorMessage,\n genericErrorMessage,\n }),\n );\n // Credential hygiene: drop the rejected password, keep the email.\n setPassword('');\n }\n } finally {\n setPending(false);\n }\n }\n\n return (\n <form\n className={className}\n data-fs-sign-in-form=\"\"\n {...(pending ? { 'data-fs-sign-in-form-pending': '' } : {})}\n onSubmit={handleSubmit}\n >\n <EmailField\n label={emailLabel}\n placeholder={emailPlaceholder}\n value={email}\n disabled={pending}\n invalid={emailError != null}\n errorMessage={emailError ?? undefined}\n onValueChange={handleEmailChange}\n required\n />\n <PasswordField\n label={passwordLabel}\n placeholder={passwordPlaceholder}\n value={password}\n disabled={pending}\n invalid={passwordError != null}\n errorMessage={passwordError ?? undefined}\n showPasswordLabel={showPasswordLabel}\n hidePasswordLabel={hidePasswordLabel}\n onValueChange={handlePasswordChange}\n />\n {formError ? (\n <div data-fs-sign-in-form-error=\"\" role=\"alert\">\n {formError}\n </div>\n ) : null}\n <Button type=\"submit\" disabled={pending} data-fs-sign-in-form-submit=\"\">\n {submitLabel}\n </Button>\n </form>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sign-in-form.js","names":[],"sources":["../../../src/matter/sign-in-form/sign-in-form.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ContentValue,\n defineComponent,\n defineContentType,\n type MessageFieldName,\n type MessageLocaleProp,\n} from '@vtex/fs-core';\nimport type { FormEvent } from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { Button } from '../../particles/button/button.js';\nimport { isValidEmail } from '../../particles/email-field/email-field.js';\nimport { PasswordField } from '../../particles/password-field/password-field.js';\nimport { useActionsOverride } from '../../sdk/actions/actions-override-context.js';\nimport type { ComponentActions } from '../../sdk/actions/types.js';\nimport { useMessageFormatter } from '../../sdk/i18n/use-message-formatter.js';\nimport type { SessionUserError } from '../../sdk/session/auth-operations.js';\nimport { useSession } from '../session/session.js';\nimport { useSignIn } from '../sign-in/sign-in.js';\nimport { useSignInDisclosureOpen } from '../sign-in-disclosure/sign-in-disclosure.js';\n\n// ---------------------------------------------------------------------------\n// Content\n// ---------------------------------------------------------------------------\n\nexport const SignInFormContent = defineContentType({\n id: 'sign-in-form',\n title: 'Sign In Form',\n description: 'Labels and error messages of the password sign-in step.',\n schema: {\n type: 'object',\n additionalProperties: false,\n properties: {\n passwordLabel: { type: 'string', title: 'Password label', format: 'icu-message', messageSource: 'Password' },\n showPasswordLabel: {\n type: 'string',\n title: 'Show password label',\n format: 'icu-message',\n messageSource: 'Show password',\n },\n hidePasswordLabel: {\n type: 'string',\n title: 'Hide password label',\n format: 'icu-message',\n messageSource: 'Hide password',\n },\n submitLabel: { type: 'string', title: 'Submit label', format: 'icu-message', messageSource: 'Sign In' },\n passwordRequiredMessage: {\n type: 'string',\n title: 'Password required message',\n format: 'icu-message',\n messageSource: 'Enter your password.',\n },\n invalidCredentialsMessage: {\n type: 'string',\n title: 'Invalid credentials message',\n format: 'icu-message',\n messageSource: 'Incorrect email or password. Please try again.',\n },\n // Temporarily, and with no time: VTEX ID reports BlockedUser with no duration, so any deadline\n // here would be invented. Saying \"contact support\" sent a shopper somewhere that cannot help\n // with a block that lifts on its own. See the RFC's Open question 2.\n blockedMessage: {\n type: 'string',\n title: 'Blocked account message',\n format: 'icu-message',\n messageSource: 'Access to this account is temporarily blocked. Please try again later.',\n },\n networkErrorMessage: {\n type: 'string',\n title: 'Network error message',\n format: 'icu-message',\n messageSource: 'Unable to complete the request. Please try again.',\n },\n genericErrorMessage: {\n type: 'string',\n title: 'Generic error message',\n format: 'icu-message',\n messageSource: 'Unable to sign in. Please try again.',\n },\n },\n },\n});\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** The `sign-in-form` message a rejected sign-in renders. */\nexport type SignInFormErrorField = Extract<\n MessageFieldName<typeof SignInFormContent>,\n | 'passwordRequiredMessage'\n | 'invalidCredentialsMessage'\n | 'blockedMessage'\n | 'networkErrorMessage'\n | 'genericErrorMessage'\n>;\n\nexport type SignInFormProps = MessageLocaleProp &\n Readonly<{\n passwordPlaceholder?: string;\n /** Labels and error messages; see `SignInFormContent`. */\n $content?: ContentValue<typeof SignInFormContent>;\n /** Compiler-injected action surface; carries `session.loginWithPassword`. */\n $actions?: ComponentActions;\n className?: string;\n }>;\n\n// ---------------------------------------------------------------------------\n// Error mapping — pure, unit-tested.\n// ---------------------------------------------------------------------------\n\n/**\n * Maps the first resolved SessionUserError to the `sign-in-form` message that words it.\n * INVALID_ACCESS_CODE, ACCESS_CODE_SEND_LIMIT, and MISSING_AUTH_CONTEXT are contractually unreachable\n * from loginWithPassword but share the untyped `code: string` field, so they fall through to the\n * generic message defensively, alongside any future/unknown code.\n */\nexport function mapSessionErrorField(error: SessionUserError | undefined): SignInFormErrorField | null {\n if (!error) return null;\n switch (error.code) {\n case 'INVALID_CREDENTIALS':\n return 'invalidCredentialsMessage';\n case 'BLOCKED':\n return 'blockedMessage';\n case 'NETWORK_ERROR':\n return 'networkErrorMessage';\n default:\n return 'genericErrorMessage';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Definition\n// ---------------------------------------------------------------------------\n\nexport const SignInFormDefinition = defineComponent<SignInFormProps>({\n name: 'SignInForm',\n importPath: '@vtex/faststore/components',\n component: SignInForm,\n content: SignInFormContent,\n actions: { session: ['loginWithPassword'] },\n requiresContext: 'sign-in',\n editor: { label: 'Sign In Form', category: 'identity' },\n schema: {\n passwordPlaceholder: { type: 'string', default: '', label: 'Password placeholder' },\n },\n guideline:\n 'Password step of the sign-in surface: a password field and a submit dispatching $actions.session.loginWithPassword with the shared SignInRoot email draft. Renders only while the account has resolved, enables passwords, the password method is showing and the shopper is not loggedIn; otherwise nothing. Rejected credentials render beside the password field, every other failure in data-fs-sign-in-form-error. Labels and error messages are $content fields of sign-in-form. Reads no data of its own and renders no email field: compose SignInEmailControl beside it. Must be inside SignInRoot. See sign-in-form.md.',\n});\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n/**\n * Password method of the sign-in surface. It declares no fragment and reads no data of its own: the\n * gate is the `sign-in` context (`resolved`, `passwordEnabled` and `method === 'password'`) plus the\n * session read (`state !== 'loggedIn'`), so a store enabling both methods shows the password step only\n * while it is the method showing, and a store that disables passwords never shows it. It returns `null`\n * rather than unmounting, so a half-typed password survives a method switch.\n *\n * The email is the shared draft `SignInRoot` owns, read at submit time and trimmed; this form renders no\n * email field, and the submit stays disabled until that draft is a valid address. The password-presence\n * check runs on submit. The awaited dispatch's first `userError` maps to a `sign-in-form` message:\n * `INVALID_CREDENTIALS` is a claim about the password the shopper typed, so it renders on the\n * `PasswordField`; every other code is a claim about the account or the request and renders in\n * `data-fs-sign-in-form-error`. A dispatched attempt clears the password, accepted or rejected, and leaves the shared email alone.\n * While the write is in flight the password and submit are disabled and `data-fs-sign-in-form-pending` is\n * present so a checkout-CTA guard can block. The password clears when the session reaches `loggedIn`, and\n * when a `SignInModalPanel` hosting it closes: this form never unmounts, so it would otherwise outlive the\n * session it was typed for, and sit in the hidden panel after the shopper changed their mind.\n */\nexport function SignInForm({ passwordPlaceholder, $content, $actions: $actionsProp, className }: SignInFormProps) {\n const $actions = useActionsOverride($actionsProp);\n const { state } = useSession();\n const { email, method, passwordEnabled, resolved } = useSignIn();\n const { format } = useMessageFormatter(SignInFormContent, $content);\n\n const [password, setPassword] = useState('');\n const [pending, setPending] = useState(false);\n // The field that words each error, formatted at render.\n const [passwordError, setPasswordError] = useState<SignInFormErrorField | null>(null);\n const [formError, setFormError] = useState<SignInFormErrorField | null>(null);\n // `pending` is state, so two submits delivered in one batch both read it as false. The ref closes that window.\n const dispatching = useRef(false);\n\n // `false` while the panel of the enclosing `SignInDisclosureRoot` is closed, `undefined` outside one: no close to follow.\n const panelOpen = useSignInDisclosureOpen();\n\n // This form never unmounts, so a typed password and the errors about it would otherwise outlive the\n // session they belong to, or the panel the shopper closed, and greet whoever uses the page next.\n useEffect(() => {\n if (state === 'loggedIn' || panelOpen === false) {\n setPassword('');\n setPasswordError(null);\n setFormError(null);\n }\n }, [state, panelOpen]);\n\n // `resolved` first: an unresolved read leaves every flag `false`, which looks like an account that\n // enables nothing.\n const gated = state !== 'loggedIn' && resolved && passwordEnabled && method === 'password';\n if (!gated) return null;\n\n const canSubmit = !pending && isValidEmail(email);\n\n function handlePasswordChange(next: string) {\n setPassword(next);\n if (passwordError) setPasswordError(null);\n }\n\n async function handleSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (!canSubmit || dispatching.current) return;\n\n if (password.length === 0) {\n setPasswordError('passwordRequiredMessage');\n return;\n }\n\n // The address this render's draft holds, trimmed: the dispatch cannot move if the draft is edited while it\n // is in flight.\n const requestedEmail = email.trim();\n\n // Presence check passed — clear any prior errors before dispatching.\n setPasswordError(null);\n setFormError(null);\n dispatching.current = true;\n setPending(true);\n\n try {\n // Awaited (async/pessimistic): the cache flip is read on the next render via useSession(),\n // never assumed here.\n const errors = (await $actions?.session?.loginWithPassword?.({ email: requestedEmail, password })) ?? [];\n\n if (errors.length > 0) {\n const field = mapSessionErrorField(errors[0]);\n if (errors[0]?.code === 'INVALID_CREDENTIALS') setPasswordError(field);\n else setFormError(field);\n }\n // Credential hygiene: the password has been sent, whatever the answer, so drop it and keep the shared email.\n // The `loggedIn` effect covers the session flip; this covers a flip that does not arrive.\n setPassword('');\n } finally {\n dispatching.current = false;\n setPending(false);\n }\n }\n\n return (\n <form\n className={className}\n data-fs-sign-in-form=\"\"\n {...(pending ? { 'data-fs-sign-in-form-pending': '' } : {})}\n onSubmit={handleSubmit}\n >\n <PasswordField\n label={format('passwordLabel')}\n placeholder={passwordPlaceholder}\n value={password}\n disabled={pending}\n invalid={passwordError != null}\n errorMessage={passwordError ? format(passwordError) : undefined}\n showPasswordLabel={format('showPasswordLabel')}\n hidePasswordLabel={format('hidePasswordLabel')}\n onValueChange={handlePasswordChange}\n />\n {formError ? (\n <div data-fs-sign-in-form-error=\"\" role=\"alert\">\n {format(formError)}\n </div>\n ) : null}\n <Button type=\"submit\" disabled={!canSubmit} data-fs-sign-in-form-submit=\"\">\n {format('submitLabel')}\n </Button>\n </form>\n );\n}\n"],"mappings":"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"}
@@ -1,8 +1,33 @@
1
+ import { ContentValue, MessageLocaleProp } from "../../core/dist/define-content-type.js";
1
2
  import { ComponentDefinition } from "../../core/dist/define-component.js";
2
3
  import "../../core/dist/index.js";
3
4
  import { ComponentActions } from "../../sdk/actions/types.js";
4
5
  import { ComponentPropsWithRef } from "react";
5
6
  //#region src/particles/binding-switcher/binding-switcher.d.ts
7
+ export declare const BindingSwitcherContent: {
8
+ readonly id: "binding-switcher";
9
+ readonly title: "Binding Switcher";
10
+ readonly description: "Label of the binding select and the notice shown when a page has no equivalent in the chosen binding.";
11
+ readonly schema: {
12
+ readonly type: "object";
13
+ readonly additionalProperties: false;
14
+ readonly properties: {
15
+ readonly label: {
16
+ readonly type: "string";
17
+ readonly title: "Label";
18
+ readonly format: "icu-message";
19
+ readonly messageSource: "Language";
20
+ };
21
+ readonly notice: {
22
+ readonly type: "string";
23
+ readonly title: "No-equivalent notice";
24
+ readonly description: "Shown when the page loaded with fs_notice=no-equivalent.";
25
+ readonly format: "icu-message";
26
+ readonly messageSource: "This page isn't available in the selected language.";
27
+ };
28
+ };
29
+ };
30
+ };
6
31
  export type BindingSwitcherBinding = {
7
32
  locale?: unknown;
8
33
  currency?: unknown;
@@ -20,19 +45,15 @@ export declare function bindingSwitcherOptions(bindings: Record<string, BindingS
20
45
  id: string;
21
46
  label: string;
22
47
  }[];
23
- export declare const NOTICE_DEFAULT = "This page isn't available in the selected language.";
24
- export declare const LABEL_DEFAULT = "Language";
25
- export type BindingSwitcherProps = Omit<ComponentPropsWithRef<'div'>, 'children'> & {
48
+ export type BindingSwitcherProps = Omit<ComponentPropsWithRef<'div'>, 'children'> & MessageLocaleProp & {
26
49
  /** `foundation.json` `localization.bindings`, keyed by binding id. No library default. */
27
50
  bindings?: Record<string, BindingSwitcherBinding> | null;
28
- /** Accessible name, rendered as `Select.Label`. */
29
- label?: string;
30
- /** Shown when the page loaded with `fs_notice=no-equivalent`. */
31
- notice?: string;
32
51
  /** Injected from `actions: { locale: ['set'] }`. */
33
52
  $actions?: ComponentActions;
53
+ /** `label` is the accessible name, rendered as `Select.Label`; `notice` shows on `fs_notice=no-equivalent`. */
54
+ $content?: ContentValue<typeof BindingSwitcherContent>;
34
55
  };
35
56
  export declare const BindingSwitcherDefinition: ComponentDefinition<BindingSwitcherProps>;
36
- export declare function BindingSwitcher({ bindings, label, notice, $actions: $actionsProp, className, ...props }: BindingSwitcherProps): import("react/jsx-runtime").JSX.Element | null;
57
+ export declare function BindingSwitcher({ bindings, $actions: $actionsProp, $locale, $content, className, ...props }: BindingSwitcherProps): import("react/jsx-runtime").JSX.Element | null;
37
58
  //#endregion
38
59
  //# sourceMappingURL=binding-switcher.d.ts.map
@@ -1,14 +1,39 @@
1
1
  "use client";
2
2
  import { defineComponent } from "../../core/dist/define-component.js";
3
+ import { defineContentType } from "../../core/dist/define-content-type.js";
3
4
  import "../../core/dist/index.js";
4
5
  import { useStorefrontContext } from "../../sdk/context/storefront-context.js";
6
+ import { useMessageFormatter } from "../../sdk/i18n/use-message-formatter.js";
5
7
  import { useStorefrontRoute } from "../../sdk/navigation/use-storefront-route.js";
6
8
  import { useActionsOverride } from "../../sdk/actions/actions-override-context.js";
7
- import { resolveAuthoredCopy } from "../../utils/resolve-authored-copy.js";
8
9
  import { Select } from "../select/select.js";
9
10
  import { useEffect, useMemo, useRef, useState } from "react";
10
11
  import { jsx, jsxs } from "react/jsx-runtime";
11
12
  //#region src/particles/binding-switcher/binding-switcher.tsx
13
+ const BindingSwitcherContent = defineContentType({
14
+ id: "binding-switcher",
15
+ title: "Binding Switcher",
16
+ description: "Label of the binding select and the notice shown when a page has no equivalent in the chosen binding.",
17
+ schema: {
18
+ type: "object",
19
+ additionalProperties: false,
20
+ properties: {
21
+ label: {
22
+ type: "string",
23
+ title: "Label",
24
+ format: "icu-message",
25
+ messageSource: "Language"
26
+ },
27
+ notice: {
28
+ type: "string",
29
+ title: "No-equivalent notice",
30
+ description: "Shown when the page loaded with fs_notice=no-equivalent.",
31
+ format: "icu-message",
32
+ messageSource: "This page isn't available in the selected language."
33
+ }
34
+ }
35
+ }
36
+ });
12
37
  /**
13
38
  * `foundation.json` `localization.bindings`, keyed by binding id. An entry counts only when it is an
14
39
  * own key, the value is a non-null object, and `locale` is a string. Fewer than two counted
@@ -61,38 +86,25 @@ function compareOptions(a, b, activeLocale) {
61
86
  return a.label.localeCompare(b.label) || a.id.localeCompare(b.id);
62
87
  }
63
88
  }
64
- const NOTICE_DEFAULT = "This page isn't available in the selected language.";
65
89
  /** How long the control stays disabled after a started navigation that never unloads the page. */
66
90
  const NAVIGATION_TIMEOUT_MS = 1e4;
67
- const LABEL_DEFAULT = "Language";
68
91
  const BindingSwitcherDefinition = defineComponent({
69
92
  name: "BindingSwitcher",
70
93
  importPath: "@vtex/faststore/components",
71
94
  component: BindingSwitcher,
95
+ content: BindingSwitcherContent,
72
96
  editor: {
73
97
  label: "Binding Switcher",
74
98
  category: "action"
75
99
  },
76
100
  actions: { locale: ["set"] },
77
- schema: {
78
- bindings: {
79
- type: "object",
80
- label: "Bindings"
81
- },
82
- label: {
83
- type: "string",
84
- default: "Language",
85
- label: "Label"
86
- },
87
- notice: {
88
- type: "string",
89
- default: "This page isn't available in the selected language.",
90
- label: "Notice"
91
- }
92
- },
93
- guideline: "Lists the bindings a store declares and switches the whole binding (locale, currency, sales channel) through locale.set. Renders nothing when fewer than two bindings are present; the store passes bindings as $data.Global.localization.bindings."
101
+ schema: { bindings: {
102
+ type: "object",
103
+ label: "Bindings"
104
+ } },
105
+ guideline: "Lists the bindings a store declares and switches the whole binding (locale, currency, sales channel) through locale.set. Renders nothing when fewer than two bindings are present; the store passes bindings as $data.Global.localization.bindings. Its label and no-equivalent notice come from the $content fields label and notice."
94
106
  });
95
- function BindingSwitcher({ bindings, label, notice, $actions: $actionsProp, className, ...props }) {
107
+ function BindingSwitcher({ bindings, $actions: $actionsProp, $locale, $content, className, ...props }) {
96
108
  const $actions = useActionsOverride($actionsProp);
97
109
  const { bindingId, locale } = useStorefrontContext();
98
110
  const options = useMemo(() => bindingSwitcherOptions(bindings, locale), [bindings, locale]);
@@ -101,8 +113,7 @@ function BindingSwitcher({ bindings, label, notice, $actions: $actionsProp, clas
101
113
  const [noticePath, setNoticePath] = useState(null);
102
114
  const noticeVisible = noticePath !== null && noticePath === path;
103
115
  const pendingTimeout = useRef(void 0);
104
- const labelText = resolveAuthoredCopy(label, LABEL_DEFAULT);
105
- const noticeText = resolveAuthoredCopy(notice, NOTICE_DEFAULT);
116
+ const messages = useMessageFormatter(BindingSwitcherContent, $content);
106
117
  const optionCount = options.length;
107
118
  useEffect(() => {
108
119
  if (optionCount < 2) return;
@@ -152,13 +163,13 @@ function BindingSwitcher({ bindings, label, notice, $actions: $actionsProp, clas
152
163
  ...pending ? { "data-fs-binding-switcher-pending": "" } : {},
153
164
  children: [noticeVisible ? /* @__PURE__ */ jsx("output", {
154
165
  "data-fs-binding-switcher-notice": "",
155
- children: noticeText
166
+ children: messages.format("notice")
156
167
  }) : null, /* @__PURE__ */ jsxs(Select.Root, {
157
168
  value: bindingId,
158
169
  onValueChange: handleChange,
159
170
  disabled: pending,
160
171
  children: [
161
- /* @__PURE__ */ jsx(Select.Label, { children: labelText }),
172
+ /* @__PURE__ */ jsx(Select.Label, { children: messages.format("label") }),
162
173
  /* @__PURE__ */ jsxs(Select.Trigger, {
163
174
  disabled: pending,
164
175
  children: [/* @__PURE__ */ jsx(Select.Value, { children: (value) => options.find((option) => option.id === value)?.label ?? value ?? "" }), /* @__PURE__ */ jsx(Select.Icon, { children: "▾" })]
@@ -178,6 +189,6 @@ function BindingSwitcher({ bindings, label, notice, $actions: $actionsProp, clas
178
189
  });
179
190
  }
180
191
  //#endregion
181
- export { BindingSwitcher, BindingSwitcherDefinition, LABEL_DEFAULT, NOTICE_DEFAULT, bindingSwitcherOptions };
192
+ export { BindingSwitcher, BindingSwitcherContent, BindingSwitcherDefinition, bindingSwitcherOptions };
182
193
 
183
194
  //# sourceMappingURL=binding-switcher.js.map