@12-apps/ui 6.15.0 → 6.16.0

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 (390) hide show
  1. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +4 -4
  2. package/dist/_internal/components/data-display/CardKit/CardKebab.js +3 -3
  3. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +3 -3
  4. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +3 -3
  5. package/dist/_internal/components/data-display/Chart/Chart.js +4 -4
  6. package/dist/_internal/components/data-display/Chart/SpecChart.js +5 -5
  7. package/dist/_internal/components/data-display/Chart/chart-context.js +2 -2
  8. package/dist/_internal/components/data-display/Chart/chart-renderers.js +3 -3
  9. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +1 -1
  10. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +30 -29
  11. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +40 -39
  12. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +3 -3
  13. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +4 -4
  14. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +6 -5
  15. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +2 -2
  16. package/dist/_internal/components/data-display/DataViews/base-list-card.js +4 -4
  17. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +11 -10
  18. package/dist/_internal/components/data-display/DataViews/data-views-columns.js +4 -4
  19. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +4 -4
  20. package/dist/_internal/components/data-display/DataViews/data-views-empty.js +3 -3
  21. package/dist/_internal/components/data-display/DataViews/data-views-export.js +3 -3
  22. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +12 -11
  23. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +6 -6
  24. package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +3 -3
  25. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +27 -26
  26. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +15 -14
  27. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +1 -1
  28. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +4 -4
  29. package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +3 -3
  30. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +9 -9
  31. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +10 -9
  32. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +8 -8
  33. package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +3 -3
  34. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +5 -5
  35. package/dist/_internal/components/data-display/DataViews/use-saved-views-controller.js +2 -2
  36. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js +2 -2
  37. package/dist/_internal/components/data-display/LazyImage/LazyImage.js +3 -3
  38. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +3 -3
  39. package/dist/_internal/components/data-display/LoadingState/LoadingState.js +3 -3
  40. package/dist/_internal/components/data-display/Sheet/Sheet.hooks.js +2 -2
  41. package/dist/_internal/components/data-display/Sheet/Sheet.js +4 -4
  42. package/dist/_internal/components/data-display/StatCard/StatCard.js +3 -3
  43. package/dist/_internal/components/data-display/index.js +21 -21
  44. package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +3 -3
  45. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.js +2 -2
  46. package/dist/_internal/components/feedback/index.js +7 -7
  47. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +4 -4
  48. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +10 -9
  49. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +4 -3
  50. package/dist/_internal/components/form/AddressAutocomplete/AddressFallbackField.js +3 -2
  51. package/dist/_internal/components/form/AddressAutocomplete/AddressInputField.js +3 -2
  52. package/dist/_internal/components/form/AddressAutocomplete/AddressTextField.js +2 -1
  53. package/dist/_internal/components/form/Button/Button.js +2 -2
  54. package/dist/_internal/components/form/Calendar/Calendar.js +4 -4
  55. package/dist/_internal/components/form/Calendar/CalendarDayCell.js +2 -2
  56. package/dist/_internal/components/form/Calendar/CalendarMonth.js +3 -3
  57. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +7 -6
  58. package/dist/_internal/components/form/CategorySelect/CategoryPanelFoot.js +3 -2
  59. package/dist/_internal/components/form/CategorySelect/CategoryPanelHead.js +3 -2
  60. package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +4 -3
  61. package/dist/_internal/components/form/CategorySelect/CategoryRows.js +3 -2
  62. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +9 -8
  63. package/dist/_internal/components/form/CategorySelect/CategorySelect.styles.js +2 -1
  64. package/dist/_internal/components/form/CategorySelect/CategoryTrigger.js +3 -2
  65. package/dist/_internal/components/form/CepField/CepField.js +4 -3
  66. package/dist/_internal/components/form/CodeEditor/CodeEditor.js +2 -1
  67. package/dist/_internal/components/form/CreatableSelect/CreatableSelect.js +2 -1
  68. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +6 -6
  69. package/dist/_internal/components/form/Input/Input.js +3 -2
  70. package/dist/_internal/components/form/Input/Input.styles.js +2 -1
  71. package/dist/_internal/components/form/InputOTP/InputOTP.js +3 -2
  72. package/dist/_internal/components/form/InputOTP/InputOTP.styles.js +2 -1
  73. package/dist/_internal/components/form/PhoneInput/PhoneInput.hooks.js +2 -2
  74. package/dist/_internal/components/form/PhoneInput/PhoneInput.js +4 -3
  75. package/dist/_internal/components/form/RadioGroup/RadioGroup.js +4 -3
  76. package/dist/_internal/components/form/RadioGroup/RadioGroup.styles.js +2 -1
  77. package/dist/_internal/components/form/RadioGroup/RadioGroup.variants.js +3 -2
  78. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.js +3 -2
  79. package/dist/_internal/components/form/Select/Select.js +2 -1
  80. package/dist/_internal/components/form/Textarea/Textarea.js +3 -2
  81. package/dist/_internal/components/form/Textarea/Textarea.styles.js +2 -1
  82. package/dist/_internal/components/form/Textarea/TextareaRichEditor.js +5 -2
  83. package/dist/_internal/components/form/Textarea/TextareaRichEditor.js.map +1 -1
  84. package/dist/_internal/components/form/Toggle/Toggle.js +3 -2
  85. package/dist/_internal/components/form/Toggle/Toggle.styles.js +2 -1
  86. package/dist/_internal/components/form/index.js +37 -36
  87. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +10 -9
  88. package/dist/_internal/components/form/total-form/Fields/CepField.js +5 -4
  89. package/dist/_internal/components/form/total-form/Fields/SelectField.js +3 -2
  90. package/dist/_internal/components/form/total-form/Fields/TextField.js +4 -3
  91. package/dist/_internal/components/form/total-form/Fields/index.js +20 -19
  92. package/dist/_internal/components/form/total-form/SubmitButton.js +3 -3
  93. package/dist/_internal/components/index.js +69 -68
  94. package/dist/_internal/components/layout/Skeleton/Skeleton.js +2 -2
  95. package/dist/_internal/components/layout/index.js +5 -5
  96. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +7 -7
  97. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +2 -2
  98. package/dist/_internal/components/navigation/index.js +9 -9
  99. package/dist/_internal/en-US.form.js +3 -1
  100. package/dist/_internal/pt-BR.form.js +3 -1
  101. package/dist/_internal/social-login-button/social-login-button.js +4 -3
  102. package/dist/_internal/tokens/field-edge.js +10 -0
  103. package/dist/_internal/tokens/field-edge.js.map +1 -0
  104. package/dist/_internal/user-avatar/user-avatar.js +3 -3
  105. package/dist/charts.js +5 -5
  106. package/dist/{chunk-4VPCZFF3.js → chunk-2W4CIWTW.js} +7 -4
  107. package/dist/chunk-2W4CIWTW.js.map +1 -0
  108. package/dist/{chunk-BQYIJOKS.js → chunk-2ZDTGI5V.js} +2 -2
  109. package/dist/{chunk-VLNM4BTH.js → chunk-3LO5JWTC.js} +3 -3
  110. package/dist/{chunk-MYOFULG4.js → chunk-3ORFVLI3.js} +2 -2
  111. package/dist/{chunk-J72KWTHC.js → chunk-45N6LXUU.js} +5 -3
  112. package/dist/chunk-45N6LXUU.js.map +1 -0
  113. package/dist/{chunk-MJOXIENM.js → chunk-45OIUWGO.js} +7 -7
  114. package/dist/{chunk-S7CAXRRP.js → chunk-4Y65Q3CR.js} +2 -2
  115. package/dist/{chunk-XN5AYC5S.js → chunk-5SYD23V4.js} +7 -4
  116. package/dist/chunk-5SYD23V4.js.map +1 -0
  117. package/dist/{chunk-ZLNKBKUB.js → chunk-5VVM2PPV.js} +3 -3
  118. package/dist/{chunk-4KNJQFDJ.js → chunk-64IEKEMQ.js} +5 -2
  119. package/dist/chunk-64IEKEMQ.js.map +1 -0
  120. package/dist/{chunk-CRHQN42I.js → chunk-6CBYPMYQ.js} +4 -4
  121. package/dist/{chunk-WXVHZHSJ.js → chunk-6RFL7HGI.js} +3 -3
  122. package/dist/{chunk-GDUIT5I6.js → chunk-6TYSEAAT.js} +2 -2
  123. package/dist/{chunk-FXMZMX5E.js → chunk-6XPNJLXE.js} +6 -2
  124. package/dist/chunk-6XPNJLXE.js.map +1 -0
  125. package/dist/{chunk-C34GFGA5.js → chunk-72NOM3O2.js} +2 -2
  126. package/dist/{chunk-LNQ6QMKG.js → chunk-7DBFEZRC.js} +6 -3
  127. package/dist/chunk-7DBFEZRC.js.map +1 -0
  128. package/dist/{chunk-3BR2CLAM.js → chunk-A3KY6NUA.js} +2 -2
  129. package/dist/{chunk-5QQWAIZO.js → chunk-ACDYA5WC.js} +6 -2
  130. package/dist/chunk-ACDYA5WC.js.map +1 -0
  131. package/dist/{chunk-2I5B5NNT.js → chunk-AX7UFG2U.js} +2 -2
  132. package/dist/{chunk-PXH24VIP.js → chunk-B6IURHSZ.js} +4 -4
  133. package/dist/{chunk-TXHJX2NG.js → chunk-BGYLL467.js} +4 -4
  134. package/dist/{chunk-CZJLWCEG.js → chunk-BPYPUEM5.js} +2 -2
  135. package/dist/{chunk-QISJKBCM.js → chunk-CDJPDZCA.js} +2 -2
  136. package/dist/{chunk-5VZPVDUF.js → chunk-COSJTD6Z.js} +2 -2
  137. package/dist/{chunk-Q6KXTTC4.js → chunk-CXA6UNFF.js} +5 -5
  138. package/dist/{chunk-MNZ2NT5A.js → chunk-DCEMUZJQ.js} +6 -2
  139. package/dist/chunk-DCEMUZJQ.js.map +1 -0
  140. package/dist/{chunk-NKCKIGRL.js → chunk-DGMR3IMM.js} +3 -3
  141. package/dist/{chunk-MUFI3ZXS.js → chunk-DQIQKIEA.js} +2 -2
  142. package/dist/{chunk-747HBFGH.js → chunk-EE2LBAJH.js} +7 -7
  143. package/dist/{chunk-RXYSP56G.js → chunk-ELYLG4F7.js} +3 -3
  144. package/dist/{chunk-6YFMGNSA.js → chunk-ENK4XGKF.js} +2 -2
  145. package/dist/{chunk-QTPKACVO.js → chunk-EY4LPLIR.js} +2 -2
  146. package/dist/{chunk-XCT2ZLA6.js → chunk-FCOEJCUP.js} +6 -2
  147. package/dist/chunk-FCOEJCUP.js.map +1 -0
  148. package/dist/{chunk-LDMXHDZ5.js → chunk-FF55LRSV.js} +2 -2
  149. package/dist/{chunk-HGBZZDP6.js → chunk-FJHNNSD3.js} +3 -3
  150. package/dist/{chunk-ONZPM6FP.js → chunk-G7CFUI4I.js} +2 -2
  151. package/dist/{chunk-KDIWFARU.js → chunk-GBB6XQ56.js} +2 -2
  152. package/dist/{chunk-WWNXJMBX.js → chunk-GFBNUWT5.js} +3 -3
  153. package/dist/{chunk-PLOOVF43.js → chunk-GGE7Y53F.js} +2 -2
  154. package/dist/{chunk-7SZ3PFZW.js → chunk-HBAPVB7T.js} +2 -2
  155. package/dist/{chunk-V7TPSQOH.js → chunk-HBZIN6IQ.js} +2 -2
  156. package/dist/{chunk-LS42VJAI.js → chunk-HEDOL2RV.js} +2 -2
  157. package/dist/{chunk-3AOOI2NR.js → chunk-HR7YTBR7.js} +4 -4
  158. package/dist/{chunk-6HLRXICF.js → chunk-IAQFQNBL.js} +4 -4
  159. package/dist/{chunk-6B5VS2ER.js → chunk-INGPH3YQ.js} +8 -2
  160. package/dist/chunk-INGPH3YQ.js.map +1 -0
  161. package/dist/{chunk-PUBPZOQJ.js → chunk-IPE5FFFD.js} +2 -2
  162. package/dist/{chunk-NVOQLMYF.js → chunk-IRDGC7FK.js} +4 -4
  163. package/dist/{chunk-YVX7GGS4.js → chunk-JPDKRGYI.js} +2 -2
  164. package/dist/{chunk-LFB4H7Y6.js → chunk-KNNBIXWJ.js} +2 -2
  165. package/dist/{chunk-47DCYF4G.js → chunk-KSF7TLXH.js} +3 -3
  166. package/dist/{chunk-I2S2GHEG.js → chunk-LUWATXU4.js} +4 -4
  167. package/dist/{chunk-J7VY6KNP.js → chunk-M3RIC6JI.js} +2 -2
  168. package/dist/{chunk-434EDUHY.js → chunk-MHFJBNDP.js} +8 -8
  169. package/dist/chunk-MLOWPVVW.js +44 -0
  170. package/dist/chunk-MLOWPVVW.js.map +1 -0
  171. package/dist/{chunk-5KZESOK6.js → chunk-MUAVYVDJ.js} +6 -6
  172. package/dist/{chunk-PRAGFBHW.js → chunk-N4WANJI3.js} +2 -2
  173. package/dist/{chunk-LR2ECQSZ.js → chunk-O3OU2PPT.js} +2 -2
  174. package/dist/{chunk-YROTCW42.js → chunk-O6J4CKS5.js} +2 -2
  175. package/dist/{chunk-FSMQF5P5.js → chunk-P2U7C2S7.js} +16 -7
  176. package/dist/chunk-P2U7C2S7.js.map +1 -0
  177. package/dist/{chunk-UPR7F3ML.js → chunk-PKJKA4CU.js} +2 -2
  178. package/dist/{chunk-NI2ISQZI.js → chunk-PLK7UGO6.js} +3 -3
  179. package/dist/{chunk-U7SO3N42.js → chunk-PMFW55F5.js} +3 -3
  180. package/dist/{chunk-GPVB3FQP.js → chunk-PU3AAKRR.js} +2 -2
  181. package/dist/{chunk-UN5D73A4.js → chunk-QETBO7EC.js} +2 -2
  182. package/dist/{chunk-OLZTGVBT.js → chunk-REMK55JI.js} +4 -4
  183. package/dist/{chunk-3AEY5TYV.js → chunk-RMSH2I3O.js} +8 -4
  184. package/dist/chunk-RMSH2I3O.js.map +1 -0
  185. package/dist/{chunk-CPNSVIIB.js → chunk-RP3W6IQO.js} +5 -5
  186. package/dist/{chunk-4QQVIGRG.js → chunk-RQ4EQ5FJ.js} +2 -2
  187. package/dist/{chunk-QL7L6RHR.js → chunk-RX6DWIIW.js} +2 -2
  188. package/dist/{chunk-RGBS6N72.js → chunk-SEH7KOVG.js} +2 -2
  189. package/dist/{chunk-LUMF63BM.js → chunk-SFAP5EH5.js} +4 -4
  190. package/dist/{chunk-GJQYM3PM.js → chunk-SHQWIDD5.js} +4 -4
  191. package/dist/{chunk-NQCYVYP3.js → chunk-SLYZMJEL.js} +2 -2
  192. package/dist/{chunk-HKROKM3Z.js → chunk-SM3NRN7L.js} +2 -2
  193. package/dist/{chunk-XSJWN3WH.js → chunk-T53L42XW.js} +7 -7
  194. package/dist/{chunk-NJS4WCHA.js → chunk-TPUIIZN2.js} +10 -10
  195. package/dist/{chunk-ZPIFVTJA.js → chunk-TUAIPMU7.js} +5 -5
  196. package/dist/{chunk-SQAU5QUY.js → chunk-UMDXGIRZ.js} +6 -3
  197. package/dist/chunk-UMDXGIRZ.js.map +1 -0
  198. package/dist/{chunk-ZYRW7FVY.js → chunk-URWGRPL7.js} +6 -2
  199. package/dist/chunk-URWGRPL7.js.map +1 -0
  200. package/dist/{chunk-B5LNUTGZ.js → chunk-VJKRJYZL.js} +2 -2
  201. package/dist/{chunk-Q6HJMJBH.js → chunk-VSLUFBMT.js} +7 -3
  202. package/dist/chunk-VSLUFBMT.js.map +1 -0
  203. package/dist/{chunk-7EGHRNIA.js → chunk-VVXRIPV5.js} +8 -8
  204. package/dist/{chunk-HOJL2GKW.js → chunk-WC3W36AM.js} +4 -4
  205. package/dist/{chunk-ARI5ZU75.js → chunk-WEH5TCPE.js} +5 -5
  206. package/dist/{chunk-CESQKLIR.js → chunk-WFX5GASM.js} +2 -2
  207. package/dist/{chunk-HIZCBYEP.js → chunk-WR6F6J43.js} +5 -5
  208. package/dist/{chunk-MHJ52VJE.js → chunk-XSKVBGCZ.js} +5 -5
  209. package/dist/{chunk-SE4Z3P6D.js → chunk-XULTDO56.js} +2 -2
  210. package/dist/{chunk-H54E2ZGJ.js → chunk-YLSDFW5O.js} +8 -2
  211. package/dist/chunk-YLSDFW5O.js.map +1 -0
  212. package/dist/{chunk-K25MT3GZ.js → chunk-YVW7VPK4.js} +2 -2
  213. package/dist/{chunk-XQ2BNVXL.js → chunk-ZBNTFWTG.js} +2 -2
  214. package/dist/data-display/AsyncStateContainer.js +4 -4
  215. package/dist/data-display/CardKit.js +7 -7
  216. package/dist/data-display/Chart.js +5 -5
  217. package/dist/data-display/DataGrid.js +1 -1
  218. package/dist/data-display/DataViews.js +46 -45
  219. package/dist/data-display/InteractiveTooltip.js +2 -2
  220. package/dist/data-display/LazyImage.js +3 -3
  221. package/dist/data-display/Lightbox.js +3 -3
  222. package/dist/data-display/LoadingState.js +3 -3
  223. package/dist/data-display/Sheet.js +4 -4
  224. package/dist/data-display/StatCard.js +3 -3
  225. package/dist/en-US.js +11 -9
  226. package/dist/feedback/ConfirmAction.js +5 -5
  227. package/dist/feedback/TutorialOverlay.js +2 -2
  228. package/dist/form/AddressAutocomplete.js +10 -9
  229. package/dist/form/Button.js +2 -2
  230. package/dist/form/Calendar.js +4 -4
  231. package/dist/form/CategorySelect.js +9 -8
  232. package/dist/form/CepField.js +4 -3
  233. package/dist/form/CodeEditor.js +2 -1
  234. package/dist/form/CreatableSelect.js +2 -1
  235. package/dist/form/DateRangePicker.js +6 -6
  236. package/dist/form/Input.js +3 -2
  237. package/dist/form/InputOTP.js +3 -2
  238. package/dist/form/PhoneInput.js +4 -3
  239. package/dist/form/RadioGroup.js +4 -3
  240. package/dist/form/RichTextEditor.js +3 -2
  241. package/dist/form/Select.js +2 -1
  242. package/dist/form/Textarea.js +3 -2
  243. package/dist/form/Toggle.js +3 -2
  244. package/dist/form/total-form.js +23 -22
  245. package/dist/layout/ContentToolbar.js +3 -3
  246. package/dist/layout/Skeleton.js +2 -2
  247. package/dist/locales.js +17 -10
  248. package/dist/locales.js.map +1 -1
  249. package/dist/navigation/AppHeader.js +7 -7
  250. package/dist/navigation/CommandPalette.js +2 -2
  251. package/dist/pt-BR.js +3 -1
  252. package/dist/social-login-button.js +4 -3
  253. package/dist/types/components/form/AddressAutocomplete/AddressTextField.d.ts.map +1 -1
  254. package/dist/types/components/form/CategorySelect/CategorySelect.styles.d.ts.map +1 -1
  255. package/dist/types/components/form/CodeEditor/CodeEditor.d.ts.map +1 -1
  256. package/dist/types/components/form/CreatableSelect/CreatableSelect.d.ts.map +1 -1
  257. package/dist/types/components/form/Input/Input.styles.d.ts.map +1 -1
  258. package/dist/types/components/form/InputOTP/InputOTP.styles.d.ts.map +1 -1
  259. package/dist/types/components/form/PhoneInput/PhoneInput.d.ts.map +1 -1
  260. package/dist/types/components/form/RadioGroup/RadioGroup.styles.d.ts.map +1 -1
  261. package/dist/types/components/form/RichTextEditor/RichTextEditor.d.ts.map +1 -1
  262. package/dist/types/components/form/Select/Select.d.ts.map +1 -1
  263. package/dist/types/components/form/Textarea/Textarea.d.ts.map +1 -1
  264. package/dist/types/components/form/Textarea/Textarea.styles.d.ts.map +1 -1
  265. package/dist/types/components/form/Textarea/TextareaRichEditor.d.ts.map +1 -1
  266. package/dist/types/components/form/Toggle/Toggle.styles.d.ts.map +1 -1
  267. package/dist/types/copy/form.d.ts +12 -0
  268. package/dist/types/copy/form.d.ts.map +1 -1
  269. package/dist/types/en-US.form.d.ts +2 -1
  270. package/dist/types/en-US.form.d.ts.map +1 -1
  271. package/dist/types/locales.d.ts +2 -1
  272. package/dist/types/locales.d.ts.map +1 -1
  273. package/dist/types/pt-BR.form.d.ts +2 -1
  274. package/dist/types/pt-BR.form.d.ts.map +1 -1
  275. package/dist/types/social-login-button/social-login-button.d.ts +24 -0
  276. package/dist/types/social-login-button/social-login-button.d.ts.map +1 -1
  277. package/dist/types/tokens/field-edge.d.ts +80 -0
  278. package/dist/types/tokens/field-edge.d.ts.map +1 -0
  279. package/dist/user-avatar.js +3 -3
  280. package/package.json +1 -1
  281. package/src/components/form/AddressAutocomplete/AddressTextField.tsx +3 -1
  282. package/src/components/form/CategorySelect/CategorySelect.styles.ts +3 -1
  283. package/src/components/form/CodeEditor/CodeEditor.tsx +3 -1
  284. package/src/components/form/CreatableSelect/CreatableSelect.tsx +4 -2
  285. package/src/components/form/Input/Input.styles.ts +5 -3
  286. package/src/components/form/InputOTP/InputOTP.styles.ts +3 -1
  287. package/src/components/form/PhoneInput/PhoneInput.tsx +3 -1
  288. package/src/components/form/RadioGroup/RadioGroup.styles.ts +4 -2
  289. package/src/components/form/RichTextEditor/RichTextEditor.tsx +3 -1
  290. package/src/components/form/Select/Select.tsx +4 -2
  291. package/src/components/form/Textarea/Textarea.styles.ts +3 -1
  292. package/src/components/form/Textarea/Textarea.tsx +4 -2
  293. package/src/components/form/Textarea/TextareaRichEditor.tsx +3 -1
  294. package/src/components/form/Toggle/Toggle.styles.ts +3 -1
  295. package/src/copy/form.ts +13 -0
  296. package/src/en-US.form.ts +7 -0
  297. package/src/locales.ts +6 -1
  298. package/src/pt-BR.form.ts +7 -0
  299. package/src/social-login-button/social-login-button.tsx +39 -6
  300. package/src/tokens/field-edge.ts +141 -0
  301. package/dist/chunk-3AEY5TYV.js.map +0 -1
  302. package/dist/chunk-4KNJQFDJ.js.map +0 -1
  303. package/dist/chunk-4VPCZFF3.js.map +0 -1
  304. package/dist/chunk-5QQWAIZO.js.map +0 -1
  305. package/dist/chunk-6B5VS2ER.js.map +0 -1
  306. package/dist/chunk-FSMQF5P5.js.map +0 -1
  307. package/dist/chunk-FXMZMX5E.js.map +0 -1
  308. package/dist/chunk-H54E2ZGJ.js.map +0 -1
  309. package/dist/chunk-J72KWTHC.js.map +0 -1
  310. package/dist/chunk-LNQ6QMKG.js.map +0 -1
  311. package/dist/chunk-MNZ2NT5A.js.map +0 -1
  312. package/dist/chunk-Q6HJMJBH.js.map +0 -1
  313. package/dist/chunk-SQAU5QUY.js.map +0 -1
  314. package/dist/chunk-XCT2ZLA6.js.map +0 -1
  315. package/dist/chunk-XN5AYC5S.js.map +0 -1
  316. package/dist/chunk-ZYRW7FVY.js.map +0 -1
  317. /package/dist/{chunk-BQYIJOKS.js.map → chunk-2ZDTGI5V.js.map} +0 -0
  318. /package/dist/{chunk-VLNM4BTH.js.map → chunk-3LO5JWTC.js.map} +0 -0
  319. /package/dist/{chunk-MYOFULG4.js.map → chunk-3ORFVLI3.js.map} +0 -0
  320. /package/dist/{chunk-MJOXIENM.js.map → chunk-45OIUWGO.js.map} +0 -0
  321. /package/dist/{chunk-S7CAXRRP.js.map → chunk-4Y65Q3CR.js.map} +0 -0
  322. /package/dist/{chunk-ZLNKBKUB.js.map → chunk-5VVM2PPV.js.map} +0 -0
  323. /package/dist/{chunk-CRHQN42I.js.map → chunk-6CBYPMYQ.js.map} +0 -0
  324. /package/dist/{chunk-WXVHZHSJ.js.map → chunk-6RFL7HGI.js.map} +0 -0
  325. /package/dist/{chunk-GDUIT5I6.js.map → chunk-6TYSEAAT.js.map} +0 -0
  326. /package/dist/{chunk-C34GFGA5.js.map → chunk-72NOM3O2.js.map} +0 -0
  327. /package/dist/{chunk-3BR2CLAM.js.map → chunk-A3KY6NUA.js.map} +0 -0
  328. /package/dist/{chunk-2I5B5NNT.js.map → chunk-AX7UFG2U.js.map} +0 -0
  329. /package/dist/{chunk-PXH24VIP.js.map → chunk-B6IURHSZ.js.map} +0 -0
  330. /package/dist/{chunk-TXHJX2NG.js.map → chunk-BGYLL467.js.map} +0 -0
  331. /package/dist/{chunk-CZJLWCEG.js.map → chunk-BPYPUEM5.js.map} +0 -0
  332. /package/dist/{chunk-QISJKBCM.js.map → chunk-CDJPDZCA.js.map} +0 -0
  333. /package/dist/{chunk-5VZPVDUF.js.map → chunk-COSJTD6Z.js.map} +0 -0
  334. /package/dist/{chunk-Q6KXTTC4.js.map → chunk-CXA6UNFF.js.map} +0 -0
  335. /package/dist/{chunk-NKCKIGRL.js.map → chunk-DGMR3IMM.js.map} +0 -0
  336. /package/dist/{chunk-MUFI3ZXS.js.map → chunk-DQIQKIEA.js.map} +0 -0
  337. /package/dist/{chunk-747HBFGH.js.map → chunk-EE2LBAJH.js.map} +0 -0
  338. /package/dist/{chunk-RXYSP56G.js.map → chunk-ELYLG4F7.js.map} +0 -0
  339. /package/dist/{chunk-6YFMGNSA.js.map → chunk-ENK4XGKF.js.map} +0 -0
  340. /package/dist/{chunk-QTPKACVO.js.map → chunk-EY4LPLIR.js.map} +0 -0
  341. /package/dist/{chunk-LDMXHDZ5.js.map → chunk-FF55LRSV.js.map} +0 -0
  342. /package/dist/{chunk-HGBZZDP6.js.map → chunk-FJHNNSD3.js.map} +0 -0
  343. /package/dist/{chunk-ONZPM6FP.js.map → chunk-G7CFUI4I.js.map} +0 -0
  344. /package/dist/{chunk-KDIWFARU.js.map → chunk-GBB6XQ56.js.map} +0 -0
  345. /package/dist/{chunk-WWNXJMBX.js.map → chunk-GFBNUWT5.js.map} +0 -0
  346. /package/dist/{chunk-PLOOVF43.js.map → chunk-GGE7Y53F.js.map} +0 -0
  347. /package/dist/{chunk-7SZ3PFZW.js.map → chunk-HBAPVB7T.js.map} +0 -0
  348. /package/dist/{chunk-V7TPSQOH.js.map → chunk-HBZIN6IQ.js.map} +0 -0
  349. /package/dist/{chunk-LS42VJAI.js.map → chunk-HEDOL2RV.js.map} +0 -0
  350. /package/dist/{chunk-3AOOI2NR.js.map → chunk-HR7YTBR7.js.map} +0 -0
  351. /package/dist/{chunk-6HLRXICF.js.map → chunk-IAQFQNBL.js.map} +0 -0
  352. /package/dist/{chunk-PUBPZOQJ.js.map → chunk-IPE5FFFD.js.map} +0 -0
  353. /package/dist/{chunk-NVOQLMYF.js.map → chunk-IRDGC7FK.js.map} +0 -0
  354. /package/dist/{chunk-YVX7GGS4.js.map → chunk-JPDKRGYI.js.map} +0 -0
  355. /package/dist/{chunk-LFB4H7Y6.js.map → chunk-KNNBIXWJ.js.map} +0 -0
  356. /package/dist/{chunk-47DCYF4G.js.map → chunk-KSF7TLXH.js.map} +0 -0
  357. /package/dist/{chunk-I2S2GHEG.js.map → chunk-LUWATXU4.js.map} +0 -0
  358. /package/dist/{chunk-J7VY6KNP.js.map → chunk-M3RIC6JI.js.map} +0 -0
  359. /package/dist/{chunk-434EDUHY.js.map → chunk-MHFJBNDP.js.map} +0 -0
  360. /package/dist/{chunk-5KZESOK6.js.map → chunk-MUAVYVDJ.js.map} +0 -0
  361. /package/dist/{chunk-PRAGFBHW.js.map → chunk-N4WANJI3.js.map} +0 -0
  362. /package/dist/{chunk-LR2ECQSZ.js.map → chunk-O3OU2PPT.js.map} +0 -0
  363. /package/dist/{chunk-YROTCW42.js.map → chunk-O6J4CKS5.js.map} +0 -0
  364. /package/dist/{chunk-UPR7F3ML.js.map → chunk-PKJKA4CU.js.map} +0 -0
  365. /package/dist/{chunk-NI2ISQZI.js.map → chunk-PLK7UGO6.js.map} +0 -0
  366. /package/dist/{chunk-U7SO3N42.js.map → chunk-PMFW55F5.js.map} +0 -0
  367. /package/dist/{chunk-GPVB3FQP.js.map → chunk-PU3AAKRR.js.map} +0 -0
  368. /package/dist/{chunk-UN5D73A4.js.map → chunk-QETBO7EC.js.map} +0 -0
  369. /package/dist/{chunk-OLZTGVBT.js.map → chunk-REMK55JI.js.map} +0 -0
  370. /package/dist/{chunk-CPNSVIIB.js.map → chunk-RP3W6IQO.js.map} +0 -0
  371. /package/dist/{chunk-4QQVIGRG.js.map → chunk-RQ4EQ5FJ.js.map} +0 -0
  372. /package/dist/{chunk-QL7L6RHR.js.map → chunk-RX6DWIIW.js.map} +0 -0
  373. /package/dist/{chunk-RGBS6N72.js.map → chunk-SEH7KOVG.js.map} +0 -0
  374. /package/dist/{chunk-LUMF63BM.js.map → chunk-SFAP5EH5.js.map} +0 -0
  375. /package/dist/{chunk-GJQYM3PM.js.map → chunk-SHQWIDD5.js.map} +0 -0
  376. /package/dist/{chunk-NQCYVYP3.js.map → chunk-SLYZMJEL.js.map} +0 -0
  377. /package/dist/{chunk-HKROKM3Z.js.map → chunk-SM3NRN7L.js.map} +0 -0
  378. /package/dist/{chunk-XSJWN3WH.js.map → chunk-T53L42XW.js.map} +0 -0
  379. /package/dist/{chunk-NJS4WCHA.js.map → chunk-TPUIIZN2.js.map} +0 -0
  380. /package/dist/{chunk-ZPIFVTJA.js.map → chunk-TUAIPMU7.js.map} +0 -0
  381. /package/dist/{chunk-B5LNUTGZ.js.map → chunk-VJKRJYZL.js.map} +0 -0
  382. /package/dist/{chunk-7EGHRNIA.js.map → chunk-VVXRIPV5.js.map} +0 -0
  383. /package/dist/{chunk-HOJL2GKW.js.map → chunk-WC3W36AM.js.map} +0 -0
  384. /package/dist/{chunk-ARI5ZU75.js.map → chunk-WEH5TCPE.js.map} +0 -0
  385. /package/dist/{chunk-CESQKLIR.js.map → chunk-WFX5GASM.js.map} +0 -0
  386. /package/dist/{chunk-HIZCBYEP.js.map → chunk-WR6F6J43.js.map} +0 -0
  387. /package/dist/{chunk-MHJ52VJE.js.map → chunk-XSKVBGCZ.js.map} +0 -0
  388. /package/dist/{chunk-SE4Z3P6D.js.map → chunk-XULTDO56.js.map} +0 -0
  389. /package/dist/{chunk-K25MT3GZ.js.map → chunk-YVW7VPK4.js.map} +0 -0
  390. /package/dist/{chunk-XQ2BNVXL.js.map → chunk-ZBNTFWTG.js.map} +0 -0
