@12-apps/ui 6.73.0 → 6.74.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 (404) hide show
  1. package/NATIVE.md +1 -1
  2. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +6 -6
  3. package/dist/_internal/components/data-display/Avatar/Avatar.js +4 -4
  4. package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
  5. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +5 -5
  6. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +5 -5
  7. package/dist/_internal/components/data-display/Carousel/Carousel.js +2 -2
  8. package/dist/_internal/components/data-display/Chart/Chart.js +3 -3
  9. package/dist/_internal/components/data-display/Chart/SpecChart.js +6 -6
  10. package/dist/_internal/components/data-display/Chart/chart-renderers.js +2 -2
  11. package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
  12. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
  13. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +38 -38
  14. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +59 -57
  15. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +3 -3
  16. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +7 -7
  17. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +7 -5
  18. package/dist/_internal/components/data-display/DataViews/base-card.js +3 -3
  19. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +3 -3
  20. package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js +3 -3
  21. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +2 -2
  22. package/dist/_internal/components/data-display/DataViews/base-list-card.js +7 -7
  23. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +9 -9
  24. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +12 -12
  25. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +6 -6
  26. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +33 -33
  27. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +16 -16
  28. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +13 -13
  29. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +14 -14
  30. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +2 -2
  31. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +5 -5
  32. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +14 -12
  33. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +4 -4
  34. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -2
  35. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +4 -4
  36. package/dist/_internal/components/data-display/EmptyState/EmptyState.js +2 -2
  37. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +10 -10
  38. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +6 -6
  39. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +14 -14
  40. package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +3 -3
  41. package/dist/_internal/components/data-display/HoverCard/HoverCard.js +2 -2
  42. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js +2 -2
  43. package/dist/_internal/components/data-display/LazyImage/LazyImage.js +3 -3
  44. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +6 -6
  45. package/dist/_internal/components/data-display/LoadingState/LoadingState.js +3 -3
  46. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +3 -3
  47. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +5 -5
  48. package/dist/_internal/components/data-display/Progress/Progress.js +2 -2
  49. package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.js +3 -3
  50. package/dist/_internal/components/data-display/Sheet/Sheet.hooks.js +2 -2
  51. package/dist/_internal/components/data-display/Sheet/Sheet.js +4 -4
  52. package/dist/_internal/components/data-display/StatCard/StatCard.js +3 -3
  53. package/dist/_internal/components/data-display/Table/Table.js +2 -2
  54. package/dist/_internal/components/data-display/index.js +56 -56
  55. package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.js +2 -2
  56. package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +3 -3
  57. package/dist/_internal/components/feedback/ConfirmAction/with-confirmation.js +2 -2
  58. package/dist/_internal/components/feedback/Dialog/Dialog.js +2 -2
  59. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.js +2 -2
  60. package/dist/_internal/components/feedback/index.js +11 -11
  61. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +4 -4
  62. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +8 -8
  63. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +2 -2
  64. package/dist/_internal/components/form/Autocomplete/Autocomplete.js +1 -1
  65. package/dist/_internal/components/form/Calendar/Calendar.hooks.js +2 -2
  66. package/dist/_internal/components/form/Calendar/Calendar.js +6 -6
  67. package/dist/_internal/components/form/Calendar/CalendarDayCell.js +2 -2
  68. package/dist/_internal/components/form/Calendar/CalendarMonth.js +3 -3
  69. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +3 -3
  70. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +7 -7
  71. package/dist/_internal/components/form/CepField/CepField.js +5 -4
  72. package/dist/_internal/components/form/CodeEditor/CodeEditor.js +2 -2
  73. package/dist/_internal/components/form/Command/Command.js +2 -2
  74. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +9 -9
  75. package/dist/_internal/components/form/Input/Input.factory.js +23 -0
  76. package/dist/_internal/components/form/Input/Input.factory.js.map +1 -0
  77. package/dist/_internal/components/form/Input/Input.js +4 -2
  78. package/dist/_internal/components/form/Input/outlined/text-field-slim-outlined.js +10 -0
  79. package/dist/_internal/components/form/Input/outlined/text-field-slim-outlined.js.map +1 -0
  80. package/dist/_internal/components/form/Input/text-field-slim.factory.js +10 -0
  81. package/dist/_internal/components/form/Input/text-field-slim.factory.js.map +1 -0
  82. package/dist/_internal/components/form/Input/text-field-slim.js +2 -1
  83. package/dist/_internal/components/form/NumberField/NumberField.js +5 -3
  84. package/dist/_internal/components/form/PickerSheet/PickerSheet.js +2 -2
  85. package/dist/_internal/components/form/index.js +44 -40
  86. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +8 -8
  87. package/dist/_internal/components/form/total-form/Fields/CepField.js +6 -5
  88. package/dist/_internal/components/form/total-form/Fields/TextField.js +5 -3
  89. package/dist/_internal/components/form/total-form/Fields/index.js +21 -17
  90. package/dist/_internal/components/index.js +164 -160
  91. package/dist/_internal/components/layout/Card/Card.js +2 -2
  92. package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +3 -3
  93. package/dist/_internal/components/layout/SettingCard/SettingCard.js +4 -4
  94. package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js +3 -3
  95. package/dist/_internal/components/layout/SettingCard/SettingGroup.js +5 -5
  96. package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +4 -4
  97. package/dist/_internal/components/layout/SettingCard/SettingToggle.js +5 -5
  98. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +5 -5
  99. package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js +2 -2
  100. package/dist/_internal/components/layout/Skeleton/Skeleton.js +2 -2
  101. package/dist/_internal/components/layout/index.js +17 -17
  102. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +7 -7
  103. package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +3 -3
  104. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +5 -5
  105. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenuItem.js +2 -2
  106. package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +3 -3
  107. package/dist/_internal/components/navigation/SectionNav/SectionNav.bar.js +6 -4
  108. package/dist/_internal/components/navigation/SectionNav/SectionNav.js +3 -3
  109. package/dist/_internal/components/navigation/SectionNav/SectionNav.primary.js +9 -3
  110. package/dist/_internal/components/navigation/index.js +39 -39
  111. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js +2 -2
  112. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.js +2 -2
  113. package/dist/_internal/components/utility/index.js +8 -8
  114. package/dist/_internal/pt-BR.data-display.js +2 -2
  115. package/dist/_internal/social-login-button/social-login-button.js +3 -3
  116. package/dist/_internal/user-avatar/user-avatar.js +7 -7
  117. package/dist/charts.js +11 -11
  118. package/dist/{chunk-NQP72RTD.js → chunk-27F2VXS4.js} +2 -2
  119. package/dist/{chunk-GMJBWOIU.js → chunk-2ILXXBMG.js} +5 -5
  120. package/dist/{chunk-LVATGJZO.js → chunk-2K2Q7VGV.js} +2 -2
  121. package/dist/{chunk-ISW5K72V.js → chunk-2ZRZTGWP.js} +5 -5
  122. package/dist/{chunk-BM3MKZL2.js → chunk-3BDMYTH6.js} +2 -2
  123. package/dist/{chunk-Q7BGMLCX.js → chunk-3FDSXSEP.js} +3 -3
  124. package/dist/{chunk-5WJFCQFN.js → chunk-3O2OJW4O.js} +4 -4
  125. package/dist/{chunk-L4FWEI2P.js → chunk-3V3Z4EML.js} +5 -5
  126. package/dist/{chunk-CE74DKHT.js → chunk-44PBCQ7E.js} +7 -7
  127. package/dist/{chunk-U5YOOHR6.js → chunk-4QGPRORO.js} +2 -2
  128. package/dist/{chunk-W2RXXF7K.js → chunk-4XBAEKQQ.js} +4 -4
  129. package/dist/{chunk-LYVTJLCF.js → chunk-56JF5PZK.js} +4 -4
  130. package/dist/{chunk-QBY3TWV3.js → chunk-5HFB4WFE.js} +3 -3
  131. package/dist/{chunk-3DPPDGOF.js → chunk-62SXUU5U.js} +5 -5
  132. package/dist/{chunk-QADTI63U.js → chunk-6ATXOJVQ.js} +4 -4
  133. package/dist/chunk-6GYUR63Q.js +14 -0
  134. package/dist/chunk-6GYUR63Q.js.map +1 -0
  135. package/dist/{chunk-F3AYISXT.js → chunk-6PU3JYVY.js} +4 -4
  136. package/dist/{chunk-WVIJFS5Y.js → chunk-725H45MT.js} +7 -7
  137. package/dist/{chunk-XP522FFM.js → chunk-7JKDB5J5.js} +5 -5
  138. package/dist/{chunk-V45JGJ3W.js → chunk-7K23NEZO.js} +8 -8
  139. package/dist/{chunk-EOQ6EKTS.js → chunk-7XSCEHGA.js} +7 -7
  140. package/dist/{chunk-7VUXSNVZ.js → chunk-A4B27HYU.js} +2 -2
  141. package/dist/{chunk-ADSA76T7.js → chunk-AG3DY5TH.js} +2 -2
  142. package/dist/{chunk-G5ORAVSP.js → chunk-AJ5LXKLQ.js} +8 -8
  143. package/dist/{chunk-HI7JPDD6.js → chunk-AMLHEKSV.js} +5 -5
  144. package/dist/{chunk-XZILNBAU.js → chunk-ARVLS57B.js} +6 -6
  145. package/dist/{chunk-ZEH6MGP5.js → chunk-BEHM2VLH.js} +9 -9
  146. package/dist/{chunk-EBMWYRXW.js → chunk-BEYLI32I.js} +2 -2
  147. package/dist/{chunk-YKKHNYEW.js → chunk-BF3SGOWT.js} +3 -3
  148. package/dist/{chunk-MA6SUE7F.js → chunk-BGGVYKVZ.js} +4 -4
  149. package/dist/{chunk-YNIOCELQ.js → chunk-BJONUBQL.js} +3 -3
  150. package/dist/{chunk-E5GYHN4X.js → chunk-CAX3NFFE.js} +3 -3
  151. package/dist/{chunk-LIN4A2BW.js → chunk-CSD6SWBZ.js} +5 -5
  152. package/dist/{chunk-QK63RXLG.js → chunk-CYH5QQUP.js} +8 -8
  153. package/dist/{chunk-CJGSQL77.js → chunk-CZV6NVCA.js} +4 -4
  154. package/dist/{chunk-755VS7NA.js → chunk-DOWVAC4U.js} +3 -3
  155. package/dist/{chunk-PIP7XII2.js → chunk-E54XIRY2.js} +5 -5
  156. package/dist/{chunk-SL6454K7.js → chunk-EEB66IVH.js} +26 -32
  157. package/dist/chunk-EEB66IVH.js.map +1 -0
  158. package/dist/{chunk-NJMAFII4.js → chunk-F5IXDEWJ.js} +2 -2
  159. package/dist/{chunk-U57NFQYE.js → chunk-FIOBPQL2.js} +4 -4
  160. package/dist/{chunk-6VUVSYP4.js → chunk-FR2RJXHS.js} +2 -2
  161. package/dist/{chunk-FWPQUYND.js → chunk-FS55MQ4Q.js} +2 -2
  162. package/dist/{chunk-UXVB423Q.js → chunk-FVL6U72V.js} +6 -6
  163. package/dist/{chunk-2ZHF5VE4.js → chunk-FXECKKPW.js} +32 -29
  164. package/dist/chunk-FXECKKPW.js.map +1 -0
  165. package/dist/{chunk-LWZ2K225.js → chunk-FXZUVZON.js} +6 -6
  166. package/dist/{chunk-RGR6YKK5.js → chunk-GBKIGUNP.js} +2 -2
  167. package/dist/{chunk-YBAK2WN5.js → chunk-HBHBRRSW.js} +7 -7
  168. package/dist/{chunk-HNFZLXZI.js → chunk-HBP2OU4Q.js} +5 -5
  169. package/dist/{chunk-V6OC2PSQ.js → chunk-HCLAVPGG.js} +2 -2
  170. package/dist/{chunk-4MKVGSHX.js → chunk-HN3PZTUK.js} +5 -5
  171. package/dist/{chunk-ZOUWHGV3.js → chunk-HOJL2GKW.js} +7 -7
  172. package/dist/{chunk-JVOEVTCZ.js → chunk-HQCZT6TO.js} +5 -5
  173. package/dist/{chunk-PCM4VEPO.js → chunk-HSIUVFXE.js} +7 -7
  174. package/dist/{chunk-L5R2FB4T.js → chunk-HVGQH54G.js} +2 -2
  175. package/dist/{chunk-7SPFK73H.js → chunk-IHLOP4LG.js} +7 -7
  176. package/dist/{chunk-RQF4NXDC.js → chunk-IWJTLCTF.js} +2 -2
  177. package/dist/{chunk-IICBAAL7.js → chunk-IZ7JTG3Z.js} +4 -4
  178. package/dist/{chunk-2QB4WIU5.js → chunk-J5QNJERV.js} +10 -10
  179. package/dist/{chunk-6OLERKNC.js → chunk-JA3WJPXH.js} +2 -2
  180. package/dist/{chunk-5ZOJLYD2.js → chunk-JE6RZ5L6.js} +4 -4
  181. package/dist/{chunk-GICG3XJK.js → chunk-JGLPSBZE.js} +4 -4
  182. package/dist/{chunk-J2RUDZVJ.js → chunk-KARMRTTM.js} +7 -7
  183. package/dist/{chunk-RIAZPGHT.js → chunk-KKVM723A.js} +4 -4
  184. package/dist/{chunk-3DFWHF6O.js → chunk-KLEKSTZI.js} +6 -6
  185. package/dist/{chunk-6QOJEZDH.js → chunk-KZ5I5WCH.js} +4 -4
  186. package/dist/{chunk-CDYQKIBL.js → chunk-LABIUXDM.js} +2 -2
  187. package/dist/chunk-LZRVUOMU.js +12 -0
  188. package/dist/chunk-LZRVUOMU.js.map +1 -0
  189. package/dist/{chunk-ZAPP32GD.js → chunk-M7HYNXCU.js} +2 -2
  190. package/dist/{chunk-QVEQOUQY.js → chunk-MA6ENJDP.js} +3 -3
  191. package/dist/{chunk-D34PZJH3.js → chunk-MBMZNSBP.js} +2 -2
  192. package/dist/{chunk-EQK3K65G.js → chunk-MK7KZY2Y.js} +2 -2
  193. package/dist/chunk-MK7KZY2Y.js.map +1 -0
  194. package/dist/{chunk-Z2J4MRTF.js → chunk-MKNW4FRR.js} +4 -4
  195. package/dist/{chunk-RCZ4KL2H.js → chunk-NIENIKZ5.js} +2 -2
  196. package/dist/{chunk-6QRN4JK7.js → chunk-NKBCUR4V.js} +2 -2
  197. package/dist/{chunk-2B3NX5HJ.js → chunk-NPSARV2I.js} +6 -6
  198. package/dist/{chunk-YPAH2NWN.js → chunk-NQ6P7O7C.js} +2 -2
  199. package/dist/{chunk-EWVJJ32N.js → chunk-OKYYHBGS.js} +6 -6
  200. package/dist/{chunk-WQ32YFM5.js → chunk-P7VAMJFJ.js} +5 -5
  201. package/dist/{chunk-KYPHR4TT.js → chunk-QWSYHENP.js} +2 -2
  202. package/dist/chunk-RHVJ3L4U.js +14 -0
  203. package/dist/chunk-RHVJ3L4U.js.map +1 -0
  204. package/dist/{chunk-SE5WHKCB.js → chunk-RPKUZDRY.js} +6 -6
  205. package/dist/{chunk-V6SRBQMN.js → chunk-S4JXSC4D.js} +5 -5
  206. package/dist/{chunk-TIM4PXWN.js → chunk-SB2SEGR6.js} +3 -3
  207. package/dist/{chunk-7PTE6HBW.js → chunk-SUXT6QAY.js} +2 -2
  208. package/dist/{chunk-DAT4XWYX.js → chunk-TRYYYWV3.js} +14 -14
  209. package/dist/{chunk-65NYUQXD.js → chunk-TSID4257.js} +9 -9
  210. package/dist/{chunk-KPEKD5SG.js → chunk-UKUGSU3Y.js} +11 -3
  211. package/dist/{chunk-KPEKD5SG.js.map → chunk-UKUGSU3Y.js.map} +1 -1
  212. package/dist/{chunk-23LPXHR2.js → chunk-URSYEHPU.js} +11 -5
  213. package/dist/chunk-URSYEHPU.js.map +1 -0
  214. package/dist/{chunk-DWFUT45A.js → chunk-VEBNL5MG.js} +3 -3
  215. package/dist/{chunk-LVXGCXKB.js → chunk-VMTOLAZ5.js} +7 -7
  216. package/dist/{chunk-BRBQNPM2.js → chunk-VQSBZPKO.js} +3 -3
  217. package/dist/{chunk-ZEVFMQAQ.js → chunk-VWVA74JY.js} +2 -2
  218. package/dist/{chunk-RX2XP7V5.js → chunk-WHUJAGPV.js} +4 -4
  219. package/dist/{chunk-YULI2EBC.js → chunk-XICRCPEQ.js} +4 -4
  220. package/dist/{chunk-Q4WTVAJ5.js → chunk-XLCVMRSO.js} +2 -2
  221. package/dist/{chunk-ZIHSCBMN.js → chunk-Z5V5E3JW.js} +10 -10
  222. package/dist/{chunk-7KAZ3B5B.js → chunk-Z5W4QPEC.js} +4 -4
  223. package/dist/{chunk-G3JFESKD.js → chunk-Z5WUSI47.js} +6 -6
  224. package/dist/chunk-ZLMKGVB2.js +21 -0
  225. package/dist/chunk-ZLMKGVB2.js.map +1 -0
  226. package/dist/{chunk-JPYNGWV4.js → chunk-ZOLUUX4B.js} +2 -2
  227. package/dist/{chunk-4W6AQFMO.js → chunk-ZVWQ5TF4.js} +3 -3
  228. package/dist/data-display/AsyncStateContainer.js +6 -6
  229. package/dist/data-display/Avatar.js +4 -4
  230. package/dist/data-display/CardKit.js +13 -13
  231. package/dist/data-display/Carousel.js +2 -2
  232. package/dist/data-display/Chart.js +11 -11
  233. package/dist/data-display/DataGrid.js +2 -2
  234. package/dist/data-display/DataViews.js +72 -70
  235. package/dist/data-display/EmptyState.js +2 -2
  236. package/dist/data-display/FleetMap.js +14 -14
  237. package/dist/data-display/HoverCard.js +2 -2
  238. package/dist/data-display/InteractiveTooltip.js +2 -2
  239. package/dist/data-display/LazyImage.js +3 -3
  240. package/dist/data-display/Lightbox.js +6 -6
  241. package/dist/data-display/LoadingState.js +3 -3
  242. package/dist/data-display/MapPreview.js +5 -5
  243. package/dist/data-display/Progress.js +2 -2
  244. package/dist/data-display/SectionOnboarding.js +3 -3
  245. package/dist/data-display/Sheet.js +4 -4
  246. package/dist/data-display/StatCard.js +3 -3
  247. package/dist/data-display/Table.js +2 -2
  248. package/dist/feedback/ConfirmAction.js +7 -7
  249. package/dist/feedback/Dialog.js +2 -2
  250. package/dist/feedback/TutorialOverlay.js +2 -2
  251. package/dist/form/AddressAutocomplete.js +8 -8
  252. package/dist/form/Autocomplete.js +1 -1
  253. package/dist/form/Calendar.js +6 -6
  254. package/dist/form/CategorySelect.js +7 -7
  255. package/dist/form/CepField.js +5 -4
  256. package/dist/form/CodeEditor.js +2 -2
  257. package/dist/form/Command.js +2 -2
  258. package/dist/form/DateRangePicker.js +9 -9
  259. package/dist/form/Input/outlined.js +27 -0
  260. package/dist/form/Input/outlined.js.map +1 -0
  261. package/dist/form/Input.js +4 -2
  262. package/dist/form/NumberField.js +5 -3
  263. package/dist/form/PickerSheet.js +2 -2
  264. package/dist/form/total-form.js +21 -17
  265. package/dist/layout/Card.js +2 -2
  266. package/dist/layout/ContentToolbar.js +3 -3
  267. package/dist/layout/ScrollArea.js +3 -3
  268. package/dist/layout/SettingCard.js +7 -7
  269. package/dist/layout/SettingsLayout.js +5 -5
  270. package/dist/layout/Skeleton.js +2 -2
  271. package/dist/locales.js +6 -6
  272. package/dist/navigation/AppHeader.js +9 -9
  273. package/dist/navigation/NavigationMenu.js +5 -5
  274. package/dist/navigation/SectionNav.js +3 -3
  275. package/dist/pt-BR.js +6 -6
  276. package/dist/social-login-button.js +3 -3
  277. package/dist/types/components/form/CepField/CepField.d.ts.map +1 -1
  278. package/dist/types/components/form/Input/Input.d.ts +9 -3
  279. package/dist/types/components/form/Input/Input.d.ts.map +1 -1
  280. package/dist/types/components/form/Input/Input.factory.d.ts +13 -0
  281. package/dist/types/components/form/Input/Input.factory.d.ts.map +1 -0
  282. package/dist/types/components/form/Input/outlined/index.d.ts +24 -0
  283. package/dist/types/components/form/Input/outlined/index.d.ts.map +1 -0
  284. package/dist/types/components/form/Input/outlined/text-field-slim-outlined.d.ts +10 -0
  285. package/dist/types/components/form/Input/outlined/text-field-slim-outlined.d.ts.map +1 -0
  286. package/dist/types/components/form/Input/text-field-slim.d.ts +8 -40
  287. package/dist/types/components/form/Input/text-field-slim.d.ts.map +1 -1
  288. package/dist/types/components/form/Input/text-field-slim.factory.d.ts +61 -0
  289. package/dist/types/components/form/Input/text-field-slim.factory.d.ts.map +1 -0
  290. package/dist/types/components/navigation/SectionNav/SectionNav.bar.d.ts +2 -0
  291. package/dist/types/components/navigation/SectionNav/SectionNav.bar.d.ts.map +1 -1
  292. package/dist/types/components/navigation/SectionNav/SectionNav.primary.d.ts +9 -0
  293. package/dist/types/components/navigation/SectionNav/SectionNav.primary.d.ts.map +1 -1
  294. package/dist/user-avatar.js +7 -7
  295. package/dist/utility/InfiniteScroll.js +2 -2
  296. package/dist/utility/InstallPrompt.js +2 -2
  297. package/package.json +5 -1
  298. package/src/components/form/CepField/CepField.tsx +3 -1
  299. package/src/components/form/Input/Input.factory.tsx +221 -0
  300. package/src/components/form/Input/Input.md +20 -0
  301. package/src/components/form/Input/Input.tsx +9 -196
  302. package/src/components/form/Input/outlined/index.ts +27 -0
  303. package/src/components/form/Input/outlined/text-field-slim-outlined.tsx +13 -0
  304. package/src/components/form/Input/text-field-slim.factory.tsx +248 -0
  305. package/src/components/form/Input/text-field-slim.tsx +9 -209
  306. package/src/components/navigation/SectionNav/SectionNav.bar.tsx +9 -3
  307. package/src/components/navigation/SectionNav/SectionNav.md +1 -1
  308. package/src/components/navigation/SectionNav/SectionNav.primary.tsx +14 -1
  309. package/dist/chunk-23LPXHR2.js.map +0 -1
  310. package/dist/chunk-2ZHF5VE4.js.map +0 -1
  311. package/dist/chunk-EQK3K65G.js.map +0 -1
  312. package/dist/chunk-SL6454K7.js.map +0 -1
  313. /package/dist/{chunk-NQP72RTD.js.map → chunk-27F2VXS4.js.map} +0 -0
  314. /package/dist/{chunk-GMJBWOIU.js.map → chunk-2ILXXBMG.js.map} +0 -0
  315. /package/dist/{chunk-LVATGJZO.js.map → chunk-2K2Q7VGV.js.map} +0 -0
  316. /package/dist/{chunk-ISW5K72V.js.map → chunk-2ZRZTGWP.js.map} +0 -0
  317. /package/dist/{chunk-BM3MKZL2.js.map → chunk-3BDMYTH6.js.map} +0 -0
  318. /package/dist/{chunk-Q7BGMLCX.js.map → chunk-3FDSXSEP.js.map} +0 -0
  319. /package/dist/{chunk-5WJFCQFN.js.map → chunk-3O2OJW4O.js.map} +0 -0
  320. /package/dist/{chunk-L4FWEI2P.js.map → chunk-3V3Z4EML.js.map} +0 -0
  321. /package/dist/{chunk-CE74DKHT.js.map → chunk-44PBCQ7E.js.map} +0 -0
  322. /package/dist/{chunk-U5YOOHR6.js.map → chunk-4QGPRORO.js.map} +0 -0
  323. /package/dist/{chunk-W2RXXF7K.js.map → chunk-4XBAEKQQ.js.map} +0 -0
  324. /package/dist/{chunk-LYVTJLCF.js.map → chunk-56JF5PZK.js.map} +0 -0
  325. /package/dist/{chunk-QBY3TWV3.js.map → chunk-5HFB4WFE.js.map} +0 -0
  326. /package/dist/{chunk-3DPPDGOF.js.map → chunk-62SXUU5U.js.map} +0 -0
  327. /package/dist/{chunk-QADTI63U.js.map → chunk-6ATXOJVQ.js.map} +0 -0
  328. /package/dist/{chunk-F3AYISXT.js.map → chunk-6PU3JYVY.js.map} +0 -0
  329. /package/dist/{chunk-WVIJFS5Y.js.map → chunk-725H45MT.js.map} +0 -0
  330. /package/dist/{chunk-XP522FFM.js.map → chunk-7JKDB5J5.js.map} +0 -0
  331. /package/dist/{chunk-V45JGJ3W.js.map → chunk-7K23NEZO.js.map} +0 -0
  332. /package/dist/{chunk-EOQ6EKTS.js.map → chunk-7XSCEHGA.js.map} +0 -0
  333. /package/dist/{chunk-7VUXSNVZ.js.map → chunk-A4B27HYU.js.map} +0 -0
  334. /package/dist/{chunk-ADSA76T7.js.map → chunk-AG3DY5TH.js.map} +0 -0
  335. /package/dist/{chunk-G5ORAVSP.js.map → chunk-AJ5LXKLQ.js.map} +0 -0
  336. /package/dist/{chunk-HI7JPDD6.js.map → chunk-AMLHEKSV.js.map} +0 -0
  337. /package/dist/{chunk-XZILNBAU.js.map → chunk-ARVLS57B.js.map} +0 -0
  338. /package/dist/{chunk-ZEH6MGP5.js.map → chunk-BEHM2VLH.js.map} +0 -0
  339. /package/dist/{chunk-EBMWYRXW.js.map → chunk-BEYLI32I.js.map} +0 -0
  340. /package/dist/{chunk-YKKHNYEW.js.map → chunk-BF3SGOWT.js.map} +0 -0
  341. /package/dist/{chunk-MA6SUE7F.js.map → chunk-BGGVYKVZ.js.map} +0 -0
  342. /package/dist/{chunk-YNIOCELQ.js.map → chunk-BJONUBQL.js.map} +0 -0
  343. /package/dist/{chunk-E5GYHN4X.js.map → chunk-CAX3NFFE.js.map} +0 -0
  344. /package/dist/{chunk-LIN4A2BW.js.map → chunk-CSD6SWBZ.js.map} +0 -0
  345. /package/dist/{chunk-QK63RXLG.js.map → chunk-CYH5QQUP.js.map} +0 -0
  346. /package/dist/{chunk-CJGSQL77.js.map → chunk-CZV6NVCA.js.map} +0 -0
  347. /package/dist/{chunk-755VS7NA.js.map → chunk-DOWVAC4U.js.map} +0 -0
  348. /package/dist/{chunk-PIP7XII2.js.map → chunk-E54XIRY2.js.map} +0 -0
  349. /package/dist/{chunk-NJMAFII4.js.map → chunk-F5IXDEWJ.js.map} +0 -0
  350. /package/dist/{chunk-U57NFQYE.js.map → chunk-FIOBPQL2.js.map} +0 -0
  351. /package/dist/{chunk-6VUVSYP4.js.map → chunk-FR2RJXHS.js.map} +0 -0
  352. /package/dist/{chunk-FWPQUYND.js.map → chunk-FS55MQ4Q.js.map} +0 -0
  353. /package/dist/{chunk-UXVB423Q.js.map → chunk-FVL6U72V.js.map} +0 -0
  354. /package/dist/{chunk-LWZ2K225.js.map → chunk-FXZUVZON.js.map} +0 -0
  355. /package/dist/{chunk-RGR6YKK5.js.map → chunk-GBKIGUNP.js.map} +0 -0
  356. /package/dist/{chunk-YBAK2WN5.js.map → chunk-HBHBRRSW.js.map} +0 -0
  357. /package/dist/{chunk-HNFZLXZI.js.map → chunk-HBP2OU4Q.js.map} +0 -0
  358. /package/dist/{chunk-V6OC2PSQ.js.map → chunk-HCLAVPGG.js.map} +0 -0
  359. /package/dist/{chunk-4MKVGSHX.js.map → chunk-HN3PZTUK.js.map} +0 -0
  360. /package/dist/{chunk-ZOUWHGV3.js.map → chunk-HOJL2GKW.js.map} +0 -0
  361. /package/dist/{chunk-JVOEVTCZ.js.map → chunk-HQCZT6TO.js.map} +0 -0
  362. /package/dist/{chunk-PCM4VEPO.js.map → chunk-HSIUVFXE.js.map} +0 -0
  363. /package/dist/{chunk-L5R2FB4T.js.map → chunk-HVGQH54G.js.map} +0 -0
  364. /package/dist/{chunk-7SPFK73H.js.map → chunk-IHLOP4LG.js.map} +0 -0
  365. /package/dist/{chunk-RQF4NXDC.js.map → chunk-IWJTLCTF.js.map} +0 -0
  366. /package/dist/{chunk-IICBAAL7.js.map → chunk-IZ7JTG3Z.js.map} +0 -0
  367. /package/dist/{chunk-2QB4WIU5.js.map → chunk-J5QNJERV.js.map} +0 -0
  368. /package/dist/{chunk-6OLERKNC.js.map → chunk-JA3WJPXH.js.map} +0 -0
  369. /package/dist/{chunk-5ZOJLYD2.js.map → chunk-JE6RZ5L6.js.map} +0 -0
  370. /package/dist/{chunk-GICG3XJK.js.map → chunk-JGLPSBZE.js.map} +0 -0
  371. /package/dist/{chunk-J2RUDZVJ.js.map → chunk-KARMRTTM.js.map} +0 -0
  372. /package/dist/{chunk-RIAZPGHT.js.map → chunk-KKVM723A.js.map} +0 -0
  373. /package/dist/{chunk-3DFWHF6O.js.map → chunk-KLEKSTZI.js.map} +0 -0
  374. /package/dist/{chunk-6QOJEZDH.js.map → chunk-KZ5I5WCH.js.map} +0 -0
  375. /package/dist/{chunk-CDYQKIBL.js.map → chunk-LABIUXDM.js.map} +0 -0
  376. /package/dist/{chunk-ZAPP32GD.js.map → chunk-M7HYNXCU.js.map} +0 -0
  377. /package/dist/{chunk-QVEQOUQY.js.map → chunk-MA6ENJDP.js.map} +0 -0
  378. /package/dist/{chunk-D34PZJH3.js.map → chunk-MBMZNSBP.js.map} +0 -0
  379. /package/dist/{chunk-Z2J4MRTF.js.map → chunk-MKNW4FRR.js.map} +0 -0
  380. /package/dist/{chunk-RCZ4KL2H.js.map → chunk-NIENIKZ5.js.map} +0 -0
  381. /package/dist/{chunk-6QRN4JK7.js.map → chunk-NKBCUR4V.js.map} +0 -0
  382. /package/dist/{chunk-2B3NX5HJ.js.map → chunk-NPSARV2I.js.map} +0 -0
  383. /package/dist/{chunk-YPAH2NWN.js.map → chunk-NQ6P7O7C.js.map} +0 -0
  384. /package/dist/{chunk-EWVJJ32N.js.map → chunk-OKYYHBGS.js.map} +0 -0
  385. /package/dist/{chunk-WQ32YFM5.js.map → chunk-P7VAMJFJ.js.map} +0 -0
  386. /package/dist/{chunk-KYPHR4TT.js.map → chunk-QWSYHENP.js.map} +0 -0
  387. /package/dist/{chunk-SE5WHKCB.js.map → chunk-RPKUZDRY.js.map} +0 -0
  388. /package/dist/{chunk-V6SRBQMN.js.map → chunk-S4JXSC4D.js.map} +0 -0
  389. /package/dist/{chunk-TIM4PXWN.js.map → chunk-SB2SEGR6.js.map} +0 -0
  390. /package/dist/{chunk-7PTE6HBW.js.map → chunk-SUXT6QAY.js.map} +0 -0
  391. /package/dist/{chunk-DAT4XWYX.js.map → chunk-TRYYYWV3.js.map} +0 -0
  392. /package/dist/{chunk-65NYUQXD.js.map → chunk-TSID4257.js.map} +0 -0
  393. /package/dist/{chunk-DWFUT45A.js.map → chunk-VEBNL5MG.js.map} +0 -0
  394. /package/dist/{chunk-LVXGCXKB.js.map → chunk-VMTOLAZ5.js.map} +0 -0
  395. /package/dist/{chunk-BRBQNPM2.js.map → chunk-VQSBZPKO.js.map} +0 -0
  396. /package/dist/{chunk-ZEVFMQAQ.js.map → chunk-VWVA74JY.js.map} +0 -0
  397. /package/dist/{chunk-RX2XP7V5.js.map → chunk-WHUJAGPV.js.map} +0 -0
  398. /package/dist/{chunk-YULI2EBC.js.map → chunk-XICRCPEQ.js.map} +0 -0
  399. /package/dist/{chunk-Q4WTVAJ5.js.map → chunk-XLCVMRSO.js.map} +0 -0
  400. /package/dist/{chunk-ZIHSCBMN.js.map → chunk-Z5V5E3JW.js.map} +0 -0
  401. /package/dist/{chunk-7KAZ3B5B.js.map → chunk-Z5W4QPEC.js.map} +0 -0
  402. /package/dist/{chunk-G3JFESKD.js.map → chunk-Z5WUSI47.js.map} +0 -0
  403. /package/dist/{chunk-JPYNGWV4.js.map → chunk-ZOLUUX4B.js.map} +0 -0
  404. /package/dist/{chunk-4W6AQFMO.js.map → chunk-ZVWQ5TF4.js.map} +0 -0
