@multiplatform.one/forms 7.46.0 → 7.47.1

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 (541) hide show
  1. package/dist/cjs/Button/index.cjs +14 -3
  2. package/dist/cjs/Button/index.native.js +18 -7
  3. package/dist/cjs/Button/index.native.js.map +1 -1
  4. package/dist/cjs/ErrorSummary.cjs +1 -1
  5. package/dist/cjs/ErrorSummary.native.js +1 -1
  6. package/dist/cjs/ErrorSummary.native.js.map +1 -1
  7. package/dist/cjs/FloatingPanel/PanelPortal.cjs +1 -1
  8. package/dist/cjs/FloatingPanel/index.cjs +13 -4
  9. package/dist/cjs/FloatingPanel/index.native.js +9 -2
  10. package/dist/cjs/FloatingPanel/index.native.js.map +1 -1
  11. package/dist/cjs/FloatingPanel/trailingAction.cjs +59 -0
  12. package/dist/cjs/FloatingPanel/trailingAction.native.js +64 -0
  13. package/dist/cjs/FloatingPanel/trailingAction.native.js.map +1 -0
  14. package/dist/cjs/FormGrid.cjs +1 -0
  15. package/dist/cjs/FormGrid.native.js +1 -0
  16. package/dist/cjs/FormGrid.native.js.map +1 -1
  17. package/dist/cjs/InputParts/PasswordReveal.cjs +96 -0
  18. package/dist/cjs/InputParts/PasswordReveal.native.js +104 -0
  19. package/dist/cjs/InputParts/PasswordReveal.native.js.map +1 -0
  20. package/dist/cjs/InputParts/index.cjs +95 -5
  21. package/dist/cjs/InputParts/index.native.js +99 -5
  22. package/dist/cjs/InputParts/index.native.js.map +1 -1
  23. package/dist/cjs/fields/ColorPicker/index.cjs +8 -17
  24. package/dist/cjs/fields/ColorPicker/index.native.js +9 -18
  25. package/dist/cjs/fields/ColorPicker/index.native.js.map +1 -1
  26. package/dist/cjs/fields/Combobox/index.cjs +28 -44
  27. package/dist/cjs/fields/Combobox/index.native.js +30 -45
  28. package/dist/cjs/fields/Combobox/index.native.js.map +1 -1
  29. package/dist/cjs/fields/DatePicker/Calendar.cjs +3 -4
  30. package/dist/cjs/fields/DatePicker/Calendar.native.js +3 -4
  31. package/dist/cjs/fields/DatePicker/Calendar.native.js.map +1 -1
  32. package/dist/cjs/fields/DatePicker/parts.cjs +5 -9
  33. package/dist/cjs/fields/DatePicker/parts.native.js +5 -9
  34. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  35. package/dist/cjs/fields/Duration/durationMath.cjs +1 -1
  36. package/dist/cjs/fields/Duration/durationMath.native.js +1 -1
  37. package/dist/cjs/fields/Duration/durationMath.native.js.map +1 -1
  38. package/dist/cjs/fields/Duration/index.cjs +100 -90
  39. package/dist/cjs/fields/Duration/index.native.js +108 -98
  40. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  41. package/dist/cjs/fields/FileUpload/index.cjs +134 -24
  42. package/dist/cjs/fields/FileUpload/index.native.js +149 -34
  43. package/dist/cjs/fields/FileUpload/index.native.js.map +1 -1
  44. package/dist/cjs/fields/Geolocation/GeolocationMap.cjs +2 -1
  45. package/dist/cjs/fields/Geolocation/GeolocationMap.native.js +3 -2
  46. package/dist/cjs/fields/Geolocation/GeolocationMap.native.js.map +1 -1
  47. package/dist/cjs/fields/Geolocation/index.cjs +10 -8
  48. package/dist/cjs/fields/Geolocation/index.native.js +10 -8
  49. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  50. package/dist/cjs/fields/Icon/index.cjs +6 -13
  51. package/dist/cjs/fields/Icon/index.native.js +6 -13
  52. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  53. package/dist/cjs/fields/ImageField/index.cjs +5 -5
  54. package/dist/cjs/fields/ImageField/index.native.js +5 -5
  55. package/dist/cjs/fields/ImageField/index.native.js.map +1 -1
  56. package/dist/cjs/fields/Input/index.cjs +27 -21
  57. package/dist/cjs/fields/Input/index.native.js +28 -21
  58. package/dist/cjs/fields/Input/index.native.js.map +1 -1
  59. package/dist/cjs/fields/MentionInput/index.cjs +7 -8
  60. package/dist/cjs/fields/MentionInput/index.native.js +7 -8
  61. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  62. package/dist/cjs/fields/OTPInput/index.cjs +1 -1
  63. package/dist/cjs/fields/OTPInput/index.native.js +1 -1
  64. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  65. package/dist/cjs/fields/PhoneInput/index.cjs +3 -3
  66. package/dist/cjs/fields/PhoneInput/index.native.js +3 -3
  67. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  68. package/dist/cjs/fields/RadioGroup/index.cjs +1 -0
  69. package/dist/cjs/fields/RadioGroup/index.native.js +1 -0
  70. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  71. package/dist/cjs/fields/SearchInput/index.cjs +4 -48
  72. package/dist/cjs/fields/SearchInput/index.native.js +4 -46
  73. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  74. package/dist/cjs/fields/Select/index.cjs +14 -12
  75. package/dist/cjs/fields/Select/index.native.js +14 -12
  76. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  77. package/dist/cjs/fields/Signature/index.cjs +1 -1
  78. package/dist/cjs/fields/Signature/index.native.js +1 -1
  79. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  80. package/dist/cjs/fields/Slider/index.cjs +1 -1
  81. package/dist/cjs/fields/Slider/index.native.js +1 -1
  82. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  83. package/dist/cjs/fields/TimePicker/parts.cjs +5 -9
  84. package/dist/cjs/fields/TimePicker/parts.native.js +5 -9
  85. package/dist/cjs/fields/TimePicker/parts.native.js.map +1 -1
  86. package/dist/cjs/fields/TimeRangeScrubber/index.cjs +14 -9
  87. package/dist/cjs/fields/TimeRangeScrubber/index.native.js +14 -9
  88. package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
  89. package/dist/cjs/fields/ToggleGroup/index.cjs +1 -1
  90. package/dist/cjs/fields/ToggleGroup/index.native.js +1 -1
  91. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  92. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.cjs +5 -5
  93. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +5 -5
  94. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  95. package/dist/cjs/hooks/useFocusManagement.cjs +3 -2
  96. package/dist/cjs/hooks/useFocusManagement.native.js +3 -2
  97. package/dist/cjs/hooks/useFocusManagement.native.js.map +1 -1
  98. package/dist/cjs/index.cjs +7 -0
  99. package/dist/cjs/index.native.js +7 -0
  100. package/dist/cjs/index.native.js.map +1 -1
  101. package/dist/cjs/shared/focusManagement.cjs +1 -1
  102. package/dist/cjs/shared/focusManagement.native.js +1 -1
  103. package/dist/cjs/shared/panelPortal.cjs +1 -1
  104. package/dist/cjs/shared/panelPortal.native.js +1 -1
  105. package/dist/cjs/shared/panelPortal.native.js.map +1 -1
  106. package/dist/cjs/shared/useDragScroll.cjs +2 -2
  107. package/dist/cjs/shared/useDragScroll.native.js +2 -2
  108. package/dist/cjs/shared/useDragScroll.native.js.map +1 -1
  109. package/dist/esm/Button/index.mjs +17 -6
  110. package/dist/esm/Button/index.mjs.map +1 -1
  111. package/dist/esm/Button/index.native.js +21 -10
  112. package/dist/esm/Button/index.native.js.map +1 -1
  113. package/dist/esm/ErrorSummary.mjs +2 -2
  114. package/dist/esm/ErrorSummary.mjs.map +1 -1
  115. package/dist/esm/ErrorSummary.native.js +2 -2
  116. package/dist/esm/ErrorSummary.native.js.map +1 -1
  117. package/dist/esm/FloatingPanel/PanelPortal.mjs +1 -1
  118. package/dist/esm/FloatingPanel/PanelPortal.mjs.map +1 -1
  119. package/dist/esm/FloatingPanel/index.mjs +13 -4
  120. package/dist/esm/FloatingPanel/index.mjs.map +1 -1
  121. package/dist/esm/FloatingPanel/index.native.js +9 -2
  122. package/dist/esm/FloatingPanel/index.native.js.map +1 -1
  123. package/dist/esm/FloatingPanel/trailingAction.mjs +33 -0
  124. package/dist/esm/FloatingPanel/trailingAction.mjs.map +1 -0
  125. package/dist/esm/FloatingPanel/trailingAction.native.js +35 -0
  126. package/dist/esm/FloatingPanel/trailingAction.native.js.map +1 -0
  127. package/dist/esm/FormGrid.mjs +1 -0
  128. package/dist/esm/FormGrid.mjs.map +1 -1
  129. package/dist/esm/FormGrid.native.js +1 -0
  130. package/dist/esm/FormGrid.native.js.map +1 -1
  131. package/dist/esm/InputParts/PasswordReveal.mjs +68 -0
  132. package/dist/esm/InputParts/PasswordReveal.mjs.map +1 -0
  133. package/dist/esm/InputParts/PasswordReveal.native.js +73 -0
  134. package/dist/esm/InputParts/PasswordReveal.native.js.map +1 -0
  135. package/dist/esm/InputParts/index.mjs +97 -8
  136. package/dist/esm/InputParts/index.mjs.map +1 -1
  137. package/dist/esm/InputParts/index.native.js +101 -8
  138. package/dist/esm/InputParts/index.native.js.map +1 -1
  139. package/dist/esm/fields/ColorPicker/index.mjs +8 -17
  140. package/dist/esm/fields/ColorPicker/index.mjs.map +1 -1
  141. package/dist/esm/fields/ColorPicker/index.native.js +9 -18
  142. package/dist/esm/fields/ColorPicker/index.native.js.map +1 -1
  143. package/dist/esm/fields/Combobox/index.mjs +29 -45
  144. package/dist/esm/fields/Combobox/index.mjs.map +1 -1
  145. package/dist/esm/fields/Combobox/index.native.js +31 -46
  146. package/dist/esm/fields/Combobox/index.native.js.map +1 -1
  147. package/dist/esm/fields/DatePicker/Calendar.mjs +4 -5
  148. package/dist/esm/fields/DatePicker/Calendar.mjs.map +1 -1
  149. package/dist/esm/fields/DatePicker/Calendar.native.js +4 -5
  150. package/dist/esm/fields/DatePicker/Calendar.native.js.map +1 -1
  151. package/dist/esm/fields/DatePicker/parts.mjs +5 -9
  152. package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
  153. package/dist/esm/fields/DatePicker/parts.native.js +5 -9
  154. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  155. package/dist/esm/fields/Duration/durationMath.mjs +1 -1
  156. package/dist/esm/fields/Duration/durationMath.mjs.map +1 -1
  157. package/dist/esm/fields/Duration/durationMath.native.js +1 -1
  158. package/dist/esm/fields/Duration/index.mjs +100 -90
  159. package/dist/esm/fields/Duration/index.mjs.map +1 -1
  160. package/dist/esm/fields/Duration/index.native.js +108 -98
  161. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  162. package/dist/esm/fields/FileUpload/index.mjs +135 -25
  163. package/dist/esm/fields/FileUpload/index.mjs.map +1 -1
  164. package/dist/esm/fields/FileUpload/index.native.js +150 -35
  165. package/dist/esm/fields/FileUpload/index.native.js.map +1 -1
  166. package/dist/esm/fields/Geolocation/GeolocationMap.mjs +2 -1
  167. package/dist/esm/fields/Geolocation/GeolocationMap.mjs.map +1 -1
  168. package/dist/esm/fields/Geolocation/GeolocationMap.native.js +2 -1
  169. package/dist/esm/fields/Geolocation/GeolocationMap.native.js.map +1 -1
  170. package/dist/esm/fields/Geolocation/index.mjs +13 -11
  171. package/dist/esm/fields/Geolocation/index.mjs.map +1 -1
  172. package/dist/esm/fields/Geolocation/index.native.js +13 -11
  173. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  174. package/dist/esm/fields/Icon/index.mjs +8 -15
  175. package/dist/esm/fields/Icon/index.mjs.map +1 -1
  176. package/dist/esm/fields/Icon/index.native.js +8 -15
  177. package/dist/esm/fields/Icon/index.native.js.map +1 -1
  178. package/dist/esm/fields/ImageField/index.mjs +7 -7
  179. package/dist/esm/fields/ImageField/index.mjs.map +1 -1
  180. package/dist/esm/fields/ImageField/index.native.js +7 -7
  181. package/dist/esm/fields/ImageField/index.native.js.map +1 -1
  182. package/dist/esm/fields/Input/index.mjs +28 -22
  183. package/dist/esm/fields/Input/index.mjs.map +1 -1
  184. package/dist/esm/fields/Input/index.native.js +29 -22
  185. package/dist/esm/fields/Input/index.native.js.map +1 -1
  186. package/dist/esm/fields/MentionInput/index.mjs +13 -14
  187. package/dist/esm/fields/MentionInput/index.mjs.map +1 -1
  188. package/dist/esm/fields/MentionInput/index.native.js +13 -14
  189. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  190. package/dist/esm/fields/OTPInput/index.mjs +2 -2
  191. package/dist/esm/fields/OTPInput/index.mjs.map +1 -1
  192. package/dist/esm/fields/OTPInput/index.native.js +2 -2
  193. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  194. package/dist/esm/fields/PhoneInput/index.mjs +5 -5
  195. package/dist/esm/fields/PhoneInput/index.mjs.map +1 -1
  196. package/dist/esm/fields/PhoneInput/index.native.js +5 -5
  197. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  198. package/dist/esm/fields/RadioGroup/index.mjs +1 -0
  199. package/dist/esm/fields/RadioGroup/index.mjs.map +1 -1
  200. package/dist/esm/fields/RadioGroup/index.native.js +1 -0
  201. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  202. package/dist/esm/fields/SearchInput/index.mjs +5 -49
  203. package/dist/esm/fields/SearchInput/index.mjs.map +1 -1
  204. package/dist/esm/fields/SearchInput/index.native.js +5 -47
  205. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  206. package/dist/esm/fields/Select/index.mjs +15 -13
  207. package/dist/esm/fields/Select/index.mjs.map +1 -1
  208. package/dist/esm/fields/Select/index.native.js +15 -13
  209. package/dist/esm/fields/Select/index.native.js.map +1 -1
  210. package/dist/esm/fields/Signature/index.mjs +2 -2
  211. package/dist/esm/fields/Signature/index.mjs.map +1 -1
  212. package/dist/esm/fields/Signature/index.native.js +2 -2
  213. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  214. package/dist/esm/fields/Slider/index.mjs +2 -2
  215. package/dist/esm/fields/Slider/index.mjs.map +1 -1
  216. package/dist/esm/fields/Slider/index.native.js +2 -2
  217. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  218. package/dist/esm/fields/TimePicker/parts.mjs +5 -9
  219. package/dist/esm/fields/TimePicker/parts.mjs.map +1 -1
  220. package/dist/esm/fields/TimePicker/parts.native.js +5 -9
  221. package/dist/esm/fields/TimePicker/parts.native.js.map +1 -1
  222. package/dist/esm/fields/TimeRangeScrubber/index.mjs +20 -15
  223. package/dist/esm/fields/TimeRangeScrubber/index.mjs.map +1 -1
  224. package/dist/esm/fields/TimeRangeScrubber/index.native.js +20 -15
  225. package/dist/esm/fields/TimeRangeScrubber/index.native.js.map +1 -1
  226. package/dist/esm/fields/ToggleGroup/index.mjs +3 -3
  227. package/dist/esm/fields/ToggleGroup/index.mjs.map +1 -1
  228. package/dist/esm/fields/ToggleGroup/index.native.js +3 -3
  229. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  230. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs +2 -2
  231. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
  232. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js +2 -2
  233. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  234. package/dist/esm/hooks/useFocusManagement.mjs +3 -2
  235. package/dist/esm/hooks/useFocusManagement.mjs.map +1 -1
  236. package/dist/esm/hooks/useFocusManagement.native.js +3 -2
  237. package/dist/esm/hooks/useFocusManagement.native.js.map +1 -1
  238. package/dist/esm/index.mjs +3 -1
  239. package/dist/esm/index.mjs.map +1 -1
  240. package/dist/esm/index.native.js +3 -1
  241. package/dist/esm/index.native.js.map +1 -1
  242. package/dist/esm/shared/focusManagement.mjs +1 -1
  243. package/dist/esm/shared/focusManagement.mjs.map +1 -1
  244. package/dist/esm/shared/focusManagement.native.js +1 -1
  245. package/dist/esm/shared/panelPortal.mjs +1 -1
  246. package/dist/esm/shared/panelPortal.mjs.map +1 -1
  247. package/dist/esm/shared/panelPortal.native.js +1 -1
  248. package/dist/esm/shared/panelPortal.native.js.map +1 -1
  249. package/dist/esm/shared/useDragScroll.mjs +2 -2
  250. package/dist/esm/shared/useDragScroll.mjs.map +1 -1
  251. package/dist/esm/shared/useDragScroll.native.js +2 -2
  252. package/dist/esm/shared/useDragScroll.native.js.map +1 -1
  253. package/dist/jsx/Button/index.mjs +17 -6
  254. package/dist/jsx/Button/index.mjs.map +1 -1
  255. package/dist/jsx/Button/index.native.js +18 -7
  256. package/dist/jsx/Button/index.native.js.map +1 -1
  257. package/dist/jsx/ErrorSummary.mjs +2 -2
  258. package/dist/jsx/ErrorSummary.mjs.map +1 -1
  259. package/dist/jsx/ErrorSummary.native.js +1 -1
  260. package/dist/jsx/ErrorSummary.native.js.map +1 -1
  261. package/dist/jsx/FloatingPanel/PanelPortal.mjs +1 -1
  262. package/dist/jsx/FloatingPanel/PanelPortal.mjs.map +1 -1
  263. package/dist/jsx/FloatingPanel/index.mjs +13 -4
  264. package/dist/jsx/FloatingPanel/index.mjs.map +1 -1
  265. package/dist/jsx/FloatingPanel/index.native.js +9 -2
  266. package/dist/jsx/FloatingPanel/index.native.js.map +1 -1
  267. package/dist/jsx/FloatingPanel/trailingAction.mjs +33 -0
  268. package/dist/jsx/FloatingPanel/trailingAction.mjs.map +1 -0
  269. package/dist/jsx/FloatingPanel/trailingAction.native.js +64 -0
  270. package/dist/jsx/FloatingPanel/trailingAction.native.js.map +1 -0
  271. package/dist/jsx/FormGrid.mjs +1 -0
  272. package/dist/jsx/FormGrid.mjs.map +1 -1
  273. package/dist/jsx/FormGrid.native.js +1 -0
  274. package/dist/jsx/FormGrid.native.js.map +1 -1
  275. package/dist/jsx/InputParts/PasswordReveal.mjs +68 -0
  276. package/dist/jsx/InputParts/PasswordReveal.mjs.map +1 -0
  277. package/dist/jsx/InputParts/PasswordReveal.native.js +104 -0
  278. package/dist/jsx/InputParts/PasswordReveal.native.js.map +1 -0
  279. package/dist/jsx/InputParts/index.mjs +97 -8
  280. package/dist/jsx/InputParts/index.mjs.map +1 -1
  281. package/dist/jsx/InputParts/index.native.js +99 -5
  282. package/dist/jsx/InputParts/index.native.js.map +1 -1
  283. package/dist/jsx/fields/ColorPicker/index.mjs +8 -17
  284. package/dist/jsx/fields/ColorPicker/index.mjs.map +1 -1
  285. package/dist/jsx/fields/ColorPicker/index.native.js +9 -18
  286. package/dist/jsx/fields/ColorPicker/index.native.js.map +1 -1
  287. package/dist/jsx/fields/Combobox/index.mjs +29 -45
  288. package/dist/jsx/fields/Combobox/index.mjs.map +1 -1
  289. package/dist/jsx/fields/Combobox/index.native.js +30 -45
  290. package/dist/jsx/fields/Combobox/index.native.js.map +1 -1
  291. package/dist/jsx/fields/DatePicker/Calendar.mjs +4 -5
  292. package/dist/jsx/fields/DatePicker/Calendar.mjs.map +1 -1
  293. package/dist/jsx/fields/DatePicker/Calendar.native.js +3 -4
  294. package/dist/jsx/fields/DatePicker/Calendar.native.js.map +1 -1
  295. package/dist/jsx/fields/DatePicker/parts.mjs +5 -9
  296. package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
  297. package/dist/jsx/fields/DatePicker/parts.native.js +5 -9
  298. package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
  299. package/dist/jsx/fields/Duration/durationMath.mjs +1 -1
  300. package/dist/jsx/fields/Duration/durationMath.mjs.map +1 -1
  301. package/dist/jsx/fields/Duration/durationMath.native.js +1 -1
  302. package/dist/jsx/fields/Duration/durationMath.native.js.map +1 -1
  303. package/dist/jsx/fields/Duration/index.mjs +100 -90
  304. package/dist/jsx/fields/Duration/index.mjs.map +1 -1
  305. package/dist/jsx/fields/Duration/index.native.js +108 -98
  306. package/dist/jsx/fields/Duration/index.native.js.map +1 -1
  307. package/dist/jsx/fields/FileUpload/index.mjs +135 -25
  308. package/dist/jsx/fields/FileUpload/index.mjs.map +1 -1
  309. package/dist/jsx/fields/FileUpload/index.native.js +149 -34
  310. package/dist/jsx/fields/FileUpload/index.native.js.map +1 -1
  311. package/dist/jsx/fields/Geolocation/GeolocationMap.mjs +2 -1
  312. package/dist/jsx/fields/Geolocation/GeolocationMap.mjs.map +1 -1
  313. package/dist/jsx/fields/Geolocation/GeolocationMap.native.js +3 -2
  314. package/dist/jsx/fields/Geolocation/GeolocationMap.native.js.map +1 -1
  315. package/dist/jsx/fields/Geolocation/index.mjs +13 -11
  316. package/dist/jsx/fields/Geolocation/index.mjs.map +1 -1
  317. package/dist/jsx/fields/Geolocation/index.native.js +10 -8
  318. package/dist/jsx/fields/Geolocation/index.native.js.map +1 -1
  319. package/dist/jsx/fields/Icon/index.mjs +8 -15
  320. package/dist/jsx/fields/Icon/index.mjs.map +1 -1
  321. package/dist/jsx/fields/Icon/index.native.js +6 -13
  322. package/dist/jsx/fields/Icon/index.native.js.map +1 -1
  323. package/dist/jsx/fields/ImageField/index.mjs +7 -7
  324. package/dist/jsx/fields/ImageField/index.mjs.map +1 -1
  325. package/dist/jsx/fields/ImageField/index.native.js +5 -5
  326. package/dist/jsx/fields/ImageField/index.native.js.map +1 -1
  327. package/dist/jsx/fields/Input/index.mjs +28 -22
  328. package/dist/jsx/fields/Input/index.mjs.map +1 -1
  329. package/dist/jsx/fields/Input/index.native.js +28 -21
  330. package/dist/jsx/fields/Input/index.native.js.map +1 -1
  331. package/dist/jsx/fields/MentionInput/index.mjs +13 -14
  332. package/dist/jsx/fields/MentionInput/index.mjs.map +1 -1
  333. package/dist/jsx/fields/MentionInput/index.native.js +7 -8
  334. package/dist/jsx/fields/MentionInput/index.native.js.map +1 -1
  335. package/dist/jsx/fields/OTPInput/index.mjs +2 -2
  336. package/dist/jsx/fields/OTPInput/index.mjs.map +1 -1
  337. package/dist/jsx/fields/OTPInput/index.native.js +1 -1
  338. package/dist/jsx/fields/OTPInput/index.native.js.map +1 -1
  339. package/dist/jsx/fields/PhoneInput/index.mjs +5 -5
  340. package/dist/jsx/fields/PhoneInput/index.mjs.map +1 -1
  341. package/dist/jsx/fields/PhoneInput/index.native.js +3 -3
  342. package/dist/jsx/fields/PhoneInput/index.native.js.map +1 -1
  343. package/dist/jsx/fields/RadioGroup/index.mjs +1 -0
  344. package/dist/jsx/fields/RadioGroup/index.mjs.map +1 -1
  345. package/dist/jsx/fields/RadioGroup/index.native.js +1 -0
  346. package/dist/jsx/fields/RadioGroup/index.native.js.map +1 -1
  347. package/dist/jsx/fields/SearchInput/index.mjs +5 -49
  348. package/dist/jsx/fields/SearchInput/index.mjs.map +1 -1
  349. package/dist/jsx/fields/SearchInput/index.native.js +4 -46
  350. package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
  351. package/dist/jsx/fields/Select/index.mjs +15 -13
  352. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  353. package/dist/jsx/fields/Select/index.native.js +14 -12
  354. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  355. package/dist/jsx/fields/Signature/index.mjs +2 -2
  356. package/dist/jsx/fields/Signature/index.mjs.map +1 -1
  357. package/dist/jsx/fields/Signature/index.native.js +1 -1
  358. package/dist/jsx/fields/Signature/index.native.js.map +1 -1
  359. package/dist/jsx/fields/Slider/index.mjs +2 -2
  360. package/dist/jsx/fields/Slider/index.mjs.map +1 -1
  361. package/dist/jsx/fields/Slider/index.native.js +1 -1
  362. package/dist/jsx/fields/Slider/index.native.js.map +1 -1
  363. package/dist/jsx/fields/TimePicker/parts.mjs +5 -9
  364. package/dist/jsx/fields/TimePicker/parts.mjs.map +1 -1
  365. package/dist/jsx/fields/TimePicker/parts.native.js +5 -9
  366. package/dist/jsx/fields/TimePicker/parts.native.js.map +1 -1
  367. package/dist/jsx/fields/TimeRangeScrubber/index.mjs +20 -15
  368. package/dist/jsx/fields/TimeRangeScrubber/index.mjs.map +1 -1
  369. package/dist/jsx/fields/TimeRangeScrubber/index.native.js +14 -9
  370. package/dist/jsx/fields/TimeRangeScrubber/index.native.js.map +1 -1
  371. package/dist/jsx/fields/ToggleGroup/index.mjs +3 -3
  372. package/dist/jsx/fields/ToggleGroup/index.mjs.map +1 -1
  373. package/dist/jsx/fields/ToggleGroup/index.native.js +1 -1
  374. package/dist/jsx/fields/ToggleGroup/index.native.js.map +1 -1
  375. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs +2 -2
  376. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -1
  377. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js +5 -5
  378. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -1
  379. package/dist/jsx/hooks/useFocusManagement.mjs +3 -2
  380. package/dist/jsx/hooks/useFocusManagement.mjs.map +1 -1
  381. package/dist/jsx/hooks/useFocusManagement.native.js +3 -2
  382. package/dist/jsx/hooks/useFocusManagement.native.js.map +1 -1
  383. package/dist/jsx/index.js +3 -1
  384. package/dist/jsx/index.js.map +1 -1
  385. package/dist/jsx/index.mjs +3 -1
  386. package/dist/jsx/index.mjs.map +1 -1
  387. package/dist/jsx/index.native.js +7 -0
  388. package/dist/jsx/index.native.js.map +1 -1
  389. package/dist/jsx/shared/focusManagement.mjs +1 -1
  390. package/dist/jsx/shared/focusManagement.mjs.map +1 -1
  391. package/dist/jsx/shared/focusManagement.native.js +1 -1
  392. package/dist/jsx/shared/focusManagement.native.js.map +1 -1
  393. package/dist/jsx/shared/panelPortal.mjs +1 -1
  394. package/dist/jsx/shared/panelPortal.mjs.map +1 -1
  395. package/dist/jsx/shared/panelPortal.native.js +1 -1
  396. package/dist/jsx/shared/panelPortal.native.js.map +1 -1
  397. package/dist/jsx/shared/useDragScroll.mjs +2 -2
  398. package/dist/jsx/shared/useDragScroll.mjs.map +1 -1
  399. package/dist/jsx/shared/useDragScroll.native.js +2 -2
  400. package/dist/jsx/shared/useDragScroll.native.js.map +1 -1
  401. package/package.json +8 -8
  402. package/src/AdaptivePopup/AdaptivePopup.stories.tsx +2 -1
  403. package/src/Button/Button.borderLadder.spec.tsx +32 -7
  404. package/src/Button/Button.edge.spec.tsx +68 -0
  405. package/src/Button/Button.stories.tsx +2 -1
  406. package/src/Button/index.tsx +37 -11
  407. package/src/Chip/Chip.stories.tsx +2 -1
  408. package/src/ContextualSaveBar/ContextualSaveBar.stories.tsx +2 -1
  409. package/src/ContextualSaveBar/UnsavedChangesDialog.stories.tsx +2 -1
  410. package/src/ControlGroup/ControlGroup.stories.tsx +2 -1
  411. package/src/DescriptionList/DescriptionList.stories.tsx +2 -1
  412. package/src/ErrorSummary.stories.tsx +2 -1
  413. package/src/ErrorSummary.tsx +2 -2
  414. package/src/FieldDisplay/FieldDisplay.stories.tsx +2 -1
  415. package/src/FieldLayout.stories.tsx +2 -2
  416. package/src/FloatingPanel/FloatingPanel.stories.tsx +2 -2
  417. package/src/FloatingPanel/PanelPortal.tsx +1 -0
  418. package/src/FloatingPanel/index.native.tsx +4 -2
  419. package/src/FloatingPanel/index.tsx +14 -4
  420. package/src/FloatingPanel/trailingAction.tsx +37 -0
  421. package/src/Form/Form.stories.tsx +2 -1
  422. package/src/FormGrid.stories.tsx +2 -1
  423. package/src/FormGrid.tsx +1 -0
  424. package/src/FormsIntegration.stories.tsx +4 -18
  425. package/src/InputParts/InputParts.stories.tsx +11 -11
  426. package/src/InputParts/PasswordReveal.tsx +94 -0
  427. package/src/InputParts/index.tsx +144 -2
  428. package/src/InputParts/inputPartsStories.spec.tsx +3 -1
  429. package/src/Skeleton/Skeleton.stories.tsx +2 -2
  430. package/src/Spinner/Spinner.stories.tsx +2 -2
  431. package/src/Wheel/Wheel.stories.tsx +2 -2
  432. package/src/fieldTrailingAction.spec.tsx +188 -0
  433. package/src/fields/Barcode/Barcode.stories.tsx +2 -1
  434. package/src/fields/Barcode/BarcodePreview.stories.tsx +2 -1
  435. package/src/fields/Checkbox/Checkbox.stories.tsx +3 -1
  436. package/src/fields/Checkbox/CheckboxGroup.stories.tsx +2 -2
  437. package/src/fields/Checkbox/Checkboxes.stories.tsx +2 -1
  438. package/src/fields/ColorPicker/PresetSwatches.stories.tsx +2 -1
  439. package/src/fields/ColorPicker/index.tsx +6 -12
  440. package/src/fields/Combobox/Combobox.stories.tsx +2 -1
  441. package/src/fields/Combobox/index.tsx +39 -41
  442. package/src/fields/DatePicker/Calendar.stories.tsx +2 -1
  443. package/src/fields/DatePicker/Calendar.tsx +4 -5
  444. package/src/fields/DatePicker/DatePicker.spec.tsx +2 -2
  445. package/src/fields/DatePicker/DatePicker.stories.tsx +2 -1
  446. package/src/fields/DatePicker/DateRangePicker.stories.tsx +2 -1
  447. package/src/fields/DatePicker/DatetimePicker.stories.tsx +2 -1
  448. package/src/fields/DatePicker/MonthPicker.stories.tsx +2 -1
  449. package/src/fields/DatePicker/MultiDatePicker.spec.tsx +1 -1
  450. package/src/fields/DatePicker/MultiDatePicker.stories.tsx +2 -1
  451. package/src/fields/DatePicker/parts.tsx +6 -10
  452. package/src/fields/Duration/Duration.spec.tsx +25 -1
  453. package/src/fields/Duration/Duration.stories.tsx +6 -1
  454. package/src/fields/Duration/durationMath.spec.ts +2 -2
  455. package/src/fields/Duration/durationMath.ts +1 -1
  456. package/src/fields/Duration/index.tsx +91 -70
  457. package/src/fields/FileUpload/FileUpload.spec.tsx +86 -3
  458. package/src/fields/FileUpload/FileUpload.stories.tsx +15 -0
  459. package/src/fields/FileUpload/index.tsx +170 -50
  460. package/src/fields/Geolocation/Geolocation.stories.tsx +2 -1
  461. package/src/fields/Geolocation/GeolocationMap.native.tsx +2 -1
  462. package/src/fields/Geolocation/GeolocationMap.tsx +2 -1
  463. package/src/fields/Geolocation/index.tsx +39 -16
  464. package/src/fields/Icon/index.tsx +9 -15
  465. package/src/fields/ImageField/index.tsx +9 -8
  466. package/src/fields/Input/Input.stories.tsx +39 -1
  467. package/src/fields/Input/index.tsx +45 -25
  468. package/src/fields/MentionInput/index.tsx +17 -18
  469. package/src/fields/OTPInput/OtpInput.stories.tsx +2 -1
  470. package/src/fields/OTPInput/index.tsx +2 -2
  471. package/src/fields/PhoneInput/PhoneInput.stories.tsx +2 -1
  472. package/src/fields/PhoneInput/index.tsx +10 -6
  473. package/src/fields/Progress/Progress.stories.tsx +2 -1
  474. package/src/fields/RadioGroup/RadioGroup.stories.tsx +3 -2
  475. package/src/fields/RadioGroup/index.tsx +1 -0
  476. package/src/fields/Rating/Rating.stories.tsx +2 -1
  477. package/src/fields/SearchInput/SearchInput.stories.tsx +2 -1
  478. package/src/fields/SearchInput/index.tsx +8 -45
  479. package/src/fields/Select/Select.stories.tsx +2 -2
  480. package/src/fields/Select/index.tsx +18 -12
  481. package/src/fields/Signature/Signature.stories.tsx +2 -1
  482. package/src/fields/Signature/index.tsx +6 -1
  483. package/src/fields/Slider/Slider.stories.tsx +2 -1
  484. package/src/fields/Slider/index.tsx +6 -2
  485. package/src/fields/Stepper/Stepper.stories.tsx +2 -1
  486. package/src/fields/Switch/Switch.stories.tsx +3 -1
  487. package/src/fields/TextArea/TextArea.stories.tsx +2 -1
  488. package/src/fields/TimePicker/TimePicker.stories.tsx +2 -1
  489. package/src/fields/TimePicker/parts.tsx +6 -10
  490. package/src/fields/TimeRangeScrubber/index.tsx +20 -18
  491. package/src/fields/ToggleGroup/ToggleGroup.stories.tsx +2 -8
  492. package/src/fields/ToggleGroup/index.tsx +10 -4
  493. package/src/fields/nativeDateTime/OsDateTimeSheet.tsx +2 -2
  494. package/src/fields/pickerActivation.spec.tsx +7 -3
  495. package/src/hooks/useFocusManagement.ts +3 -2
  496. package/src/index.ts +9 -0
  497. package/src/shared/focusManagement.ts +1 -1
  498. package/src/shared/panelPortal.ts +2 -1
  499. package/src/shared/useDragScroll.ts +2 -2
  500. package/types/Button/index.d.ts +9 -1
  501. package/types/Button/index.d.ts.map +1 -1
  502. package/types/FloatingPanel/PanelPortal.d.ts.map +1 -1
  503. package/types/FloatingPanel/index.d.ts.map +1 -1
  504. package/types/FloatingPanel/index.native.d.ts.map +1 -1
  505. package/types/FloatingPanel/trailingAction.d.ts +16 -0
  506. package/types/FloatingPanel/trailingAction.d.ts.map +1 -0
  507. package/types/InputParts/PasswordReveal.d.ts +28 -0
  508. package/types/InputParts/PasswordReveal.d.ts.map +1 -0
  509. package/types/InputParts/index.d.ts +34 -2
  510. package/types/InputParts/index.d.ts.map +1 -1
  511. package/types/fields/Checkbox/index.d.ts +4 -4
  512. package/types/fields/ColorPicker/index.d.ts.map +1 -1
  513. package/types/fields/Combobox/index.d.ts.map +1 -1
  514. package/types/fields/DatePicker/Calendar.d.ts.map +1 -1
  515. package/types/fields/DatePicker/parts.d.ts.map +1 -1
  516. package/types/fields/Duration/index.d.ts.map +1 -1
  517. package/types/fields/FileUpload/index.d.ts +1 -0
  518. package/types/fields/FileUpload/index.d.ts.map +1 -1
  519. package/types/fields/Geolocation/GeolocationMap.d.ts.map +1 -1
  520. package/types/fields/Geolocation/GeolocationMap.native.d.ts.map +1 -1
  521. package/types/fields/Geolocation/index.d.ts.map +1 -1
  522. package/types/fields/Icon/index.d.ts.map +1 -1
  523. package/types/fields/ImageField/index.d.ts.map +1 -1
  524. package/types/fields/Input/index.d.ts +9 -3
  525. package/types/fields/Input/index.d.ts.map +1 -1
  526. package/types/fields/MentionInput/index.d.ts.map +1 -1
  527. package/types/fields/PhoneInput/index.d.ts.map +1 -1
  528. package/types/fields/RadioGroup/index.d.ts +2 -2
  529. package/types/fields/RadioGroup/index.d.ts.map +1 -1
  530. package/types/fields/SearchInput/index.d.ts.map +1 -1
  531. package/types/fields/Select/index.d.ts.map +1 -1
  532. package/types/fields/Signature/index.d.ts.map +1 -1
  533. package/types/fields/Slider/index.d.ts.map +1 -1
  534. package/types/fields/TimePicker/parts.d.ts.map +1 -1
  535. package/types/fields/TimeRangeScrubber/index.d.ts.map +1 -1
  536. package/types/fields/ToggleGroup/index.d.ts +1 -1
  537. package/types/fields/ToggleGroup/index.d.ts.map +1 -1
  538. package/types/hooks/useFocusManagement.d.ts.map +1 -1
  539. package/types/index.d.ts +4 -0
  540. package/types/index.d.ts.map +1 -1
  541. package/types/shared/panelPortal.d.ts.map +1 -1