@@ -0,0 +1,80 @@
1
+ import type { Theme } from '@mui/material/styles/index.js';
2
+ /**
3
+ * THE EDGE THAT TELLS YOU WHERE A FIELD IS.
4
+ *
5
+ * Every outlined control in this package drew its resting border from
6
+ * `alpha(theme.palette.divider, 0.23)` — or 0.2, or 0.18, or 0.42 for the
7
+ * underline. On the MUI default theme that expression is harmless, and that is
8
+ * exactly why it survived: MUI's own light `divider` is `rgba(0, 0, 0, 0.12)`,
9
+ * and `alpha()` REPLACES the alpha channel rather than multiplying it, so
10
+ * `alpha(divider, 0.23)` resolves to `rgba(0, 0, 0, 0.23)` — byte for byte the
11
+ * border MUI's own `OutlinedInput` ships. The line reads like a restatement of
12
+ * the default because, against the default, it is one.
13
+ *
14
+ * Give it a theme whose `divider` is an OPAQUE hex and the same expression
15
+ * collapses. A themed divider is already a hairline — a pale warm cream, a pale
16
+ * green-grey — chosen to separate two rows INSIDE a card. Fading that to 23%
17
+ * over the card it sits on leaves a border the same colour as the card:
18
+ *
19
+ * | theme | resolved border | ratio |
20
+ * |--------------------------------|-----------------|-------|
21
+ * | MUI default (`rgba(0,0,0,.12)`)| `#C4C4C4` | 1.74:1|
22
+ * | a warm hairline `#EBD9C7` | `#FAF6F2` | 1.08:1|
23
+ * | a cool hairline `#D7DDD5` | `#EDF0EC` | 1.06:1|
24
+ *
25
+ * 1.06:1 is not a faint border, it is no border: the field is invisible until
26
+ * you click into it. Both failing rows are real adopter themes, and neither
27
+ * adopter did anything wrong — they set `palette.divider`, which is what a theme
28
+ * is for.
29
+ *
30
+ * **So the fault is using `divider` for this at all**, not the alpha on top of
31
+ * it. Even at FULL strength those hairlines are 1.26:1 and 1.27:1 against their
32
+ * own paper. A row separator and a control boundary are different jobs with
33
+ * different floors, and only one of them has a number in the spec.
34
+ *
35
+ * ## The floor, and why it is measured rather than picked
36
+ *
37
+ * WCAG 2.1 SC 1.4.11 (Non-text Contrast) puts a control's own boundary at
38
+ * {@link MIN_UI_CONTRAST}. A hex cannot satisfy that on its own, because the
39
+ * ratio is a fact about a PAIR — the same border is fine on white and gone on a
40
+ * dark card. So {@link fieldEdge} takes the theme's hairline as a SEED and walks
41
+ * it away from the surface until it clears, which means:
42
+ *
43
+ * - a theme whose divider already clears keeps its own colour, untouched;
44
+ * - one that does not gets the nearest tone of ITS OWN hairline that does, so
45
+ * the border still looks like the theme's, just visible;
46
+ * - dark mode needs no second table — the walk lightens on a dark surface for
47
+ * the same reason it darkens on a light one.
48
+ *
49
+ * This is the argument `readableInk` makes for text in `@12-apps/app-shell`,
50
+ * applied to the boundary rather than the ink. It is not imported from there:
51
+ * that package depends on THIS one, so the edge would be a cycle.
52
+ *
53
+ * ## What this does NOT touch
54
+ *
55
+ * Hover and focus, which every control already draws in `primary.main` — a
56
+ * corrected brand colour that clears the floor by construction. The resting
57
+ * state was the only one you could not see, and it is the one that matters,
58
+ * because it is the state a field is in before anyone has found it.
59
+ */
60
+ /**
61
+ * WCAG 2.1 SC 1.4.11 — the contrast a control's own boundary owes the surface
62
+ * behind it.
63
+ *
64
+ * 3:1 rather than the 4.5:1 the same spec asks of body text: a border is a
65
+ * shape, not a glyph, so it stays findable at a lower ratio. It is a FLOOR and
66
+ * not a target — {@link fieldEdge} stops at the first tone that clears it, so a
67
+ * theme with a stronger hairline keeps the stronger one.
68
+ */
69
+ export declare const MIN_UI_CONTRAST = 3;
70
+ /**
71
+ * The resting boundary for a form control on `surface`.
72
+ *
73
+ * `surface` defaults to `background.paper` because that is what a field sits on
74
+ * in the overwhelming majority of cases — a dialog, a card, a form panel. A
75
+ * control on a deliberately different ground (a tinted strip, a glass pane over
76
+ * a photo) should pass the ground it is actually on; the answer is only as good
77
+ * as the pair it is given.
78
+ */
79
+ export declare function fieldEdge(theme: Theme, surface?: string): string;
80
+ //# sourceMappingURL=field-edge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-edge.d.ts","sourceRoot":"","sources":["../../../src/tokens/field-edge.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,IAAI,CAAC;AAkCjC;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAkBhE"}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  UserAvatar,
3
3
  UserMenu