@@ -0,0 +1,221 @@
1
+ import CircularProgress from '@mui/material/CircularProgress/index.js';
2
+ import InputAdornment from '@mui/material/InputAdornment/index.js';
3
+ import { styled, useTheme } from '@mui/material/styles/index.js';
4
+ import React from 'react';
5
+
6
+ import { INPUT_LOADING } from './Input.metrics';
7
+ import type { TextFieldSlimComponent } from './text-field-slim.factory';
8
+
9
+ import {
10
+ filledStyles,
11
+ floatingLabelStyles,
12
+ glowStyles,
13
+ inputBaseStyles,
14
+ inputRadiusStyles,
15
+ muiVariantFor,
16
+ outlinedStyles,
17
+ pulseStyles,
18
+ SIZE_MAP,
19
+ } from './Input.styles';
20
+ import type { InputProps } from './Input.types';
21
+ import { splitTestId } from '../../../platform/test-id';
22
+ import { fieldControlStyles } from '../../../tokens/field-height';
23
+ import { rem } from '../../../tokens/relative';
24
+ import type { SizeValue } from '../../../tokens/vocabulary';
25
+
26
+ /**
27
+ * The field `Input` renders, styled, over whichever text field it is given.
28
+ *
29
+ * Always a `TextFieldSlim`, never MUI's `TextField` — see `text-field-slim.tsx`.
30
+ * MUI's own `TextField` imports `Select` unconditionally, and through it `Menu`,
31
+ * `Popover`, `Modal` and seven more component modules, so every screen with one
32
+ * text box shipped a dropdown it can never render. Same composition, same DOM,
33
+ * same prop routing; the select branch is the only thing missing.
34
+ */
35
+ function styledField(TextField: TextFieldSlimComponent) {
36
+ return styled(TextField, {
37
+ shouldForwardProp: (prop) =>
38
+ !['customVariant', 'fieldSize', 'floating', 'glow', 'pulse', 'loading'].includes(prop as string),
39
+ })<{
40
+ customVariant?: InputProps['variant'];
41
+ fieldSize: SizeValue;
42
+ floating?: boolean;
43
+ glow?: boolean;
44
+ pulse?: boolean;
45
+ loading?: boolean;
46
+ }>(({ theme, customVariant, fieldSize, floating, glow, pulse, loading }) => ({
47
+ position: 'relative',
48
+ // The theme's field height for this size (outlined family, one line).
49
+ ...fieldControlStyles(theme, fieldSize),
50
+ opacity: loading ? INPUT_LOADING.opacity : 1,
51
+
52
+ ...(glow ? glowStyles(theme) : {}),
53
+ ...(pulse ? pulseStyles(theme, fieldSize) : {}),
54
+ ...(floating ? floatingLabelStyles(theme) : {}),
55
+
56
+ '& .MuiInputBase-root': {
57
+ transition: 'all 0.3s ease',
58
+ ...inputRadiusStyles(theme, customVariant),
59
+ ...inputBaseStyles(theme, customVariant),
60
+ },
61
+
62
+ '& .MuiOutlinedInput-root': outlinedStyles(theme),
63
+ '& .MuiFilledInput-root': filledStyles(theme),
64
+ }));
65
+ }
66
+
67
+ /** Only one adornment shows at a time: the spinner replaces the caller's while loading. */
68
+ const EndAdornment: React.FC<{ loading: boolean; endAdornment?: React.ReactNode }> = ({
69
+ loading,
70
+ endAdornment,
71
+ }) => {
72
+ const theme = useTheme();
73
+ if (loading) {
74
+ return (
75
+ <InputAdornment position="end">
76
+ <CircularProgress size={rem(theme, INPUT_LOADING.spinnerSize)} />
77
+ </InputAdornment>
78
+ );
79
+ }
80
+
81
+ if (!endAdornment) return null;
82
+
83
+ return <InputAdornment position="end">{endAdornment}</InputAdornment>;
84
+ };
85
+
86
+ /** While loading the field is inert: no clicks, and disabled to assistive tech. */
87
+ const interactionProps = (
88
+ loading: boolean,
89
+ onClick: InputProps['onClick'],
90
+ disabled?: boolean,
91
+ ) => ({
92
+ disabled: loading || disabled,
93
+ onClick: loading ? undefined : onClick,
94
+ });
95
+
96
+ /**
97
+ * The ARIA that describes the field has to sit on the `<input>`: the text
98
+ * field puts every attribute it does not recognise on its root `FormControl`,
99
+ * a `<div>` with no role, where a screen reader never reads it.
100
+ *
101
+ * `aria-label` has ridden `inputProps` since FUT-755. `aria-describedby` and
102
+ * `aria-busy` fell through to the div until FUT-2619, so CepField's input
103
+ * pointed at nothing while its lookup status lived in a live region beside it.
104
+ *
105
+ * `inputProps` are spread onto the `<input>` AFTER the `aria-describedby` MUI
106
+ * writes for helper text, so a caller's ids REPLACE the helper text's: MUI's
107
+ * `TextField` on its own keeps only one of the two. This joins both, helper
108
+ * text first. The helper id is MUI's `<id>-helper-text` (the parity test pins
109
+ * that spelling), which is why the field's id is fixed here rather than left
110
+ * to the text field.
111
+ */
112
+ function inputAriaOf(a: {
113
+ id: string;
114
+ helperText: React.ReactNode;
115
+ label?: string;
116
+ describedBy?: string;
117
+ busy?: InputProps['aria-busy'];
118
+ }): Record<string, unknown> {
119
+ const describedBy = [a.helperText ? `${a.id}-helper-text` : undefined, a.describedBy]
120
+ .filter(Boolean)
121
+ .join(' ');
122
+ return {
123
+ ...(a.label === undefined ? {} : { 'aria-label': a.label }),
124
+ ...(a.describedBy === undefined ? {} : { 'aria-describedby': describedBy }),
125
+ ...(a.busy === undefined ? {} : { 'aria-busy': a.busy }),
126
+ };
127
+ }
128
+
129
+ /** The render function `createInput` hands `forwardRef`, over a given styled field. */
130
+ function inputRenderer(
131
+ StyledTextField: ReturnType<typeof styledField>,
132
+ ): React.ForwardRefRenderFunction<HTMLInputElement, InputProps> {
133
+ return (
134
+ {
135
+ variant = 'outlined',
136
+ size = 'md',
137
+ label,
138
+ error,
139
+ helperText,
140
+ startAdornment,
141
+ endAdornment,
142
+ fullWidth = true,
143
+ floating = false,
144
+ glow = false,
145
+ pulse = false,
146
+ loading = false,
147
+ onClick,
148
+ onFocus,
149
+ onBlur,
150
+ 'aria-label': ariaLabel,
151
+ 'aria-describedby': ariaDescribedBy,
152
+ 'aria-busy': ariaBusy,
153
+ inputProps,
154
+ ...rest
155
+ },
156
+ ref,
157
+ ) => {
158
+ const { testId: dataTestId, rest: props } = splitTestId(rest);
159
+ const generatedId = React.useId();
160
+ const id = props.id ?? generatedId;
161
+ return (
162
+ <StyledTextField
163
+ ref={ref}
164
+ variant={muiVariantFor(variant)}
165
+ customVariant={variant}
166
+ fieldSize={size}
167
+ floating={floating}
168
+ glow={glow}
169
+ pulse={pulse}
170
+ loading={loading}
171
+ label={label}
172
+ error={error}
173
+ helperText={helperText}
174
+ fullWidth={fullWidth}
175
+ {...interactionProps(loading, onClick, props.disabled)}
176
+ onFocus={onFocus}
177
+ onBlur={onBlur}
178
+ /*
179
+ * `aria-label` has to ride `inputProps` to reach the `<input>` (FUT-755).
180
+ * Spread with the rest it lands on the FormControl DIV that the text
181
+ * field renders as its root, which carries no role — so the field kept
182
+ * no accessible name, and a source grep saying "this input is labelled"
183
+ * disagreed with the DOM. The reports search box and the block-title
184
+ * inputs were both named in source and anonymous to a screen reader.
185
+ * `aria-describedby` and `aria-busy` are the same case: `inputAriaOf`.
186
+ */
187
+ inputProps={{
188
+ 'data-testid': dataTestId,
189
+ ...inputProps,
190
+ ...inputAriaOf({ id, helperText, label: ariaLabel, describedBy: ariaDescribedBy, busy: ariaBusy }),
191
+ }}
192
+ InputProps={{
193
+ startAdornment: startAdornment && (
194
+ <InputAdornment position="start">{startAdornment}</InputAdornment>
195
+ ),
196
+ endAdornment: <EndAdornment loading={loading} endAdornment={endAdornment} />,
197
+ }}
198
+ {...SIZE_MAP[size]}
199
+ {...props}
200
+ id={id}
201
+ />
202
+ );
203
+ };
204
+ }
205
+
206
+ /** The `Input` component every entry exports. */
207
+ export type InputComponent<P extends InputProps = InputProps> = React.ForwardRefExoticComponent<
208
+ P & React.RefAttributes<HTMLInputElement>
209
+ >;
210
+
211
+ /**
212
+ * `Input` over a given text field (FUT-1054). The generic entry passes the
213
+ * field that renders any MUI variant; `./outlined` passes one that only ever
214
+ * imports `OutlinedInput`. Everything else — styles, adornments, the ARIA
215
+ * routing — is this one body, so the two cannot drift.
216
+ */
217
+ export function createInput(TextField: TextFieldSlimComponent): InputComponent {
218
+ const Input = React.forwardRef<HTMLInputElement, InputProps>(inputRenderer(styledField(TextField)));
219
+ Input.displayName = 'Input';
220
+ return Input;
221
+ }
@@ -115,6 +115,26 @@ The Input component provides a flexible text input field with comprehensive vali
115
115
  />