@@ -3,10 +3,11 @@ import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
3
3
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
4
4
  import { useForm } from "@tanstack/react-form";
5
5
  import { useState } from "react";
6
- import { Paragraph, Progress as TamaguiProgress, XStack, YStack } from "tamagui";
6
+ import { Progress as TamaguiProgress, XStack, YStack } from "tamagui";
7
7
  import { Button } from "../../Button";
8
8
  import { Form } from "../../Form";
9
9
  import { Progress } from "./index";
10
+ import { Paragraph } from "@multiplatform.one/theme";
10
11
 
11
12
  const meta: Meta<typeof Progress> = {
12
13
  title: "Forms/Progress",
@@ -3,8 +3,9 @@ import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
3
3
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
4
4
  import { useForm } from "@tanstack/react-form";
5
5
  import { useState } from "react";
6
- import { Label, Paragraph, RadioGroup as TamaguiRadioGroup, Text, XStack, YStack } from "tamagui";
7
- import { Preset } from "@multiplatform.one/theme";
6
+ import { RadioGroup as TamaguiRadioGroup, XStack, YStack } from "tamagui";
7
+ import { Label } from "../../Label";
8
+ import { Preset, Text, Paragraph } from "@multiplatform.one/theme";
8
9
  import { Button } from "../../Button";
9
10
  import { Form } from "../../Form";
10
11
  import { RadioGroup } from "./index";
@@ -654,6 +654,7 @@ export function RadioGroup({
654
654
  if (key !== "ArrowDown" && key !== "ArrowUp" && key !== "ArrowLeft" && key !== "ArrowRight")
655
655
  return;
656
656
  setTimeout(() => {
657
+ if (typeof document === "undefined") return;
657
658
  const active = document.activeElement as HTMLElement | null;
658
659
  if (!active?.id || !active.id.startsWith(`${id}-`)) return;
659
660
  if (active.getAttribute("role") !== "radio") return;
@@ -4,10 +4,11 @@ import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
4
4
  import { StarIcon } from "@phosphor-icons/react";
5
5
  import { useForm } from "@tanstack/react-form";
6
6
  import { useState } from "react";
7
- import { Text, YStack } from "tamagui";
7
+ import { YStack } from "tamagui";
8
8
  import { Button } from "../../Button";
9
9
  import { Form } from "../../Form";
10
10
  import { Rating } from "./index";
11
+ import { Text } from "@multiplatform.one/theme";
11
12
 
12
13
  const meta: Meta<typeof Rating> = {
13
14
  title: "Forms/Rating",
@@ -1,9 +1,10 @@
1
1
  import { action } from "@multiplatform.one/storybook";
2
2
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
3
3
  import { useRef, useState } from "react";
4
- import { Paragraph, YStack } from "tamagui";
4
+ import { YStack } from "tamagui";
5
5
  import { Button } from "../../Button";
6
6
  import { SearchInput, type SearchInputHandle } from "./index";
7
+ import { Paragraph } from "@multiplatform.one/theme";
7
8
 
8
9
  const meta: Meta<typeof SearchInput> = {
9
10
  title: "Forms/SearchInput",
@@ -7,12 +7,8 @@ import { useTouchSurface } from "@multiplatform.one/theme";
7
7
  * native field never rings. Magnifier is not a tab stop. Clear ✕ is the
8
8
  * second focusable and rings its own glyph (chip-dismiss, LC-16).
9
9
  *
10
- * Clear is a View sized from the size-recipe square (same geometry as
11
- * Input.Button). It was hand-rolled because TButton swallows className, so
12
- * the chip-dismiss ring classes could not ride Input.Button. `glyphRing`
13
- * now exists (InputParts/index.tsx, MPO-52) and renders this exact pair, so
14
- * this block can collapse onto `<Input.Button glyphRing>` — in SearchInput's
15
- * own lane, not this one.
10
+ * Clear is Input.Action, the field's trailing action (LC-149): the
11
+ * size-recipe square, chip-dismiss glyph ring, 44pt press target.
16
12
  */
17
13
  import { MagnifyingGlassIcon, XIcon } from "@phosphor-icons/react";
18
14
  import {
@@ -24,7 +20,7 @@ import {
24
20
  import type { ComponentProps, ReactNode, Ref, RefObject } from "react";
25
21
  import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from "react";
26
22
  import type { LabelProps, SizeTokens, TamaguiElement } from "tamagui";
27
- import { View, isWeb } from "tamagui";
23
+ import { isWeb } from "tamagui";
28
24
  import { Skeleton } from "../../Skeleton";
29
25
  import { Field, FieldLayout } from "../../fieldLayout";
30
26
  import { Input as InputParts } from "../../InputParts";
@@ -364,46 +360,13 @@ function SearchInputImpl(
364
360
  onChangeText={(next: string) => writeText(next, fieldChange)}
365
361
  />
366
362
  {showClear ? (
367
- <View
368
- group={"searchClear" as unknown as undefined}
369
- role="button"
370
- tabIndex={0}
371
- aria-label={t("Clear search")}
372
- className={isWeb ? "mp-chip-dismiss" : undefined}
373
- data-end-cap={visualHeight}
374
- width={visualHeight}
375
- height={visualHeight}
376
- alignItems="center"
377
- justifyContent="center"
378
- cursor="pointer"
379
- outlineWidth={0}
380
- focusStyle={{ outlineWidth: 0 }}
381
- focusVisibleStyle={{ outlineWidth: 0 }}
382
- flexShrink={0}
383
- hitSlop={belowFloor ? pressTargetHitSlop(visualHeight) : undefined}
363
+ <InputParts.Action
364
+ size={resolvedSize}
365
+ label={t("Clear search")}
384
366
  onPress={() => clearText(fieldChange)}
385
- onKeyDown={
386
- ((e: KeyboardEvent) => {
387
- if (e.key === "Enter" || e.key === " ") {
388
- e.preventDefault();
389
- e.stopPropagation();
390
- clearText(fieldChange);
391
- }
392
- }) as unknown as () => void
393
- }
394
367
  >
395
- <View
396
- className={isWeb ? "mp-chip-dismiss-ring" : undefined}
397
- alignItems="center"
398
- justifyContent="center"
399
- hoverStyle={{ backgroundColor: "$color4" }}
400
- {...{ "$group-searchClear-press": { backgroundColor: "$color5" } }}
401
- >
402
- <InputParts.Icon aria-hidden color={formCommonColors.muted}>
403
- <XIcon size={resolvedIconSize} />
404
- </InputParts.Icon>
405
- </View>
406
- </View>
368
+ <XIcon />
369
+ </InputParts.Action>
407
370
  ) : null}
408
371
  </InputParts.Box>
409
372
  );
@@ -1,4 +1,4 @@
1
- import { transitionProps } from "@multiplatform.one/theme";
1
+ import { transitionProps, Paragraph } from "@multiplatform.one/theme";
2
2
  import React, { useState } from "react";
3
3
  import { action } from "@multiplatform.one/storybook";
4
4
  import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
@@ -6,7 +6,7 @@ import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
6
6
  import { useForm } from "@tanstack/react-form";
7
7
  import { CaretDownIcon, CaretUpIcon } from "@phosphor-icons/react";
8
8
  import { useResolvedKnobs } from "@multiplatform.one/theme";
9
- import { Paragraph, Select as TamaguiSelect, Sheet, useMedia, XStack, YStack } from "tamagui";
9
+ import { Select as TamaguiSelect, Sheet, useMedia, XStack, YStack } from "tamagui";
10
10
  import { Button } from "../../Button";
11
11
  import { useViewportGtSm } from "../../FloatingPanel";
12
12
  import { Form } from "../../Form";
@@ -21,6 +21,8 @@ import {
21
21
  useResolvedKnobs,
22
22
  wasKeyboardFocus,
23
23
  transitionProps,
24
+ Text as HouseText,
25
+ type TextProps as HouseTextProps,
24
26
  } from "@multiplatform.one/theme";
25
27
  import type { LabelProps, SizeTokens } from "tamagui";
26
28
  // `react-native` aliases to react-native-web on the web, and RNW 0.21 exports
@@ -162,18 +164,22 @@ const SelectRow = styled(View, {
162
164
  } as const,
163
165
  });
164
166
 
165
- const GroupHeader = styled(Text, {
166
- name: "SelectGroupHeader",
167
- paddingHorizontal: "$3",
168
- paddingVertical: "$2",
169
- paddingTop: "$3",
170
- fontWeight: "600",
171
- fontSize: "$2",
172
- opacity: 0.6,
173
- numberOfLines: 1,
174
- userSelect: "none",
175
- cursor: "default",
176
- });
167
+ function GroupHeader(props: HouseTextProps) {
168
+ return (
169
+ <HouseText
170
+ paddingHorizontal="$3"
171
+ paddingVertical="$2"
172
+ paddingTop="$3"
173
+ fontWeight="600"
174
+ fontSize="$2"
175
+ opacity={0.6}
176
+ numberOfLines={1}
177
+ userSelect="none"
178
+ cursor="default"
179
+ {...props}
180
+ />
181
+ );
182
+ }
177
183
 
178
184
  // ── Helper to group options ───────────────────────────────────
179
185
 
@@ -4,10 +4,11 @@ import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
4
4
  import { EraserIcon } from "@phosphor-icons/react";
5
5
  import { useForm } from "@tanstack/react-form";
6
6
  import { useState } from "react";
7
- import { Text, YStack } from "tamagui";
7
+ import { YStack } from "tamagui";
8
8
  import { Button } from "../../Button";
9
9
  import { Form } from "../../Form";
10
10
  import { Signature } from "./index";
11
+ import { Text } from "@multiplatform.one/theme";
11
12
 
12
13
  const meta: Meta<typeof Signature> = {
13
14
  title: "Forms/Signature",
@@ -2,6 +2,7 @@ import { useTouchSurface } from "@multiplatform.one/theme";
2
2
  import type { KnobProps } from "@multiplatform.one/theme";
3
3
  import {
4
4
  FIELD_FOCUS_STYLE,
5
+ edgeColorAt,
5
6
  ensureKeyboardModalityTracking,
6
7
  wasKeyboardFocus,
7
8
  transitionProps,
@@ -522,7 +523,11 @@ function SignatureCanvasImpl({
522
523
  borderRadius={cappedRadius}
523
524
  borderWidth={knobProps.borderRadius.borderWidth}
524
525
  elevation={knobProps.elevation}
525
- borderColor={error ? formCommonColors.error : formInputColors.border.base}
526
+ borderColor={
527
+ error
528
+ ? formCommonColors.error
529
+ : edgeColorAt(formInputColors.border.base, knobProps.borderWidthStop)
530
+ }
526
531
  aspectRatio={aspectRatio}
527
532
  minHeight={minHeightPx}
528
533
  cursor={cursor}
@@ -3,10 +3,11 @@ import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
3
3
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
4
4
  import { useForm } from "@tanstack/react-form";
5
5
  import { useState } from "react";
6
- import { Paragraph, Slider as TamaguiSlider, Text, XStack, YStack } from "tamagui";
6
+ import { Slider as TamaguiSlider, XStack, YStack } from "tamagui";
7
7
  import { Button } from "../../Button";
8
8
  import { Form } from "../../Form";
9
9
  import { Slider } from "./index";
10
+ import { Paragraph, Text } from "@multiplatform.one/theme";
10
11
 
11
12
  const meta: Meta<typeof Slider> = {
12
13
  title: "Forms/Slider",
@@ -1,5 +1,10 @@
1
1
  import { transitionOrInstant } from "../../shared/instantMotion";
2
- import { transitionProps, motionRoleProperties, motionSettleMs } from "@multiplatform.one/theme";
2
+ import {
3
+ transitionProps,
4
+ motionRoleProperties,
5
+ motionSettleMs,
6
+ Paragraph,
7
+ } from "@multiplatform.one/theme";
3
8
  import { useTouchSurface, isTouchSurface } from "@multiplatform.one/theme";
4
9
  import { useEffect, useRef, useState, type KeyboardEvent, type ReactNode } from "react";
5
10
  import type { AnyFormApi } from "../../types";
@@ -7,7 +12,6 @@ import type { LabelProps, SizeTokens } from "tamagui";
7
12
  import {
8
13
  type SliderProps as TamaguiSliderProps,
9
14
  Slider as TamaguiSlider,
10
- Paragraph,
11
15
  View,
12
16
  XStack,
13
17
  isWeb,
@@ -4,10 +4,11 @@ import type { GuardrailSpecimenParameter } from "@multiplatform.one/theme";
4
4
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
5
5
  import { useForm } from "@tanstack/react-form";
6
6
  import { useState } from "react";
7
- import { Paragraph, YStack } from "tamagui";
7
+ import { YStack } from "tamagui";
8
8
  import { Button } from "../../Button";
9
9
  import { Form } from "../../Form";
10
10
  import { Stepper } from "./index";
11
+ import { Paragraph } from "@multiplatform.one/theme";
11
12
 
12
13
  const meta: Meta<typeof Stepper> = {
13
14
  title: "Forms/Stepper",
@@ -4,10 +4,12 @@ import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
4
4
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
5
5
  import { useForm } from "@tanstack/react-form";
6
6
  import { useState } from "react";
7
- import { Label, Paragraph, Switch as TamaguiSwitch, XStack, YStack } from "tamagui";
7
+ import { Switch as TamaguiSwitch, XStack, YStack } from "tamagui";
8
+ import { Label } from "../../Label";
8
9
  import { Button } from "../../Button";
9
10
  import { Form } from "../../Form";
10
11
  import { Switch } from "./index";
12
+ import { Paragraph } from "@multiplatform.one/theme";
11
13
 
12
14
  const meta: Meta<typeof Switch> = {
13
15
  title: "Forms/Switch",
@@ -3,10 +3,11 @@ import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
3
3
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
4
4
  import { useForm } from "@tanstack/react-form";
5
5
  import { useState } from "react";
6
- import { Paragraph, TextArea as TamaguiTextArea, XStack, YStack } from "tamagui";
6
+ import { TextArea as TamaguiTextArea, XStack, YStack } from "tamagui";
7
7
  import { Button } from "../../Button";
8
8
  import { Form } from "../../Form";
9
9
  import { TextArea } from "./index";
10
+ import { Paragraph } from "@multiplatform.one/theme";
10
11
 
11
12
  const meta: Meta<typeof TextArea> = {
12
13
  title: "Forms/TextArea",
@@ -3,10 +3,11 @@ import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
3
3
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
4
4
  import { useForm } from "@tanstack/react-form";
5
5
  import { useState } from "react";
6
- import { Text, YStack } from "tamagui";
6
+ import { YStack } from "tamagui";
7
7
  import { Button } from "../../Button";
8
8
  import { Form } from "../../Form";
9
9
  import { TimePicker } from "./index";
10
+ import { Text } from "@multiplatform.one/theme";
10
11
 
11
12
  const meta: Meta<typeof TimePicker> = {
12
13
  title: "Forms/TimePicker",
@@ -98,19 +98,15 @@ export function TimePickerClearButton({
98
98
  disabled?: boolean;
99
99
  }) {
100
100
  return (
101
- <InputParts.Button
101
+ <InputParts.Action
102
102
  data-testid="time-picker-clear"
103
- aria-label={t("Clear time")}
103
+ label={t("Clear time")}
104
104
  disabled={disabled}
105
- onPress={(e) => {
106
- e.stopPropagation();
107
- onClear();
108
- }}
105
+ tabIndex={-1}
106
+ onPress={onClear}
109
107
  >
110
- <InputParts.Icon>
111
- <XIcon />
112
- </InputParts.Icon>
113
- </InputParts.Button>
108
+ <XIcon />
109
+ </InputParts.Action>
114
110
  );
115
111
  }
116
112
 
@@ -1,4 +1,4 @@
1
- import { transitionProps, motionRoleProperties } from "@multiplatform.one/theme";
1
+ import { transitionProps, motionRoleProperties, Text } from "@multiplatform.one/theme";
2
2
  import {
3
3
  defaultKnobs,
4
4
  ensureFocusVisibleRing,
@@ -7,6 +7,7 @@ import {
7
7
  formatAbsoluteDateTime,
8
8
  pressTargetHitSlop,
9
9
  usePresetContext,
10
+ useResolvedKnobs,
10
11
  wasKeyboardFocus,
11
12
  type BorderRadius,
12
13
  } from "@multiplatform.one/theme";
@@ -20,7 +21,7 @@ import {
20
21
  type ReactNode,
21
22
  } from "react";
22
23
  import type { LabelProps, SizeTokens } from "tamagui";
23
- import { Text, View, XStack, YStack, isWeb, useTheme } from "tamagui";
24
+ import { Text as TamaguiText, View, XStack, YStack, isWeb, useTheme } from "tamagui";
24
25
  import { Field, FieldLayout } from "../../fieldLayout";
25
26
  import { FloatingPanel } from "../../FloatingPanel";
26
27
  import { Skeleton } from "../../Skeleton";
@@ -178,13 +179,15 @@ function TimeRangeChip({
178
179
  part?: string;
179
180
  tabIndex?: number;
180
181
  }) {
182
+ const { knobProps } = useResolvedKnobs();
183
+ const edge = knobProps.controlBorderOutlined;
181
184
  return (
182
185
  <View
183
186
  height={CHIP_HEIGHT}
184
187
  paddingHorizontal={7}
185
188
  borderRadius={CHIP_RADIUS}
186
- borderWidth={1}
187
- borderColor={selected ? "$color11" : "$borderColor"}
189
+ borderWidth={edge.borderWidth}
190
+ borderColor={selected ? "$color11" : edge.borderColor}
188
191
  backgroundColor={selected ? "$color11" : "transparent"}
189
192
  justifyContent="center"
190
193
  alignItems="center"
@@ -197,14 +200,14 @@ function TimeRangeChip({
197
200
  onPress={disabled ? undefined : onPress}
198
201
  hoverStyle={disabled ? undefined : { borderColor: "$borderColorHover" }}
199
202
  >
200
- <Text
203
+ <TamaguiText
201
204
  fontSize={12}
202
205
  lineHeight={22}
203
206
  color={selected ? "$color1" : "$color11"}
204
207
  fontFamily="$body"
205
208
  >
206
209
  {label}
207
- </Text>
210
+ </TamaguiText>
208
211
  </View>
209
212
  );
210
213
  }
@@ -262,6 +265,7 @@ function TimeRangeScrubberControl({
262
265
  }) {
263
266
  if (isWeb) ensureKeyboardModalityTracking();
264
267
  const radiusStop = useRadiusStop();
268
+ const { knobProps } = useResolvedKnobs();
265
269
  const theme = useTheme();
266
270
  const reducedMotion = !transitionToken;
267
271
  const gripSize = getScrubberGripRenderSize(size != null ? String(size) : sizeToken);
@@ -564,7 +568,7 @@ function TimeRangeScrubberControl({
564
568
  opacity={disabled ? 0.5 : 1}
565
569
  >
566
570
  <XStack alignItems="baseline" gap="$3" justifyContent="flex-end" flexWrap="wrap">
567
- <Text
571
+ <TamaguiText
568
572
  fontFamily="$mono"
569
573
  fontSize={12}
570
574
  lineHeight={22}
@@ -574,9 +578,9 @@ function TimeRangeScrubberControl({
574
578
  data-end={value?.end?.toISOString() ?? ""}
575
579
  >
576
580
  {formatRangeReadout(value)}
577
- </Text>
581
+ </TamaguiText>
578
582
  {frameAt ? (
579
- <Text
583
+ <TamaguiText
580
584
  fontFamily="$mono"
581
585
  fontSize={12}
582
586
  lineHeight={22}
@@ -584,7 +588,7 @@ function TimeRangeScrubberControl({
584
588
  data-part="frame-stale"
585
589
  >
586
590
  {`${t("frame")} −${frameStale}`}
587
- </Text>
591
+ </TamaguiText>
588
592
  ) : null}
589
593
  </XStack>
590
594
  <XStack alignItems="center" gap={7}>
@@ -594,8 +598,7 @@ function TimeRangeScrubberControl({
594
598
  alignItems="center"
595
599
  justifyContent="center"
596
600
  borderRadius={CHIP_RADIUS}
597
- borderWidth={1}
598
- borderColor="$borderColor"
601
+ {...knobProps.controlBorderOutlined}
599
602
  cursor={locked ? "not-allowed" : "pointer"}
600
603
  tabIndex={-1}
601
604
  role="button"
@@ -611,8 +614,7 @@ function TimeRangeScrubberControl({
611
614
  alignItems="center"
612
615
  justifyContent="center"
613
616
  borderRadius={CHIP_RADIUS}
614
- borderWidth={1}
615
- borderColor="$borderColor"
617
+ {...knobProps.controlBorderOutlined}
616
618
  cursor={locked ? "not-allowed" : "pointer"}
617
619
  tabIndex={-1}
618
620
  role="button"
@@ -648,13 +650,13 @@ function TimeRangeScrubberControl({
648
650
  overflow="hidden"
649
651
  maxHeight={CAP_HEIGHT}
650
652
  borderRadius={CAP_RADIUS}
651
- borderWidth={1}
652
- borderColor="$borderColor"
653
+ borderWidth={knobProps.surface.borderWidth}
654
+ borderColor={knobProps.surface.borderColor}
653
655
  backgroundColor="$color2"
654
656
  onLayout={(event) => setCapWidth(event.nativeEvent.layout.width)}
655
657
  data-part="cap"
656
658
  >
657
- <Text
659
+ <TamaguiText
658
660
  fontFamily="$mono"
659
661
  fontSize={12}
660
662
  lineHeight={16}
@@ -664,7 +666,7 @@ function TimeRangeScrubberControl({
664
666
  whiteSpace="nowrap"
665
667
  >
666
668
  {formatClock(scrubTime)}
667
- </Text>
669
+ </TamaguiText>
668
670
  </View>
669
671
  </XStack>
670
672
  <View position="relative" height={AXIS_BAND} data-part="frames-lane">
@@ -2,17 +2,11 @@ import { action } from "@multiplatform.one/storybook";
2
2
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
3
3
  import { useForm } from "@tanstack/react-form";
4
4
  import { useState } from "react";
5
- import {
6
- Paragraph,
7
- SizableText,
8
- Text,
9
- ToggleGroup as TamaguiToggleGroup,
10
- XStack,
11
- YStack,
12
- } from "tamagui";
5
+ import { ToggleGroup as TamaguiToggleGroup, XStack, YStack } from "tamagui";
13
6
  import { Button } from "../../Button";
14
7
  import { Form } from "../../Form";
15
8
  import { ToggleGroup } from "./index";
9
+ import { Paragraph, SizableText, Text } from "@multiplatform.one/theme";
16
10
 
17
11
  const meta: Meta<typeof ToggleGroup> = {
18
12
  title: "Forms/ToggleGroup",
@@ -1,5 +1,5 @@
1
1
  import { IconSlot } from "@multiplatform.one/theme";
2
- import { motionDurationMs } from "@multiplatform.one/theme";
2
+ import { motionDurationMs, SizableText } from "@multiplatform.one/theme";
3
3
  import { cssAnimationConfig } from "@multiplatform.one/theme";
4
4
  import { transitionProps } from "@multiplatform.one/theme";
5
5
  import type { ReactNode } from "react";
@@ -16,7 +16,13 @@ import {
16
16
  } from "@multiplatform.one/theme";
17
17
  import type { AnyFormApi } from "../../types";
18
18
  import type { LabelProps, SizeTokens } from "tamagui";
19
- import { SizableText, ToggleGroup as TamaguiToggleGroup, View, isWeb, styled } from "tamagui";
19
+ import {
20
+ SizableText as TamaguiSizableText,
21
+ ToggleGroup as TamaguiToggleGroup,
22
+ View,
23
+ isWeb,
24
+ styled,
25
+ } from "tamagui";
20
26
  import { Skeleton } from "../../Skeleton";
21
27
  import { Field, FieldLayout } from "../../fieldLayout";
22
28
  import {
@@ -472,7 +478,7 @@ export function ToggleGroup({
472
478
  : undefined
473
479
  }
474
480
  />
475
- <SizableText
481
+ <TamaguiSizableText
476
482
  userSelect="none"
477
483
  {...knobProps.controlType}
478
484
  {...knobProps.body}
@@ -483,7 +489,7 @@ export function ToggleGroup({
483
489
  focusStyle={text.focusKnobProps}
484
490
  >
485
491
  {option.label}
486
- </SizableText>
492
+ </TamaguiSizableText>
487
493
  {showSeam ? (
488
494
  <View
489
495
  pointerEvents="none"
@@ -12,8 +12,8 @@
12
12
  */
13
13
  import { useCallback, useState } from "react";
14
14
  import { Modal, Pressable, StyleSheet, useColorScheme, Platform } from "react-native";
15
- import { useResolvedKnobs } from "@multiplatform.one/theme";
16
- import { Text, View, XStack, YStack, useTheme, useThemeName } from "tamagui";
15
+ import { useResolvedKnobs, Text } from "@multiplatform.one/theme";
16
+ import { View, XStack, YStack, useTheme, useThemeName } from "tamagui";
17
17
  import { formCommonColors } from "../../shared/colorRamps";
18
18
  import { t } from "../../shared/t";
19
19
  import { type DateTimePickerEvent, loadDateTimePicker } from "./dateTimePickerLoader";
@@ -79,7 +79,9 @@ describe("sheet picker pointer activation", () => {
79
79
  expect(clear.className).not.toContain("_miw-44px");
80
80
  expect(clear.className).not.toContain("_mih-44px");
81
81
  expect(clear.className).toContain("_w-37px");
82
- expect(clear.getAttribute("data-mp-press-slop")).toBe("2");
82
+ expect(clear.className).toContain("_h-37px");
83
+ expect(clear.getAttribute("data-field-action")).toBe("trailing");
84
+ expect(clear.getAttribute("data-mp-press-slop")).toBe("4");
83
85
  fireEvent.click(clear, { detail: 1 });
84
86
  await waitFor(() => expect(result.getByText("Selected:none")).toBeTruthy());
85
87
  expect(result.getByRole("combobox", { name: "Choice" }).getAttribute("aria-expanded")).toBe(
@@ -95,9 +97,11 @@ it("desktop clear retains compact geometry and never opens on pointer down or cl
95
97
  const clear = result.getByRole("button", { name: "Clear" });
96
98
  expect(trigger.className).toContain("_h-37px");
97
99
  expect(clear.className).toContain("_h-37px");
98
- expect(clear.className).toContain("_miw-44px");
100
+ expect(clear.className).toContain("_w-37px");
101
+ expect(clear.getAttribute("data-field-action")).toBe("trailing");
102
+ // LC-149: a square glyph inside the field, padded to 44 on both axes.
99
103
  expect(clear.getAttribute("data-mp-press-slop")).toBe("4");
100
- expect(clear.getAttribute("data-mp-press-axis")).toBe("vertical");
104
+ expect(clear.getAttribute("data-mp-press-axis")).toBeNull();
101
105
  fireEvent.mouseDown(clear, { detail: 1 });
102
106
  expect(trigger.getAttribute("aria-expanded")).toBe("false");
103
107
  fireEvent.mouseUp(clear, { detail: 1 });
@@ -26,7 +26,8 @@ export function focusFieldTarget(
26
26
  if (!isWeb || !container) return null;
27
27
 
28
28
  const tryFocus = (el: Element | null | undefined): HTMLElement | null => {
29
- if (!el || !(el instanceof HTMLElement) || typeof el.focus !== "function") return null;
29
+ if (!el || typeof HTMLElement === "undefined" || !(el instanceof HTMLElement)) return null;
30
+ if (typeof el.focus !== "function") return null;
30
31
  // Prefer a nested focusable control when the match is a wrapper.
31
32
  const nested = el.matches?.(
32
33
  "input, textarea, select, button, [tabindex]:not([tabindex='-1']), [contenteditable='true']",
@@ -298,7 +299,7 @@ export function useFocusManagement(options: FocusManagementOptions = {}): FocusM
298
299
  if (initialFocus === "first") {
299
300
  const firstElement = getFocusableElements()[0];
300
301
  if (firstElement) focusElement(firstElement);
301
- } else if (initialFocus instanceof HTMLElement) {
302
+ } else if (typeof HTMLElement !== "undefined" && initialFocus instanceof HTMLElement) {
302
303
  focusElement(initialFocus);
303
304
  }
304
305
  }, autoFocusDelay);
package/src/index.ts CHANGED
@@ -348,6 +348,15 @@ export {
348
348
  KEYBOARD_TO_INPUT_MODE,
349
349
  INPUT_MODE_TO_KEYBOARD,
350
350
  } from "./InputParts";
351
+ export type { InputActionProps } from "./InputParts";
352
+ export { FieldTrailingOverlay } from "./InputParts";
353
+ export {
354
+ PasswordReveal,
355
+ usePasswordReveal,
356
+ SHOW_PASSWORD,
357
+ HIDE_PASSWORD,
358
+ } from "./InputParts/PasswordReveal";
359
+ export type { PasswordRevealProps } from "./InputParts/PasswordReveal";
351
360
 
352
361
  export { useControlGrouped } from "./shared/groupContext";
353
362
 
@@ -217,7 +217,7 @@ export function useDialogShowFocus(onOpenAutoFocus: (event: Event) => void) {
217
217
  if (!open || !contentId || !canUseDom()) return;
218
218
  const content = document.getElementById(contentId);
219
219
  const focused = document.activeElement;
220
- if (!content || !(focused instanceof HTMLElement)) return;
220
+ if (!content || typeof HTMLElement === "undefined" || !(focused instanceof HTMLElement)) return;
221
221
  if (!content.contains(focused) || focused.tabIndex >= 0) return;
222
222
  content.addEventListener(DIALOG_SHOW_FOCUS_EVENT, onOpenAutoFocus, { once: true });
223
223
  content.dispatchEvent(new CustomEvent(DIALOG_SHOW_FOCUS_EVENT, { cancelable: true }));
@@ -18,7 +18,8 @@ export function registerPanelPortal(portal: Element, anchor: Element): () => voi
18
18
 
19
19
  /** The element that opened the portaled panel `node` sits in, or null. */
20
20
  export function panelPortalAnchor(node: Node): Element | null {
21
- const element = node instanceof Element ? node : node.parentElement;
21
+ const element =
22
+ typeof Element !== "undefined" && node instanceof Element ? node : node.parentElement;
22
23
  const portal = element?.closest(`[${panelPortalAttribute}]`);
23
24
  return portal ? (anchors.get(portal) ?? null) : null;
24
25
  }