4
- } from "./chunk-MUFI3ZXS.js";
4
+ } from "./chunk-DQIQKIEA.js";
5
5
  import "./chunk-UDQSIRAP.js";
6
6
  import "./chunk-QIV73V2X.js";
7
7
  import "./chunk-LYNJJV2X.js";
@@ -12,9 +12,9 @@ import "./chunk-D2IASECY.js";
12
12
  import "./chunk-VMF3UXM4.js";
13
13
  import "./chunk-RI5JZLZL.js";
14
14
  import "./chunk-BA4RHQ3B.js";
15
- import "./chunk-6HLRXICF.js";
16
- import "./chunk-NYUGX76C.js";
15
+ import "./chunk-IAQFQNBL.js";
17
16
  import "./chunk-AUYC5K5K.js";
17
+ import "./chunk-NYUGX76C.js";
18
18
  import "./chunk-VRHBJXZ7.js";
19
19
  import "./chunk-PZ5AY32C.js";
20
20
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/ui",
3
- "version": "6.15.0",
3
+ "version": "6.16.0",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -6,6 +6,8 @@ import React from 'react';
6
6
 
7
7
  import type { AddressAutocompleteProps } from './AddressAutocomplete.types';
8
8
 
9
+ import { fieldEdge } from '../../../tokens/field-edge';
10
+
9
11
  // Kept module-local on purpose: the inferred type of a styled() component cannot