116
116
  ```
117
117
 
118
+ ## The outlined entry: `@12-apps/ui/form/Input/outlined`
119
+
120
+ The same `Input`, with the same props, styles and DOM, built on a field that imports MUI's `OutlinedInput` and no other MUI input (FUT-1054).
121
+
122
+ The generic `@12-apps/ui/form/Input` chooses MUI's input at runtime from `variant`. A bundler therefore ships `OutlinedInput`, `FilledInput` and `Input` (about 7 KB raw for the last two) to every screen that renders one. The outlined entry ships only the first.
123
+
124
+ ```tsx
125
+ import { Input } from '@12-apps/ui/form/Input/outlined';
126
+
127
+ <Input type="search" size="sm" aria-label="Buscar produtos" />
128
+ ```
129
+
130
+ **When to use it:** a control that only ever renders the outlined family (`outlined`, `glass` or `gradient`, the variants `muiVariantFor` draws as an outline), and that sits where its bytes matter: a storefront header, a first screen, or a library component such as `CepField`.
131
+
132
+ **What it refuses:** `variant="filled"` and `variant="underline"` are type errors. They need the inputs this entry exists to leave out, so use the generic entry for them.
133
+
134
+ **What stays the same:** `__tests__/outlined-entry.test.tsx` renders both entries from the same props and compares the DOM. `__tests__/outlined-reachability.test.ts` fails if `FilledInput` or MUI's `Input` becomes reachable from this entry or from `CepField`.
135
+
136
+ **Reachable only through this subpath.** The entry is not re-exported from `form/Input` or from the `form` barrel, where a second `Input` would collide.
137
+
118
138
  ## Accessibility
119
139
 
120
140
  ### ARIA Attributes
@@ -1,199 +1,12 @@
1
- import CircularProgress from '@mui/material/CircularProgress/index.js';
2
- import InputAdornment from '@mui/material/InputAdornment/index.js';
3
- import { styled, useTheme } from '@mui/material/styles/index.js';
4
- import React from 'react';
5
-
6
- import { INPUT_LOADING } from './Input.metrics';
7
- import { TextFieldSlim } from './text-field-slim';
8
-
9
- import {
10
- filledStyles,
11
- floatingLabelStyles,
12
- glowStyles,
13
- inputBaseStyles,
14
- inputRadiusStyles,
15
- muiVariantFor,
16
- outlinedStyles,
17
- pulseStyles,
18
- SIZE_MAP,
19
- } from './Input.styles';
20
- import type { InputProps } from './Input.types';
21
- import { splitTestId } from '../../../platform/test-id';
22
- import { fieldControlStyles } from '../../../tokens/field-height';
23
- import { rem } from '../../../tokens/relative';
24
- import type { SizeValue } from '../../../tokens/vocabulary';
25
-
26
- /**
27
- * `TextFieldSlim`, not `TextField` — see `text-field-slim.tsx`. MUI's own
28
- * `TextField` imports `Select` unconditionally, and through it `Menu`,
29
- * `Popover`, `Modal` and seven more component modules, so every screen with one
30
- * text box shipped a dropdown it can never render. Same composition, same DOM,
31
- * same prop routing; the select branch is the only thing missing.
32
- */
33
- const StyledTextField = styled(TextFieldSlim, {
34
- shouldForwardProp: (prop) =>
35
- !['customVariant', 'fieldSize', 'floating', 'glow', 'pulse', 'loading'].includes(prop as string),
36
- })<{
37
- customVariant?: InputProps['variant'];
38
- fieldSize: SizeValue;
39
- floating?: boolean;
40
- glow?: boolean;
41
- pulse?: boolean;
42
- loading?: boolean;
43
- }>(({ theme, customVariant, fieldSize, floating, glow, pulse, loading }) => ({
44
- position: 'relative',
45
- // The theme's field height for this size (outlined family, one line).
46
- ...fieldControlStyles(theme, fieldSize),
47
- opacity: loading ? INPUT_LOADING.opacity : 1,
48
-
49
- ...(glow ? glowStyles(theme) : {}),
50
- ...(pulse ? pulseStyles(theme, fieldSize) : {}),
51
- ...(floating ? floatingLabelStyles(theme) : {}),
52
-
53
- '& .MuiInputBase-root': {
54
- transition: 'all 0.3s ease',
55
- ...inputRadiusStyles(theme, customVariant),
56
- ...inputBaseStyles(theme, customVariant),
57
- },
58
-
59
- '& .MuiOutlinedInput-root': outlinedStyles(theme),
60
- '& .MuiFilledInput-root': filledStyles(theme),
61
- }));
62
-
63
- /** Only one adornment shows at a time: the spinner replaces the caller's while loading. */
64
- const EndAdornment: React.FC<{ loading: boolean; endAdornment?: React.ReactNode }> = ({
65
- loading,
66
- endAdornment,
67
- }) => {
68
- const theme = useTheme();
69
- if (loading) {
70
- return (
71
- <InputAdornment position="end">
72
- <CircularProgress size={rem(theme, INPUT_LOADING.spinnerSize)} />
73
- </InputAdornment>
74
- );
75
- }
76
-
77
- if (!endAdornment) return null;
78
-
79
- return <InputAdornment position="end">{endAdornment}</InputAdornment>;
80
- };
81
-
82
- /** While loading the field is inert: no clicks, and disabled to assistive tech. */
83
- const interactionProps = (
84
- loading: boolean,
85
- onClick: InputProps['onClick'],
86
- disabled?: boolean,
87
- ) => ({
88
- disabled: loading || disabled,
89
- onClick: loading ? undefined : onClick,
90
- });
1
+ import { createInput } from "./Input.factory";
2
+ import type { InputComponent } from "./Input.factory";
3
+ import { TextFieldSlim } from "./text-field-slim";
91
4
 
92
5
  /**
93
- * The ARIA that describes the field has to sit on the `<input>`: the text
94
- * field puts every attribute it does not recognise on its root `FormControl`,
95
- * a `<div>` with no role, where a screen reader never reads it.
96
- *
97
- * `aria-label` has ridden `inputProps` since FUT-755. `aria-describedby` and
98
- * `aria-busy` fell through to the div until FUT-2619, so CepField's input
99
- * pointed at nothing while its lookup status lived in a live region beside it.
100
- *
101
- * `inputProps` are spread onto the `<input>` AFTER the `aria-describedby` MUI
102
- * writes for helper text, so a caller's ids REPLACE the helper text's: MUI's
103
- * `TextField` on its own keeps only one of the two. This joins both, helper
104
- * text first. The helper id is MUI's `<id>-helper-text` (the parity test pins
105
- * that spelling), which is why the field's id is fixed here rather than left
106
- * to the text field.
6
+ * The text input, over `TextFieldSlim` — see `text-field-slim.tsx` for why not
7
+ * MUI's `TextField`, and `Input.factory.tsx` for the body. This entry renders
8
+ * any of the five variants; a control that only ever renders the outlined
9
+ * family can import `@12-apps/ui/form/Input/outlined`, which ships one MUI
10
+ * input instead of three (FUT-1054).
107
11
  */
108
- function inputAriaOf(a: {
109
- id: string;
110
- helperText: React.ReactNode;
111
- label?: string;
112
- describedBy?: string;
113
- busy?: InputProps['aria-busy'];
114
- }): Record<string, unknown> {
115
- const describedBy = [a.helperText ? `${a.id}-helper-text` : undefined, a.describedBy]
116
- .filter(Boolean)
117
- .join(' ');
118
- return {
119
- ...(a.label === undefined ? {} : { 'aria-label': a.label }),
120
- ...(a.describedBy === undefined ? {} : { 'aria-describedby': describedBy }),
121
- ...(a.busy === undefined ? {} : { 'aria-busy': a.busy }),
122
- };
123
- }
124
-
125
- export const Input = React.forwardRef<HTMLInputElement, InputProps>(
126
- (
127
- {
128
- variant = 'outlined',
129
- size = 'md',
130
- label,
131
- error,
132
- helperText,
133
- startAdornment,
134
- endAdornment,
135
- fullWidth = true,
136
- floating = false,
137
- glow = false,
138
- pulse = false,
139
- loading = false,
140
- onClick,
141
- onFocus,
142
- onBlur,
143
- 'aria-label': ariaLabel,
144
- 'aria-describedby': ariaDescribedBy,
145
- 'aria-busy': ariaBusy,
146
- inputProps,
147
- ...rest
148
- },
149
- ref,
150
- ) => {
151
- const { testId: dataTestId, rest: props } = splitTestId(rest);
152
- const generatedId = React.useId();
153
- const id = props.id ?? generatedId;
154
- return (
155
- <StyledTextField
156
- ref={ref}
157
- variant={muiVariantFor(variant)}
158
- customVariant={variant}
159
- fieldSize={size}
160
- floating={floating}
161
- glow={glow}
162
- pulse={pulse}
163
- loading={loading}
164
- label={label}
165
- error={error}
166
- helperText={helperText}
167
- fullWidth={fullWidth}
168
- {...interactionProps(loading, onClick, props.disabled)}
169
- onFocus={onFocus}
170
- onBlur={onBlur}
171
- /*
172
- * `aria-label` has to ride `inputProps` to reach the `<input>` (FUT-755).
173
- * Spread with the rest it lands on the FormControl DIV that the text
174
- * field renders as its root, which carries no role — so the field kept
175
- * no accessible name, and a source grep saying "this input is labelled"
176
- * disagreed with the DOM. The reports search box and the block-title
177
- * inputs were both named in source and anonymous to a screen reader.
178
- * `aria-describedby` and `aria-busy` are the same case: `inputAriaOf`.
179
- */
180
- inputProps={{
181
- 'data-testid': dataTestId,
182
- ...inputProps,
183
- ...inputAriaOf({ id, helperText, label: ariaLabel, describedBy: ariaDescribedBy, busy: ariaBusy }),
184
- }}
185
- InputProps={{
186
- startAdornment: startAdornment && (
187
- <InputAdornment position="start">{startAdornment}</InputAdornment>
188
- ),
189
- endAdornment: <EndAdornment loading={loading} endAdornment={endAdornment} />,
190
- }}
191
- {...SIZE_MAP[size]}
192
- {...props}
193
- id={id}
194
- />
195
- );
196
- },
197
- );
198
-
199
- Input.displayName = 'Input';
12
+ export const Input: InputComponent = createInput(TextFieldSlim);
@@ -0,0 +1,27 @@
1
+ import { createInput } from '../Input.factory';
2
+ import type { InputComponent } from '../Input.factory';
3
+ import type { InputProps as GenericInputProps, InputVariant } from '../Input.types';
4
+ import { OutlinedTextFieldSlim } from './text-field-slim-outlined';
5
+
6
+ /**
7
+ * The house variants MUI draws as `outlined`: `muiVariantFor` maps `glass` and
8
+ * `gradient` onto an outline (`Input.metrics.ts`). `filled` and `underline`
9
+ * need the inputs this entry exists to leave out, so they are a type error here
10
+ * rather than a silent fallback.
11
+ */
12
+ export type OutlinedInputVariant = Extract<InputVariant, 'outlined' | 'glass' | 'gradient'>;
13
+
14
+ export type InputProps = Omit<GenericInputProps, 'variant'> & { variant?: OutlinedInputVariant };
15
+
16
+ /**
17
+ * `@12-apps/ui/form/Input/outlined` — the same `Input`, with the same props,
18
+ * styles and DOM, built on a field that imports `OutlinedInput` and no other
19
+ * MUI input (FUT-1054). For a control that only ever renders the outlined
20
+ * family and sits where its bytes matter: a storefront header, a first screen.
21
+ *
22
+ * Not re-exported from `form/Input` or the `form` barrel: a second `Input`
23
+ * there would collide. Reach it only through this subpath.
24
+ */
25
+ export const Input = createInput(OutlinedTextFieldSlim) as InputComponent<InputProps>;
26
+
27
+ export type { InputSize } from '../Input.types';
@@ -0,0 +1,13 @@
1
+ import OutlinedInput from '@mui/material/OutlinedInput/index.js';
2
+
3
+ import { createTextFieldSlim } from '../text-field-slim.factory';
4
+ import type { TextFieldSlimComponent } from '../text-field-slim.factory';
5
+
6
+ /**
7
+ * `TextFieldSlim` pinned to MUI's outlined input (FUT-1054). The generic field
8
+ * picks its input from a three-way table at runtime, so a bundler has to keep
9
+ * `FilledInput` and `Input` for every caller; this one imports `OutlinedInput`
10
+ * alone. Every variant it can be asked for renders outlined, which is what the
11
+ * outlined `Input` entry ever asks for.
12
+ */
13
+ export const OutlinedTextFieldSlim: TextFieldSlimComponent = createTextFieldSlim(() => OutlinedInput);