10
12
  // be named across a module boundary here (TS2742), so the plain component below
11
13
  // is what the rest of the folder imports.
@@ -14,7 +16,7 @@ const GlassTextField = styled(TextField)(({ theme }) => ({
14
16
  background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.8)} 0%, ${alpha(theme.palette.background.paper, 0.6)} 100%)`,
15
17
  backdropFilter: 'blur(10px)',
16
18
  WebkitBackdropFilter: 'blur(10px)',
17
- border: `1px solid ${alpha(theme.palette.divider, 0.18)}`,
19
+ border: `1px solid ${fieldEdge(theme)}`,
18
20
  transition: theme.transitions.create(['border-color', 'box-shadow', 'background']),
19
21
  '&:hover': {
20
22
  background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.9)} 0%, ${alpha(theme.palette.background.paper, 0.7)} 100%)`,
@@ -1,5 +1,7 @@
1
1
  import { alpha, type CSSObject, type Theme } from '@mui/material/styles/index.js';
2
2
 
3
+ import { fieldEdge } from '../../../tokens/field-edge';
4
+
3
5
  /**
4
6
  * The prototype's METRICS, verbatim.
5
7
  *
@@ -51,7 +53,7 @@ export const triggerSx = (theme: Theme, selected: boolean, open: boolean): CSSOb
51
53
  height: METRICS.triggerHeight,
52
54
  padding: '0 10px 0 12px',
53
55
  borderRadius: `${METRICS.triggerRadius}px`,
54
- border: `1px solid ${open || selected ? brand.edge : theme.palette.divider}`,
56
+ border: `1px solid ${open || selected ? brand.edge : fieldEdge(theme)}`,
55
57
  background: selected ? brand.soft : theme.palette.background.paper,
56
58
  color: selected ? brand.ink : theme.palette.text.primary,
57
59
  font: 'inherit',
@@ -12,6 +12,8 @@ import { useCodeEditor } from './CodeEditor.hooks';
12
12
  import type { CodeEditorProps } from './CodeEditor.types';
13
13
  import { EditorToolbar } from './CodeEditorToolbar';
14
14
 
15
+ import { fieldEdge } from '../../../tokens/field-edge';
16
+
15
17
  // Styled components
16
18
  const EditorContainer = styled(Paper)(({ theme }) => ({
17
19
  display: 'flex',
@@ -19,7 +21,7 @@ const EditorContainer = styled(Paper)(({ theme }) => ({
19
21
  background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.98)} 0%, ${alpha(theme.palette.background.paper, 0.95)} 100%)`,
20
22
  backdropFilter: 'blur(10px)',
21
23
  WebkitBackdropFilter: 'blur(10px)',
22
- border: `1px solid ${alpha(theme.palette.divider, 0.18)}`,
24
+ border: `1px solid ${fieldEdge(theme)}`,
23
25
  borderRadius: theme.shape.borderRadius * 2,
24
26
  overflow: 'hidden' }));
25
27
 
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import { alpha } from '@mui/material/styles/index.js';
3
+ import type { Theme } from '@mui/material/styles/index.js';
4
4
  import Autocomplete, { createFilterOptions } from '@mui/material/Autocomplete/index.js';
5
5
  import type { AutocompleteRenderInputParams } from '@mui/material/Autocomplete/index.js';
6
6
  import CircularProgress from '@mui/material/CircularProgress/index.js';
@@ -12,6 +12,8 @@ import { FormControl, FormLabel, FormMessage } from '../Form';
12
12
  import type { CreatableSelectOption, CreatableSelectProps } from './CreatableSelect.types';
13
13
  import type { SizeValue } from '../../../tokens/scales';
14
14
 
15
+ import { fieldEdge } from '../../../tokens/field-edge';
16
+
15
17
  /** Internal option shape: a real option, or the synthetic "create new" row. */
16
18
  interface InternalOption extends CreatableSelectOption {
17
19
  /** True for the synthetic row that triggers {@link CreatableSelectProps.onCreate}. */
@@ -35,7 +37,7 @@ const MUI_SIZE = { xs: 'small', sm: 'small', md: 'medium', lg: 'medium', xl: 'me
35
37
  const fieldSx = {
36
38
  '& .MuiOutlinedInput-root': {
37
39
  '& fieldset': {
38
- borderColor: (theme: { palette: { divider: string } }) => alpha(theme.palette.divider, 0.23),
40
+ borderColor: (theme: Theme) => fieldEdge(theme),
39
41
  },
40
42
  '&:hover fieldset': { borderColor: 'primary.main' },
41
43
  '&.Mui-focused fieldset': { borderColor: 'primary.main', borderWidth: 2 },
@@ -3,6 +3,8 @@ import type { CSSObject, Theme } from '@mui/material/styles/index.js';
3
3
 
4
4
  import type { InputProps } from './Input.types';
5
5
 
6
+ import { fieldEdge } from '../../../tokens/field-edge';
7
+
6
8
  type InputVariant = NonNullable<InputProps['variant']>;
7
9
 
8
10
  // Define pulse animation
@@ -90,7 +92,7 @@ export const inputBaseStyles = (theme: Theme, variant?: InputVariant): CSSObject
90
92
  return {
91
93
  backgroundColor: alpha(theme.palette.background.paper, 0.1),
92
94
  backdropFilter: 'blur(20px)',
93
- border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,
95
+ border: `1px solid ${fieldEdge(theme)}`,
94
96
  '&:hover': {
95
97
  backgroundColor: alpha(theme.palette.background.paper, 0.15),
96
98
  borderColor: alpha(theme.palette.primary.main, 0.3),
@@ -104,7 +106,7 @@ export const inputBaseStyles = (theme: Theme, variant?: InputVariant): CSSObject
104
106
  case 'underline':
105
107
  return {
106
108
  '&:before': {
107
- borderBottomColor: alpha(theme.palette.divider, 0.42),
109
+ borderBottomColor: fieldEdge(theme),
108
110
  },
109
111
  '&:hover:not(.Mui-disabled):before': {
110
112
  borderBottomColor: theme.palette.primary.main,
@@ -155,7 +157,7 @@ const gradientStyles = (theme: Theme): CSSObject => ({
155
157
 
156
158
  export const outlinedStyles = (theme: Theme): CSSObject => ({
157
159
  '& fieldset': {
158
- borderColor: alpha(theme.palette.divider, 0.23),
160
+ borderColor: fieldEdge(theme),
159
161
  },
160
162
  '&:hover fieldset': {
161
163
  borderColor: theme.palette.primary.main,
@@ -1,6 +1,8 @@
1
1
  import { alpha } from '@mui/material/styles/index.js';
2
2
  import type { CSSObject, Theme } from '@mui/material/styles/index.js';
3
3
 
4
+ import { fieldEdge } from '../../../tokens/field-edge';
5
+
4
6
  interface ColorPalette {
5
7
  main: string;
6
8
  dark?: string;
@@ -82,7 +84,7 @@ export const otpSlotSx = (theme: Theme, flags: OtpSlotFlags): CSSObject => {
82
84
  ...(glass && {
83
85
  backgroundColor: alpha(theme.palette.background.paper, 0.1),
84
86
  backdropFilter: 'blur(20px)',
85
- '& fieldset': { border: `1px solid ${alpha(theme.palette.divider, 0.2)}` },
87
+ '& fieldset': { border: `1px solid ${fieldEdge(theme)}` },
86
88
  }),
87
89
  ...(gradient && {
88
90
  '&.Mui-focused fieldset': {
@@ -17,6 +17,8 @@ import { usePhoneInput } from './PhoneInput.hooks';
17
17
  import type { CountryData,PhoneInputProps } from './PhoneInput.types';
18
18
  import type { PhoneInputCopy } from '../../../copy';
19
19
 
20
+ import { fieldEdge } from '../../../tokens/field-edge';
21
+
20
22
  // Country data with expanded support
21
23
 
22
24
  // Styled components
@@ -25,7 +27,7 @@ const GlassTextField = styled(TextField)(({ theme }) => ({
25
27
  background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.8)} 0%, ${alpha(theme.palette.background.paper, 0.6)} 100%)`,
26
28
  backdropFilter: 'blur(10px)',
27
29
  WebkitBackdropFilter: 'blur(10px)',
28
- border: `1px solid ${alpha(theme.palette.divider, 0.18)}`,
30
+ border: `1px solid ${fieldEdge(theme)}`,
29
31
  transition: theme.transitions.create(['border-color', 'box-shadow', 'background']),
30
32
  '&:hover': {
31
33
  background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.9)} 0%, ${alpha(theme.palette.background.paper, 0.7)} 100%)`,
@@ -3,6 +3,8 @@ import type { CSSObject, Theme } from '@mui/material/styles/index.js';
3
3
 
4
4
  import { glowAnimation, rippleAnimation, scaleAnimation, slideAnimation } from './RadioGroup.animations';
5
5
 
6
+ import { fieldEdge } from '../../../tokens/field-edge';
7
+
6
8
  interface ColorPalette {
7
9
  main: string;
8
10
  dark?: string;
@@ -119,7 +121,7 @@ const cardBase = (theme: Theme, flags: SurfaceFlags, palette: ColorPalette): CSS
119
121
  return {
120
122
  cursor: 'pointer',
121
123
  transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
122
- border: `2px solid ${selected ? palette.main : alpha(theme.palette.divider, 0.3)}`,
124
+ border: `2px solid ${selected ? palette.main : fieldEdge(theme)}`,
123
125
  backgroundColor: selected ? alpha(palette.main, 0.05) : theme.palette.background.paper,
124
126
  position: 'relative' as const,
125
127
  overflow: 'hidden' as const,
@@ -183,7 +185,7 @@ const buttonBase = (theme: Theme, flags: SurfaceFlags, palette: ColorPalette): C
183
185
  borderRadius: theme.spacing(1),
184
186
  transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
185
187
  fontWeight: 500,
186
- border: `2px solid ${selected ? palette.main : alpha(theme.palette.divider, 0.5)}`,
188
+ border: `2px solid ${selected ? palette.main : fieldEdge(theme)}`,
187
189
  backgroundColor: selected ? palette.main : 'transparent',
188
190
  color: selected ? palette.contrastText || '#fff' : theme.palette.text.primary,
189
191
  position: 'relative' as const,
@@ -8,6 +8,8 @@ import { useRichTextEditor } from './RichTextEditor.hooks';
8
8
  import type { RichTextEditorProps, ToolbarConfig } from './RichTextEditor.types';
9
9
  import { RichTextEditorToolbar } from './RichTextEditorToolbar';
10
10
 
11
+ import { fieldEdge } from '../../../tokens/field-edge';
12
+
11
13
  const DEFAULT_TOOLBAR: Required<Omit<ToolbarConfig, 'customItems'>> & Pick<ToolbarConfig, 'customItems'> = {
12
14
  bold: true,
13
15
  italic: true,
@@ -68,7 +70,7 @@ const editorContentSx = (theme: Theme, disabled: boolean, placeholder?: string,
68
70
  '& a': { color: theme.palette.primary.main, textDecoration: 'underline' } });
69
71
 
70
72
  const shellSx = (theme: Theme, isFocused: boolean, disabled: boolean) => ({
71
- border: `1px solid ${alpha(theme.palette.divider, 0.12)}`,
73
+ border: `1px solid ${fieldEdge(theme)}`,
72
74
  borderRadius: 1,
73
75
  overflow: 'hidden',
74
76
  transition: 'border-color 0.2s ease-in-out',
@@ -8,6 +8,8 @@ import React from 'react';
8
8
 
9
9
  import type { SelectProps } from './Select.types';
10
10
 
11
+ import { fieldEdge } from '../../../tokens/field-edge';
12
+
11
13
  // Define pulse animation
12
14
  const pulseAnimation = keyframes`
13
15
  0% {
@@ -57,7 +59,7 @@ const pulseStyles = (theme: Theme): CSSObject => ({
57
59
  const glassVariant = (theme: Theme): CSSObject => ({
58
60
  backgroundColor: alpha(theme.palette.background.paper, 0.1),
59
61
  backdropFilter: 'blur(20px)',
60
- border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,
62
+ border: `1px solid ${fieldEdge(theme)}`,
61
63
  '& fieldset': { border: 'none' },
62
64
  '&:hover': {
63
65
  backgroundColor: alpha(theme.palette.background.paper, 0.15),
@@ -105,7 +107,7 @@ const gradientVariant = (theme: Theme): CSSObject => ({
105
107
 
106
108
  /** `default` variant: standard outlined borders with hover/focus/error states. */
107
109
  const defaultVariant = (theme: Theme): CSSObject => ({
108
- '& fieldset': { borderColor: alpha(theme.palette.divider, 0.23) },
110
+ '& fieldset': { borderColor: fieldEdge(theme) },
109
111
  '&:hover fieldset': { borderColor: theme.palette.primary.main },
110
112
  '&.Mui-focused fieldset': { borderColor: theme.palette.primary.main, borderWidth: 2 },
111
113
  '&.Mui-error fieldset': { borderColor: theme.palette.error.main },
@@ -1,6 +1,8 @@
1
1
  import { alpha, keyframes } from '@mui/material/styles/index.js';
2
2
  import type { CSSObject, Theme } from '@mui/material/styles/index.js';
3
3
 
4
+ import { fieldEdge } from '../../../tokens/field-edge';
5
+
4
6
  const glowAnimation = keyframes`
5
7
  0% {
6
8
  box-shadow: 0 0 5px currentColor;
@@ -107,7 +109,7 @@ const glassStyles = glass
107
109
  ? {
108
110
  backgroundColor: alpha(theme.palette.background.paper, 0.1),
109
111
  backdropFilter: 'blur(20px)',
110
- border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,
112
+ border: `1px solid ${fieldEdge(theme)}`,
111
113
  '&:hover': {
112
114
  backgroundColor: alpha(theme.palette.background.paper, 0.15),
113
115
  backdropFilter: 'blur(25px)',
@@ -30,6 +30,8 @@ const TextareaRichEditor = lazy(async () => ({
30
30
  default: (await import('./TextareaRichEditor')).TextareaRichEditor }));
31
31
  import type { TextareaProps } from './Textarea.types';
32
32
 
33
+ import { fieldEdge } from '../../../tokens/field-edge';
34
+
33
35
  // Interface for styled component props
34
36
  interface StyledTextareaProps {
35
37
  customVariant?: string;
@@ -71,7 +73,7 @@ const StyledTextarea = styled(TextareaAutosize, {
71
73
  width: '100%',
72
74
  fontFamily: theme.typography.fontFamily,
73
75
  borderRadius: theme.spacing(1),
74
- border: `2px solid ${error ? errorColor.main : theme.palette.divider}`,
76
+ border: `2px solid ${error ? errorColor.main : fieldEdge(theme)}`,
75
77
  backgroundColor: theme.palette.background.paper,
76
78
  color: theme.palette.text.primary,
77
79
  transition: 'all 0.3s ease',
@@ -108,7 +110,7 @@ const StyledLabel = styled(InputLabel, {
108
110
  backdropFilter: 'blur(10px)',
109
111
  padding: '4px 8px',
110
112
  borderRadius: '4px',
111
- border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,
113
+ border: `1px solid ${fieldEdge(theme)}`,
112
114
  display: 'inline-block' }) }));
113
115
 
114
116
  // IconWrapper - replaced with inline Box component for better TypeScript compatibility
@@ -19,6 +19,8 @@ import React, { useEffect, useRef, useState } from 'react';
19
19
  import { floatAnimation, getColorFromTheme } from './Textarea.styles';
20
20
  import type { RichEditorToolbarCopy } from '../../../copy';
21
21
 
22
+ import { fieldEdge } from '../../../tokens/field-edge';
23
+
22
24
  const RichToolbar = styled(Box)<{ glass?: boolean }>(({ theme, glass }) => ({
23
25
  display: 'flex',
24
26
  alignItems: 'center',
@@ -104,7 +106,7 @@ const ContentEditableDiv = styled('div')<{
104
106
  minHeight: '120px',
105
107
  padding: theme.spacing(1.5),
106
108
  borderRadius: `0 0 ${theme.spacing(1)} ${theme.spacing(1)}`,
107
- border: `2px solid ${error ? errorColor.main : focused ? colorPalette.main : theme.palette.divider}`,
109
+ border: `2px solid ${error ? errorColor.main : focused ? colorPalette.main : fieldEdge(theme)}`,
108
110
  borderTop: 'none',
109
111
  backgroundColor: glass
110
112
  ? alpha(theme.palette.background.paper, 0.1)
@@ -1,6 +1,8 @@
1
1
  import { alpha, keyframes } from '@mui/material/styles/index.js';
2
2
  import type { CSSObject, PaletteColor, Theme } from '@mui/material/styles/index.js';
3
3
 
4
+ import { fieldEdge } from '../../../tokens/field-edge';
5
+
4
6
  const glowAnimation = keyframes`
5
7
  0% { box-shadow: 0 0 5px currentColor; }
6
8
  50% { box-shadow: 0 0 15px currentColor, 0 0 25px currentColor; }
@@ -74,7 +76,7 @@ export const baseStyles = (
74
76
  fontWeight: 500,
75
77
  borderRadius: theme.spacing(1),
76
78
  transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
77
- border: `2px solid ${alpha(theme.palette.divider, 0.3)}`,
79
+ border: `2px solid ${fieldEdge(theme)}`,
78
80
  color: theme.palette.text.primary,
79
81
  backgroundColor: 'transparent',
80
82
  position: 'relative',
package/src/copy/form.ts CHANGED
@@ -152,3 +152,16 @@ export interface UploadButtonCopy {
152
152
  /** The component's own error, announced. Takes the message it wraps. */
153
153
  errorAnnouncement(message: string): string;
154
154
  }
155
+
156
+ /**
157
+ * The social sign-in buttons' three labels (FUT-1263).
158
+ *
159
+ * One key per provider rather than a single string, because the buttons are
160
+ * rendered from a dynamic provider list — a host mapping over `['google',
161
+ * 'facebook']` indexes this, instead of growing a switch at the call site.
162
+ */
163
+ export interface SocialLoginCopy {
164
+ google: string;
165
+ facebook: string;
166
+ apple: string;
167
+ }
package/src/en-US.form.ts CHANGED
@@ -9,6 +9,7 @@ import type {
9
9
  PasswordStrengthCopy,
10
10
  PhoneInputCopy,
11
11
  RichEditorToolbarCopy,
12
+ SocialLoginCopy,
12
13
  UploadButtonCopy,
13
14
  } from './copy';
14
15
 
@@ -101,3 +102,9 @@ export const EN_US_UPLOAD_BUTTON_COPY: UploadButtonCopy = {
101
102
  uploadInProgress: (percent) => `Upload in progress: ${percent}%`,
102
103
  errorAnnouncement: (message) => `Error: ${message}`,
103
104
  };
105
+
106
+ export const EN_US_SOCIAL_LOGIN_COPY: SocialLoginCopy = {
107
+ google: "Continue with Google",
108
+ facebook: "Continue with Facebook",
109
+ apple: "Continue with Apple",
110
+ };
package/src/locales.ts CHANGED
@@ -38,12 +38,13 @@ import type {
38
38
  PhoneInputCopy,
39
39
  RichEditorToolbarCopy,
40
40
  SectionOnboardingCopy,
41
+ SocialLoginCopy,
41
42
  TableFilterCopy,
42
43
  TimingDiagramCopy,
43
44
  TutorialCopy,
44
45
  UploadButtonCopy,
45
46
  UserAvatarCopy,
46
- } from './copy';
47
+ } from "./copy";
47
48
  import * as en from './en-US';
48
49
  import * as pt from './pt-BR';
49
50
 
@@ -76,6 +77,10 @@ export const TUTORIAL_COPY = pack<TutorialCopy>(pt.PT_BR_TUTORIAL_COPY, en.EN_US
76
77
  export const CHROME_COPY = pack<ChromeCopy>(pt.PT_BR_CHROME_COPY, en.EN_US_CHROME_COPY);
77
78
 
78
79
  // form
80
+ export const SOCIAL_LOGIN_COPY = pack<SocialLoginCopy>(
81
+ pt.PT_BR_SOCIAL_LOGIN_COPY,
82
+ en.EN_US_SOCIAL_LOGIN_COPY,
83
+ );
79
84
  export const ADDRESS_AUTOCOMPLETE_COPY = pack<AddressAutocompleteCopy>(
80
85
  pt.PT_BR_ADDRESS_AUTOCOMPLETE_COPY,
81
86
  en.EN_US_ADDRESS_AUTOCOMPLETE_COPY,
package/src/pt-BR.form.ts CHANGED
@@ -9,6 +9,7 @@ import type {
9
9
  PasswordStrengthCopy,
10
10
  PhoneInputCopy,
11
11
  RichEditorToolbarCopy,
12
+ SocialLoginCopy,
12
13
  UploadButtonCopy,
13
14
  } from './copy';
14
15
 
@@ -94,3 +95,9 @@ export const PT_BR_UPLOAD_BUTTON_COPY: UploadButtonCopy = {
94
95
  uploadInProgress: (percent) => `Envio em andamento: ${percent}%`,
95
96
  errorAnnouncement: (message) => `Erro: ${message}`,
96
97
  };
98
+
99
+ export const PT_BR_SOCIAL_LOGIN_COPY: SocialLoginCopy = {
100
+ google: "Continuar com o Google",
101
+ facebook: "Continuar com o Facebook",
102
+ apple: "Continuar com a Apple",
103
+ };
@@ -8,6 +8,8 @@ import { Card, CardContent } from '../components/layout/Card';
8
8
  import { Heading } from '../components/typography/Heading';
9
9
  import { Text } from '../components/typography/Text';
10
10
  import { Separator } from '../components/layout/Separator';
11
+ import type { SocialLoginCopy } from '../copy/form';
12
+ import { EN_US_SOCIAL_LOGIN_COPY } from '../en-US.form';
11
13
 
12
14
  export type SocialProvider = 'google' | 'facebook' | 'apple';
13
15
 
@@ -51,7 +53,6 @@ const AppleIcon = (): React.ReactElement => (
51
53
  );
52
54
 
53
55
  interface ProviderConfig {
54
- label: string;
55
56
  Icon: () => React.ReactElement;
56
57
  variant: 'solid' | 'outline' | 'ghost';
57
58
  color: 'primary' | 'secondary' | 'neutral';
@@ -60,7 +61,6 @@ interface ProviderConfig {
60
61
 
61
62
  const providerConfig: Record<SocialProvider, ProviderConfig> = {
62
63
  google: {
63
- label: "Continue with Google",
64
64
  Icon: GoogleIcon,
65
65
  variant: 'outline',
66
66
  color: 'neutral',
@@ -75,7 +75,6 @@ const providerConfig: Record<SocialProvider, ProviderConfig> = {
75
75
  },
76
76
  },
77
77
  facebook: {
78
- label: "Continue with Facebook",
79
78
  Icon: FacebookIcon,
80
79
  variant: 'solid',
81
80
  color: 'primary',
@@ -88,7 +87,6 @@ const providerConfig: Record<SocialProvider, ProviderConfig> = {
88
87
  },
89
88
  },
90
89
  apple: {
91
- label: "Continue with Apple",
92
90
  Icon: AppleIcon,
93
91
  variant: 'solid',
94
92
  color: 'neutral',
@@ -108,13 +106,47 @@ export interface SocialLoginButtonProps {
108
106
  loading?: boolean;
109
107
  disabled?: boolean;
110
108
  fullWidth?: boolean;
109
+ /**
110
+ * The three provider labels (FUT-1263). `SOCIAL_LOGIN_COPY` ships both
111
+ * languages, so a host passes `SOCIAL_LOGIN_COPY["pt-BR"]` rather than
112
+ * authoring a word.
113
+ *
114
+ * These used to be English string literals inside `providerConfig`, reachable
115
+ * by nothing: a pt-BR storefront rendered "Continue with Google" on an
116
+ * otherwise Portuguese sign-in screen and had no way to change it.
117
+ *
118
+ * OPTIONAL, unlike every other `copy` in this package, and defaulted to the
119
+ * en-US pack. That is a deliberate exception so this ships as a MINOR: making
120
+ * it required would break every existing caller on a routine update. The cost
121
+ * is the one this package's convention exists to avoid — a host that says
122
+ * nothing still renders English — so a consumer wanting Portuguese must pass
123
+ * the pack, and FUT-1263 is not closed until it does.
124
+ */
125
+ copy?: SocialLoginCopy;
126
+ /**
127
+ * Per-provider test hook. Without one all three buttons render the same
128
+ * `data-testid`, leaving their visible text as the only selector — which is
129
+ * exactly the text a host is now expected to translate.
130
+ */
131
+ dataTestId?: string;
111
132
  }
112
133
 
113
134
  /**
114
135
  * Social login button using UI package Button component
115
136
  */
116
137
  export const SocialLoginButton = React.forwardRef<HTMLButtonElement, SocialLoginButtonProps>(
117
- ({ provider, onClick, loading = false, disabled = false, fullWidth = true }, ref) => {
138
+ (
139
+ {
140
+ provider,
141
+ onClick,
142
+ loading = false,
143
+ disabled = false,
144
+ fullWidth = true,
145
+ copy = EN_US_SOCIAL_LOGIN_COPY,
146
+ dataTestId,
147
+ },
148
+ ref,
149
+ ) => {
118
150
  const config = providerConfig[provider];
119
151
 
120
152
  return (
@@ -127,6 +159,7 @@ export const SocialLoginButton = React.forwardRef<HTMLButtonElement, SocialLogin
127
159
  disabled={disabled}
128
160
  onClick={onClick}
129
161
  icon={<config.Icon />}
162
+ dataTestId={dataTestId}
130
163
  fullWidth={fullWidth}
131
164
  sx={{
132
165
  minHeight: 48,
@@ -135,7 +168,7 @@ export const SocialLoginButton = React.forwardRef<HTMLButtonElement, SocialLogin
135
168
  ...config.sx,
136
169
  }}
137
170
  >
138
- {config.label}
171
+ {copy[provider]}
139
172
  </Button>
140
173
  );
141
174
  }