react-native-platform-components 1.3.0 → 1.5.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 (636) hide show
  1. package/PlatformComponents.podspec +1 -1
  2. package/README.md +47 -51
  3. package/android/src/main/java/com/platformcomponents/PCButtonGroupView.kt +664 -0
  4. package/android/src/main/java/com/platformcomponents/PCButtonGroupViewManager.kt +241 -0
  5. package/android/src/main/java/com/platformcomponents/PCButtonSupport.kt +159 -0
  6. package/android/src/main/java/com/platformcomponents/PCButtonView.kt +527 -0
  7. package/android/src/main/java/com/platformcomponents/PCButtonViewManager.kt +204 -0
  8. package/android/src/main/java/com/platformcomponents/PCContextMenuView.kt +41 -151
  9. package/android/src/main/java/com/platformcomponents/PCContextMenuViewManager.kt +7 -63
  10. package/android/src/main/java/com/platformcomponents/PCDatePickerView.kt +310 -115
  11. package/android/src/main/java/com/platformcomponents/PCDatePickerViewManager.kt +23 -3
  12. package/android/src/main/java/com/platformcomponents/PCExpressive.kt +112 -0
  13. package/android/src/main/java/com/platformcomponents/PCFloatingActionButtonView.kt +485 -0
  14. package/android/src/main/java/com/platformcomponents/PCFloatingActionButtonViewManager.kt +109 -0
  15. package/android/src/main/java/com/platformcomponents/PCFloatingToolbarView.kt +247 -0
  16. package/android/src/main/java/com/platformcomponents/PCFloatingToolbarViewManager.kt +73 -0
  17. package/android/src/main/java/com/platformcomponents/PCHaptics.kt +46 -0
  18. package/android/src/main/java/com/platformcomponents/PCImageLoader.kt +42 -7
  19. package/android/src/main/java/com/platformcomponents/PCLiquidGlassContainerView.kt +32 -0
  20. package/android/src/main/java/com/platformcomponents/PCLiquidGlassContainerViewManager.kt +31 -0
  21. package/android/src/main/java/com/platformcomponents/PCLiquidGlassView.kt +32 -6
  22. package/android/src/main/java/com/platformcomponents/PCLiquidGlassViewManager.kt +4 -0
  23. package/android/src/main/java/com/platformcomponents/PCMenuSupport.kt +280 -0
  24. package/android/src/main/java/com/platformcomponents/PCNavigationBarSupport.kt +332 -0
  25. package/android/src/main/java/com/platformcomponents/PCNavigationRailView.kt +448 -0
  26. package/android/src/main/java/com/platformcomponents/PCNavigationRailViewManager.kt +176 -0
  27. package/android/src/main/java/com/platformcomponents/PCSegmentedControlView.kt +35 -17
  28. package/android/src/main/java/com/platformcomponents/PCSegmentedControlViewManager.kt +20 -3
  29. package/android/src/main/java/com/platformcomponents/PCSelectionMenuView.kt +371 -39
  30. package/android/src/main/java/com/platformcomponents/PCSelectionMenuViewManager.kt +18 -4
  31. package/android/src/main/java/com/platformcomponents/PCTabBarView.kt +397 -0
  32. package/android/src/main/java/com/platformcomponents/PCTabBarViewManager.kt +182 -0
  33. package/android/src/main/java/com/platformcomponents/PCTextFieldView.kt +1393 -0
  34. package/android/src/main/java/com/platformcomponents/PCTextFieldViewManager.kt +354 -0
  35. package/android/src/main/java/com/platformcomponents/PCThemeSupport.kt +37 -0
  36. package/android/src/main/java/com/platformcomponents/PlatformComponentsPackage.kt +8 -0
  37. package/android/src/main/res/drawable/pc_ic_search.xml +12 -0
  38. package/android/src/main/res/values/attrs.xml +13 -0
  39. package/android/src/main/res/values/ids.xml +5 -0
  40. package/android/src/main/res/values/styles.xml +207 -0
  41. package/ios/PCButton.h +10 -0
  42. package/ios/PCButton.mm +311 -0
  43. package/ios/PCButtonGroup.h +10 -0
  44. package/ios/PCButtonGroup.mm +323 -0
  45. package/ios/PCButtonGroupView.swift +473 -0
  46. package/ios/PCButtonSupport.swift +312 -0
  47. package/ios/PCButtonView.swift +438 -0
  48. package/ios/PCConstants.swift +23 -2
  49. package/ios/PCContextMenu.mm +28 -110
  50. package/ios/PCContextMenu.swift +106 -167
  51. package/ios/PCDatePicker.mm +21 -9
  52. package/ios/PCDatePickerView.swift +94 -20
  53. package/ios/PCFloatingActionButton.h +10 -0
  54. package/ios/PCFloatingActionButton.mm +177 -0
  55. package/ios/PCFloatingActionButtonView.swift +426 -0
  56. package/ios/PCFloatingToolbar.h +10 -0
  57. package/ios/PCFloatingToolbar.mm +103 -0
  58. package/ios/PCFloatingToolbarView.swift +336 -0
  59. package/ios/PCHaptics.swift +91 -0
  60. package/ios/PCImageLoader.swift +76 -12
  61. package/ios/PCLiquidGlass.mm +36 -0
  62. package/ios/PCLiquidGlass.swift +221 -114
  63. package/ios/PCLiquidGlassContainer.h +10 -0
  64. package/ios/PCLiquidGlassContainer.mm +84 -0
  65. package/ios/PCLiquidGlassContainer.swift +69 -0
  66. package/ios/PCMenuItems.h +76 -0
  67. package/ios/PCMenuSupport.swift +350 -0
  68. package/ios/PCNavigationRail.h +10 -0
  69. package/ios/PCNavigationRail.mm +270 -0
  70. package/ios/PCNavigationRailView.swift +415 -0
  71. package/ios/PCSegmentedControl.mm +17 -2
  72. package/ios/PCSegmentedControl.swift +57 -7
  73. package/ios/PCSelectionMenu.mm +36 -8
  74. package/ios/PCSelectionMenu.swift +224 -48
  75. package/ios/PCTabBar.h +10 -0
  76. package/ios/PCTabBar.mm +285 -0
  77. package/ios/PCTabBarAccessory.h +10 -0
  78. package/ios/PCTabBarAccessory.mm +93 -0
  79. package/ios/PCTabBarAccessoryView.swift +96 -0
  80. package/ios/PCTabBarView.swift +671 -0
  81. package/ios/PCTextField.h +10 -0
  82. package/ios/PCTextField.mm +546 -0
  83. package/ios/PCTextFieldView.swift +1558 -0
  84. package/lib/commonjs/Button.js +149 -0
  85. package/lib/commonjs/Button.js.map +1 -0
  86. package/lib/commonjs/ButtonGroup.js +109 -0
  87. package/lib/commonjs/ButtonGroup.js.map +1 -0
  88. package/lib/commonjs/ButtonGroupNativeComponent.ts +191 -0
  89. package/lib/commonjs/ButtonNativeComponent.ts +192 -0
  90. package/lib/commonjs/ContextMenu.js +9 -48
  91. package/lib/commonjs/ContextMenu.js.map +1 -1
  92. package/lib/commonjs/ContextMenuNativeComponent.ts +47 -49
  93. package/lib/commonjs/DatePicker.js +98 -2
  94. package/lib/commonjs/DatePicker.js.map +1 -1
  95. package/lib/commonjs/DatePickerNativeComponent.ts +19 -2
  96. package/lib/commonjs/FloatingActionButton.js +60 -0
  97. package/lib/commonjs/FloatingActionButton.js.map +1 -0
  98. package/lib/commonjs/FloatingActionButtonNativeComponent.ts +58 -0
  99. package/lib/commonjs/FloatingToolbar.js +77 -0
  100. package/lib/commonjs/FloatingToolbar.js.map +1 -0
  101. package/lib/commonjs/FloatingToolbarNativeComponent.ts +47 -0
  102. package/lib/commonjs/LiquidGlass.js +7 -1
  103. package/lib/commonjs/LiquidGlass.js.map +1 -1
  104. package/lib/commonjs/LiquidGlassContainer.js +32 -0
  105. package/lib/commonjs/LiquidGlassContainer.js.map +1 -0
  106. package/lib/commonjs/LiquidGlassContainerNativeComponent.ts +17 -0
  107. package/lib/commonjs/LiquidGlassNativeComponent.ts +8 -0
  108. package/lib/commonjs/NavigationRail.js +104 -0
  109. package/lib/commonjs/NavigationRail.js.map +1 -0
  110. package/lib/commonjs/NavigationRailNativeComponent.ts +107 -0
  111. package/lib/commonjs/PlatformComponentsProvider.js +18 -0
  112. package/lib/commonjs/PlatformComponentsProvider.js.map +1 -0
  113. package/lib/commonjs/SegmentedControl.js +18 -85
  114. package/lib/commonjs/SegmentedControl.js.map +1 -1
  115. package/lib/commonjs/SegmentedControlNativeComponent.ts +14 -0
  116. package/lib/commonjs/SelectionMenu.js +27 -3
  117. package/lib/commonjs/SelectionMenu.js.map +1 -1
  118. package/lib/commonjs/SelectionMenuNativeComponent.ts +26 -4
  119. package/lib/commonjs/SplitButton.js +98 -0
  120. package/lib/commonjs/SplitButton.js.map +1 -0
  121. package/lib/commonjs/TabBar.js +203 -0
  122. package/lib/commonjs/TabBar.js.map +1 -0
  123. package/lib/commonjs/TabBarAccessoryNativeComponent.ts +19 -0
  124. package/lib/commonjs/TabBarNativeComponent.ts +145 -0
  125. package/lib/commonjs/TextField.js +358 -0
  126. package/lib/commonjs/TextField.js.map +1 -0
  127. package/lib/commonjs/TextFieldNativeComponent.ts +324 -0
  128. package/lib/commonjs/focusRegistry.js +79 -0
  129. package/lib/commonjs/focusRegistry.js.map +1 -0
  130. package/lib/commonjs/haptics.js +2 -0
  131. package/lib/commonjs/haptics.js.map +1 -0
  132. package/lib/commonjs/icons.js +106 -0
  133. package/lib/commonjs/icons.js.map +1 -0
  134. package/lib/commonjs/index.js +143 -0
  135. package/lib/commonjs/index.js.map +1 -1
  136. package/lib/commonjs/index.web.js +157 -63
  137. package/lib/commonjs/index.web.js.map +1 -1
  138. package/lib/commonjs/jest.js +910 -0
  139. package/lib/commonjs/jest.js.map +1 -0
  140. package/lib/commonjs/labelStyle.js +27 -0
  141. package/lib/commonjs/labelStyle.js.map +1 -0
  142. package/lib/commonjs/menuItems.js +68 -0
  143. package/lib/commonjs/menuItems.js.map +1 -0
  144. package/lib/commonjs/reactNativeInternals.d.js +2 -0
  145. package/lib/commonjs/reactNativeInternals.d.js.map +1 -0
  146. package/lib/commonjs/selectionIdentifiers.js +18 -0
  147. package/lib/commonjs/selectionIdentifiers.js.map +1 -0
  148. package/lib/commonjs/submitBehavior.js +19 -0
  149. package/lib/commonjs/submitBehavior.js.map +1 -0
  150. package/lib/commonjs/tabItems.js +49 -0
  151. package/lib/commonjs/tabItems.js.map +1 -0
  152. package/lib/commonjs/web/Button.js +170 -0
  153. package/lib/commonjs/web/Button.js.map +1 -0
  154. package/lib/commonjs/web/ButtonGroup.js +119 -0
  155. package/lib/commonjs/web/ButtonGroup.js.map +1 -0
  156. package/lib/commonjs/web/DatePicker.js +168 -0
  157. package/lib/commonjs/web/DatePicker.js.map +1 -0
  158. package/lib/commonjs/web/DateRangePicker.js +137 -0
  159. package/lib/commonjs/web/DateRangePicker.js.map +1 -0
  160. package/lib/commonjs/web/Dialog.js +54 -0
  161. package/lib/commonjs/web/Dialog.js.map +1 -0
  162. package/lib/commonjs/web/FloatingActionButton.js +98 -0
  163. package/lib/commonjs/web/FloatingActionButton.js.map +1 -0
  164. package/lib/commonjs/web/Icon.js +34 -0
  165. package/lib/commonjs/web/Icon.js.map +1 -0
  166. package/lib/commonjs/web/NativeTheme.js +28 -0
  167. package/lib/commonjs/web/NativeTheme.js.map +1 -0
  168. package/lib/commonjs/web/NavigationRail.js +139 -0
  169. package/lib/commonjs/web/NavigationRail.js.map +1 -0
  170. package/lib/commonjs/web/PlatformComponentsProvider.js +51 -0
  171. package/lib/commonjs/web/PlatformComponentsProvider.js.map +1 -0
  172. package/lib/commonjs/web/SegmentedControl.js +117 -0
  173. package/lib/commonjs/web/SegmentedControl.js.map +1 -0
  174. package/lib/commonjs/web/SelectionMenu.js +142 -0
  175. package/lib/commonjs/web/SelectionMenu.js.map +1 -0
  176. package/lib/commonjs/web/SplitButton.js +35 -0
  177. package/lib/commonjs/web/SplitButton.js.map +1 -0
  178. package/lib/commonjs/web/TabBar.js +131 -0
  179. package/lib/commonjs/web/TabBar.js.map +1 -0
  180. package/lib/commonjs/web/TextField.js +322 -0
  181. package/lib/commonjs/web/TextField.js.map +1 -0
  182. package/lib/commonjs/web/components.js +36 -0
  183. package/lib/commonjs/web/components.js.map +1 -0
  184. package/lib/commonjs/web/containers.js +121 -0
  185. package/lib/commonjs/web/containers.js.map +1 -0
  186. package/lib/commonjs/web/dateInput.js +116 -0
  187. package/lib/commonjs/web/dateInput.js.map +1 -0
  188. package/lib/commonjs/web/shared.js +192 -0
  189. package/lib/commonjs/web/shared.js.map +1 -0
  190. package/lib/commonjs/webComponents.js +6 -0
  191. package/lib/commonjs/webComponents.js.map +1 -0
  192. package/lib/module/Button.js +142 -0
  193. package/lib/module/Button.js.map +1 -0
  194. package/lib/module/ButtonGroup.js +102 -0
  195. package/lib/module/ButtonGroup.js.map +1 -0
  196. package/lib/module/ButtonGroupNativeComponent.ts +191 -0
  197. package/lib/module/ButtonNativeComponent.ts +192 -0
  198. package/lib/module/ContextMenu.js +9 -48
  199. package/lib/module/ContextMenu.js.map +1 -1
  200. package/lib/module/ContextMenuNativeComponent.ts +47 -49
  201. package/lib/module/DatePicker.js +98 -4
  202. package/lib/module/DatePicker.js.map +1 -1
  203. package/lib/module/DatePickerNativeComponent.ts +19 -2
  204. package/lib/module/FloatingActionButton.js +53 -0
  205. package/lib/module/FloatingActionButton.js.map +1 -0
  206. package/lib/module/FloatingActionButtonNativeComponent.ts +58 -0
  207. package/lib/module/FloatingToolbar.js +70 -0
  208. package/lib/module/FloatingToolbar.js.map +1 -0
  209. package/lib/module/FloatingToolbarNativeComponent.ts +47 -0
  210. package/lib/module/LiquidGlass.js +7 -1
  211. package/lib/module/LiquidGlass.js.map +1 -1
  212. package/lib/module/LiquidGlassContainer.js +26 -0
  213. package/lib/module/LiquidGlassContainer.js.map +1 -0
  214. package/lib/module/LiquidGlassContainerNativeComponent.ts +17 -0
  215. package/lib/module/LiquidGlassNativeComponent.ts +8 -0
  216. package/lib/module/NavigationRail.js +99 -0
  217. package/lib/module/NavigationRail.js.map +1 -0
  218. package/lib/module/NavigationRailNativeComponent.ts +107 -0
  219. package/lib/module/PlatformComponentsProvider.js +13 -0
  220. package/lib/module/PlatformComponentsProvider.js.map +1 -0
  221. package/lib/module/SegmentedControl.js +18 -85
  222. package/lib/module/SegmentedControl.js.map +1 -1
  223. package/lib/module/SegmentedControlNativeComponent.ts +14 -0
  224. package/lib/module/SelectionMenu.js +27 -3
  225. package/lib/module/SelectionMenu.js.map +1 -1
  226. package/lib/module/SelectionMenuNativeComponent.ts +26 -4
  227. package/lib/module/SplitButton.js +91 -0
  228. package/lib/module/SplitButton.js.map +1 -0
  229. package/lib/module/TabBar.js +196 -0
  230. package/lib/module/TabBar.js.map +1 -0
  231. package/lib/module/TabBarAccessoryNativeComponent.ts +19 -0
  232. package/lib/module/TabBarNativeComponent.ts +145 -0
  233. package/lib/module/TextField.js +352 -0
  234. package/lib/module/TextField.js.map +1 -0
  235. package/lib/module/TextFieldNativeComponent.ts +324 -0
  236. package/lib/module/focusRegistry.js +75 -0
  237. package/lib/module/focusRegistry.js.map +1 -0
  238. package/lib/module/haptics.js +2 -0
  239. package/lib/module/haptics.js.map +1 -0
  240. package/lib/module/icons.js +101 -0
  241. package/lib/module/icons.js.map +1 -0
  242. package/lib/module/index.js +13 -0
  243. package/lib/module/index.js.map +1 -1
  244. package/lib/module/index.web.js +12 -59
  245. package/lib/module/index.web.js.map +1 -1
  246. package/lib/module/jest.js +840 -0
  247. package/lib/module/jest.js.map +1 -0
  248. package/lib/module/labelStyle.js +23 -0
  249. package/lib/module/labelStyle.js.map +1 -0
  250. package/lib/module/menuItems.js +65 -0
  251. package/lib/module/menuItems.js.map +1 -0
  252. package/lib/module/reactNativeInternals.d.js +2 -0
  253. package/lib/module/reactNativeInternals.d.js.map +1 -0
  254. package/lib/module/selectionIdentifiers.js +14 -0
  255. package/lib/module/selectionIdentifiers.js.map +1 -0
  256. package/lib/module/submitBehavior.js +15 -0
  257. package/lib/module/submitBehavior.js.map +1 -0
  258. package/lib/module/tabItems.js +45 -0
  259. package/lib/module/tabItems.js.map +1 -0
  260. package/lib/module/web/Button.js +164 -0
  261. package/lib/module/web/Button.js.map +1 -0
  262. package/lib/module/web/ButtonGroup.js +113 -0
  263. package/lib/module/web/ButtonGroup.js.map +1 -0
  264. package/lib/module/web/DatePicker.js +162 -0
  265. package/lib/module/web/DatePicker.js.map +1 -0
  266. package/lib/module/web/DateRangePicker.js +131 -0
  267. package/lib/module/web/DateRangePicker.js.map +1 -0
  268. package/lib/module/web/Dialog.js +48 -0
  269. package/lib/module/web/Dialog.js.map +1 -0
  270. package/lib/module/web/FloatingActionButton.js +94 -0
  271. package/lib/module/web/FloatingActionButton.js.map +1 -0
  272. package/lib/module/web/Icon.js +29 -0
  273. package/lib/module/web/Icon.js.map +1 -0
  274. package/lib/module/web/NativeTheme.js +23 -0
  275. package/lib/module/web/NativeTheme.js.map +1 -0
  276. package/lib/module/web/NavigationRail.js +133 -0
  277. package/lib/module/web/NavigationRail.js.map +1 -0
  278. package/lib/module/web/PlatformComponentsProvider.js +44 -0
  279. package/lib/module/web/PlatformComponentsProvider.js.map +1 -0
  280. package/lib/module/web/SegmentedControl.js +112 -0
  281. package/lib/module/web/SegmentedControl.js.map +1 -0
  282. package/lib/module/web/SelectionMenu.js +137 -0
  283. package/lib/module/web/SelectionMenu.js.map +1 -0
  284. package/lib/module/web/SplitButton.js +30 -0
  285. package/lib/module/web/SplitButton.js.map +1 -0
  286. package/lib/module/web/TabBar.js +126 -0
  287. package/lib/module/web/TabBar.js.map +1 -0
  288. package/lib/module/web/TextField.js +316 -0
  289. package/lib/module/web/TextField.js.map +1 -0
  290. package/lib/module/web/components.js +33 -0
  291. package/lib/module/web/components.js.map +1 -0
  292. package/lib/module/web/containers.js +112 -0
  293. package/lib/module/web/containers.js.map +1 -0
  294. package/lib/module/web/dateInput.js +109 -0
  295. package/lib/module/web/dateInput.js.map +1 -0
  296. package/lib/module/web/shared.js +179 -0
  297. package/lib/module/web/shared.js.map +1 -0
  298. package/lib/module/webComponents.js +4 -0
  299. package/lib/module/webComponents.js.map +1 -0
  300. package/lib/typescript/commonjs/docs/sidebars.d.ts.map +1 -1
  301. package/lib/typescript/commonjs/src/Button.d.ts +184 -0
  302. package/lib/typescript/commonjs/src/Button.d.ts.map +1 -0
  303. package/lib/typescript/commonjs/src/ButtonGroup.d.ts +117 -0
  304. package/lib/typescript/commonjs/src/ButtonGroup.d.ts.map +1 -0
  305. package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts +154 -0
  306. package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts.map +1 -0
  307. package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts +148 -0
  308. package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts.map +1 -0
  309. package/lib/typescript/commonjs/src/ContextMenu.d.ts +20 -33
  310. package/lib/typescript/commonjs/src/ContextMenu.d.ts.map +1 -1
  311. package/lib/typescript/commonjs/src/ContextMenuNativeComponent.d.ts +45 -47
  312. package/lib/typescript/commonjs/src/ContextMenuNativeComponent.d.ts.map +1 -1
  313. package/lib/typescript/commonjs/src/DatePicker.d.ts +74 -1
  314. package/lib/typescript/commonjs/src/DatePicker.d.ts.map +1 -1
  315. package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts +16 -1
  316. package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts.map +1 -1
  317. package/lib/typescript/commonjs/src/FloatingActionButton.d.ts +67 -0
  318. package/lib/typescript/commonjs/src/FloatingActionButton.d.ts.map +1 -0
  319. package/lib/typescript/commonjs/src/FloatingActionButtonNativeComponent.d.ts +43 -0
  320. package/lib/typescript/commonjs/src/FloatingActionButtonNativeComponent.d.ts.map +1 -0
  321. package/lib/typescript/commonjs/src/FloatingToolbar.d.ts +75 -0
  322. package/lib/typescript/commonjs/src/FloatingToolbar.d.ts.map +1 -0
  323. package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts +36 -0
  324. package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts.map +1 -0
  325. package/lib/typescript/commonjs/src/LiquidGlass.d.ts +17 -0
  326. package/lib/typescript/commonjs/src/LiquidGlass.d.ts.map +1 -1
  327. package/lib/typescript/commonjs/src/LiquidGlassContainer.d.ts +27 -0
  328. package/lib/typescript/commonjs/src/LiquidGlassContainer.d.ts.map +1 -0
  329. package/lib/typescript/commonjs/src/LiquidGlassContainerNativeComponent.d.ts +13 -0
  330. package/lib/typescript/commonjs/src/LiquidGlassContainerNativeComponent.d.ts.map +1 -0
  331. package/lib/typescript/commonjs/src/LiquidGlassNativeComponent.d.ts +7 -0
  332. package/lib/typescript/commonjs/src/LiquidGlassNativeComponent.d.ts.map +1 -1
  333. package/lib/typescript/commonjs/src/NavigationRail.d.ts +86 -0
  334. package/lib/typescript/commonjs/src/NavigationRail.d.ts.map +1 -0
  335. package/lib/typescript/commonjs/src/NavigationRailNativeComponent.d.ts +81 -0
  336. package/lib/typescript/commonjs/src/NavigationRailNativeComponent.d.ts.map +1 -0
  337. package/lib/typescript/commonjs/src/PlatformComponentsProvider.d.ts +6 -0
  338. package/lib/typescript/commonjs/src/PlatformComponentsProvider.d.ts.map +1 -0
  339. package/lib/typescript/commonjs/src/SegmentedControl.d.ts +35 -47
  340. package/lib/typescript/commonjs/src/SegmentedControl.d.ts.map +1 -1
  341. package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts +11 -0
  342. package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts.map +1 -1
  343. package/lib/typescript/commonjs/src/SelectionMenu.d.ts +44 -2
  344. package/lib/typescript/commonjs/src/SelectionMenu.d.ts.map +1 -1
  345. package/lib/typescript/commonjs/src/SelectionMenuNativeComponent.d.ts +20 -4
  346. package/lib/typescript/commonjs/src/SelectionMenuNativeComponent.d.ts.map +1 -1
  347. package/lib/typescript/commonjs/src/SplitButton.d.ts +83 -0
  348. package/lib/typescript/commonjs/src/SplitButton.d.ts.map +1 -0
  349. package/lib/typescript/commonjs/src/TabBar.d.ts +144 -0
  350. package/lib/typescript/commonjs/src/TabBar.d.ts.map +1 -0
  351. package/lib/typescript/commonjs/src/TabBarAccessoryNativeComponent.d.ts +13 -0
  352. package/lib/typescript/commonjs/src/TabBarAccessoryNativeComponent.d.ts.map +1 -0
  353. package/lib/typescript/commonjs/src/TabBarNativeComponent.d.ts +110 -0
  354. package/lib/typescript/commonjs/src/TabBarNativeComponent.d.ts.map +1 -0
  355. package/lib/typescript/commonjs/src/TextField.d.ts +332 -0
  356. package/lib/typescript/commonjs/src/TextField.d.ts.map +1 -0
  357. package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts +240 -0
  358. package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts.map +1 -0
  359. package/lib/typescript/commonjs/src/focusRegistry.d.ts +13 -0
  360. package/lib/typescript/commonjs/src/focusRegistry.d.ts.map +1 -0
  361. package/lib/typescript/commonjs/src/haptics.d.ts +20 -0
  362. package/lib/typescript/commonjs/src/haptics.d.ts.map +1 -0
  363. package/lib/typescript/commonjs/src/icons.d.ts +58 -0
  364. package/lib/typescript/commonjs/src/icons.d.ts.map +1 -0
  365. package/lib/typescript/commonjs/src/index.d.ts +13 -0
  366. package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
  367. package/lib/typescript/commonjs/src/index.web.d.ts +25 -133
  368. package/lib/typescript/commonjs/src/index.web.d.ts.map +1 -1
  369. package/lib/typescript/commonjs/src/jest.d.ts +139 -0
  370. package/lib/typescript/commonjs/src/jest.d.ts.map +1 -0
  371. package/lib/typescript/commonjs/src/labelStyle.d.ts +20 -0
  372. package/lib/typescript/commonjs/src/labelStyle.d.ts.map +1 -0
  373. package/lib/typescript/commonjs/src/menuItems.d.ts +100 -0
  374. package/lib/typescript/commonjs/src/menuItems.d.ts.map +1 -0
  375. package/lib/typescript/commonjs/src/selectionIdentifiers.d.ts +3 -0
  376. package/lib/typescript/commonjs/src/selectionIdentifiers.d.ts.map +1 -0
  377. package/lib/typescript/commonjs/src/sharedTypes.d.ts +6 -1
  378. package/lib/typescript/commonjs/src/sharedTypes.d.ts.map +1 -1
  379. package/lib/typescript/commonjs/src/submitBehavior.d.ts +9 -0
  380. package/lib/typescript/commonjs/src/submitBehavior.d.ts.map +1 -0
  381. package/lib/typescript/commonjs/src/tabItems.d.ts +55 -0
  382. package/lib/typescript/commonjs/src/tabItems.d.ts.map +1 -0
  383. package/lib/typescript/commonjs/src/web/Button.d.ts +9 -0
  384. package/lib/typescript/commonjs/src/web/Button.d.ts.map +1 -0
  385. package/lib/typescript/commonjs/src/web/ButtonGroup.d.ts +11 -0
  386. package/lib/typescript/commonjs/src/web/ButtonGroup.d.ts.map +1 -0
  387. package/lib/typescript/commonjs/src/web/DatePicker.d.ts +14 -0
  388. package/lib/typescript/commonjs/src/web/DatePicker.d.ts.map +1 -0
  389. package/lib/typescript/commonjs/src/web/DateRangePicker.d.ts +11 -0
  390. package/lib/typescript/commonjs/src/web/DateRangePicker.d.ts.map +1 -0
  391. package/lib/typescript/commonjs/src/web/Dialog.d.ts +12 -0
  392. package/lib/typescript/commonjs/src/web/Dialog.d.ts.map +1 -0
  393. package/lib/typescript/commonjs/src/web/FloatingActionButton.d.ts +8 -0
  394. package/lib/typescript/commonjs/src/web/FloatingActionButton.d.ts.map +1 -0
  395. package/lib/typescript/commonjs/src/web/Icon.d.ts +12 -0
  396. package/lib/typescript/commonjs/src/web/Icon.d.ts.map +1 -0
  397. package/lib/typescript/commonjs/src/web/NativeTheme.d.ts +10 -0
  398. package/lib/typescript/commonjs/src/web/NativeTheme.d.ts.map +1 -0
  399. package/lib/typescript/commonjs/src/web/NavigationRail.d.ts +8 -0
  400. package/lib/typescript/commonjs/src/web/NavigationRail.d.ts.map +1 -0
  401. package/lib/typescript/commonjs/src/web/PlatformComponentsProvider.d.ts +10 -0
  402. package/lib/typescript/commonjs/src/web/PlatformComponentsProvider.d.ts.map +1 -0
  403. package/lib/typescript/commonjs/src/web/SegmentedControl.d.ts +8 -0
  404. package/lib/typescript/commonjs/src/web/SegmentedControl.d.ts.map +1 -0
  405. package/lib/typescript/commonjs/src/web/SelectionMenu.d.ts +10 -0
  406. package/lib/typescript/commonjs/src/web/SelectionMenu.d.ts.map +1 -0
  407. package/lib/typescript/commonjs/src/web/SplitButton.d.ts +9 -0
  408. package/lib/typescript/commonjs/src/web/SplitButton.d.ts.map +1 -0
  409. package/lib/typescript/commonjs/src/web/TabBar.d.ts +9 -0
  410. package/lib/typescript/commonjs/src/web/TabBar.d.ts.map +1 -0
  411. package/lib/typescript/commonjs/src/web/TextField.d.ts +9 -0
  412. package/lib/typescript/commonjs/src/web/TextField.d.ts.map +1 -0
  413. package/lib/typescript/commonjs/src/web/components.d.ts +17 -0
  414. package/lib/typescript/commonjs/src/web/components.d.ts.map +1 -0
  415. package/lib/typescript/commonjs/src/web/containers.d.ts +24 -0
  416. package/lib/typescript/commonjs/src/web/containers.d.ts.map +1 -0
  417. package/lib/typescript/commonjs/src/web/dateInput.d.ts +20 -0
  418. package/lib/typescript/commonjs/src/web/dateInput.d.ts.map +1 -0
  419. package/lib/typescript/commonjs/src/web/shared.d.ts +43 -0
  420. package/lib/typescript/commonjs/src/web/shared.d.ts.map +1 -0
  421. package/lib/typescript/commonjs/src/webComponents.d.ts +43 -0
  422. package/lib/typescript/commonjs/src/webComponents.d.ts.map +1 -0
  423. package/lib/typescript/module/docs/sidebars.d.ts.map +1 -1
  424. package/lib/typescript/module/src/Button.d.ts +184 -0
  425. package/lib/typescript/module/src/Button.d.ts.map +1 -0
  426. package/lib/typescript/module/src/ButtonGroup.d.ts +117 -0
  427. package/lib/typescript/module/src/ButtonGroup.d.ts.map +1 -0
  428. package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts +154 -0
  429. package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts.map +1 -0
  430. package/lib/typescript/module/src/ButtonNativeComponent.d.ts +148 -0
  431. package/lib/typescript/module/src/ButtonNativeComponent.d.ts.map +1 -0
  432. package/lib/typescript/module/src/ContextMenu.d.ts +20 -33
  433. package/lib/typescript/module/src/ContextMenu.d.ts.map +1 -1
  434. package/lib/typescript/module/src/ContextMenuNativeComponent.d.ts +45 -47
  435. package/lib/typescript/module/src/ContextMenuNativeComponent.d.ts.map +1 -1
  436. package/lib/typescript/module/src/DatePicker.d.ts +74 -1
  437. package/lib/typescript/module/src/DatePicker.d.ts.map +1 -1
  438. package/lib/typescript/module/src/DatePickerNativeComponent.d.ts +16 -1
  439. package/lib/typescript/module/src/DatePickerNativeComponent.d.ts.map +1 -1
  440. package/lib/typescript/module/src/FloatingActionButton.d.ts +67 -0
  441. package/lib/typescript/module/src/FloatingActionButton.d.ts.map +1 -0
  442. package/lib/typescript/module/src/FloatingActionButtonNativeComponent.d.ts +43 -0
  443. package/lib/typescript/module/src/FloatingActionButtonNativeComponent.d.ts.map +1 -0
  444. package/lib/typescript/module/src/FloatingToolbar.d.ts +75 -0
  445. package/lib/typescript/module/src/FloatingToolbar.d.ts.map +1 -0
  446. package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts +36 -0
  447. package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts.map +1 -0
  448. package/lib/typescript/module/src/LiquidGlass.d.ts +17 -0
  449. package/lib/typescript/module/src/LiquidGlass.d.ts.map +1 -1
  450. package/lib/typescript/module/src/LiquidGlassContainer.d.ts +27 -0
  451. package/lib/typescript/module/src/LiquidGlassContainer.d.ts.map +1 -0
  452. package/lib/typescript/module/src/LiquidGlassContainerNativeComponent.d.ts +13 -0
  453. package/lib/typescript/module/src/LiquidGlassContainerNativeComponent.d.ts.map +1 -0
  454. package/lib/typescript/module/src/LiquidGlassNativeComponent.d.ts +7 -0
  455. package/lib/typescript/module/src/LiquidGlassNativeComponent.d.ts.map +1 -1
  456. package/lib/typescript/module/src/NavigationRail.d.ts +86 -0
  457. package/lib/typescript/module/src/NavigationRail.d.ts.map +1 -0
  458. package/lib/typescript/module/src/NavigationRailNativeComponent.d.ts +81 -0
  459. package/lib/typescript/module/src/NavigationRailNativeComponent.d.ts.map +1 -0
  460. package/lib/typescript/module/src/PlatformComponentsProvider.d.ts +6 -0
  461. package/lib/typescript/module/src/PlatformComponentsProvider.d.ts.map +1 -0
  462. package/lib/typescript/module/src/SegmentedControl.d.ts +35 -47
  463. package/lib/typescript/module/src/SegmentedControl.d.ts.map +1 -1
  464. package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts +11 -0
  465. package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts.map +1 -1
  466. package/lib/typescript/module/src/SelectionMenu.d.ts +44 -2
  467. package/lib/typescript/module/src/SelectionMenu.d.ts.map +1 -1
  468. package/lib/typescript/module/src/SelectionMenuNativeComponent.d.ts +20 -4
  469. package/lib/typescript/module/src/SelectionMenuNativeComponent.d.ts.map +1 -1
  470. package/lib/typescript/module/src/SplitButton.d.ts +83 -0
  471. package/lib/typescript/module/src/SplitButton.d.ts.map +1 -0
  472. package/lib/typescript/module/src/TabBar.d.ts +144 -0
  473. package/lib/typescript/module/src/TabBar.d.ts.map +1 -0
  474. package/lib/typescript/module/src/TabBarAccessoryNativeComponent.d.ts +13 -0
  475. package/lib/typescript/module/src/TabBarAccessoryNativeComponent.d.ts.map +1 -0
  476. package/lib/typescript/module/src/TabBarNativeComponent.d.ts +110 -0
  477. package/lib/typescript/module/src/TabBarNativeComponent.d.ts.map +1 -0
  478. package/lib/typescript/module/src/TextField.d.ts +332 -0
  479. package/lib/typescript/module/src/TextField.d.ts.map +1 -0
  480. package/lib/typescript/module/src/TextFieldNativeComponent.d.ts +240 -0
  481. package/lib/typescript/module/src/TextFieldNativeComponent.d.ts.map +1 -0
  482. package/lib/typescript/module/src/focusRegistry.d.ts +13 -0
  483. package/lib/typescript/module/src/focusRegistry.d.ts.map +1 -0
  484. package/lib/typescript/module/src/haptics.d.ts +20 -0
  485. package/lib/typescript/module/src/haptics.d.ts.map +1 -0
  486. package/lib/typescript/module/src/icons.d.ts +58 -0
  487. package/lib/typescript/module/src/icons.d.ts.map +1 -0
  488. package/lib/typescript/module/src/index.d.ts +13 -0
  489. package/lib/typescript/module/src/index.d.ts.map +1 -1
  490. package/lib/typescript/module/src/index.web.d.ts +25 -133
  491. package/lib/typescript/module/src/index.web.d.ts.map +1 -1
  492. package/lib/typescript/module/src/jest.d.ts +139 -0
  493. package/lib/typescript/module/src/jest.d.ts.map +1 -0
  494. package/lib/typescript/module/src/labelStyle.d.ts +20 -0
  495. package/lib/typescript/module/src/labelStyle.d.ts.map +1 -0
  496. package/lib/typescript/module/src/menuItems.d.ts +100 -0
  497. package/lib/typescript/module/src/menuItems.d.ts.map +1 -0
  498. package/lib/typescript/module/src/selectionIdentifiers.d.ts +3 -0
  499. package/lib/typescript/module/src/selectionIdentifiers.d.ts.map +1 -0
  500. package/lib/typescript/module/src/sharedTypes.d.ts +6 -1
  501. package/lib/typescript/module/src/sharedTypes.d.ts.map +1 -1
  502. package/lib/typescript/module/src/submitBehavior.d.ts +9 -0
  503. package/lib/typescript/module/src/submitBehavior.d.ts.map +1 -0
  504. package/lib/typescript/module/src/tabItems.d.ts +55 -0
  505. package/lib/typescript/module/src/tabItems.d.ts.map +1 -0
  506. package/lib/typescript/module/src/web/Button.d.ts +9 -0
  507. package/lib/typescript/module/src/web/Button.d.ts.map +1 -0
  508. package/lib/typescript/module/src/web/ButtonGroup.d.ts +11 -0
  509. package/lib/typescript/module/src/web/ButtonGroup.d.ts.map +1 -0
  510. package/lib/typescript/module/src/web/DatePicker.d.ts +14 -0
  511. package/lib/typescript/module/src/web/DatePicker.d.ts.map +1 -0
  512. package/lib/typescript/module/src/web/DateRangePicker.d.ts +11 -0
  513. package/lib/typescript/module/src/web/DateRangePicker.d.ts.map +1 -0
  514. package/lib/typescript/module/src/web/Dialog.d.ts +12 -0
  515. package/lib/typescript/module/src/web/Dialog.d.ts.map +1 -0
  516. package/lib/typescript/module/src/web/FloatingActionButton.d.ts +8 -0
  517. package/lib/typescript/module/src/web/FloatingActionButton.d.ts.map +1 -0
  518. package/lib/typescript/module/src/web/Icon.d.ts +12 -0
  519. package/lib/typescript/module/src/web/Icon.d.ts.map +1 -0
  520. package/lib/typescript/module/src/web/NativeTheme.d.ts +10 -0
  521. package/lib/typescript/module/src/web/NativeTheme.d.ts.map +1 -0
  522. package/lib/typescript/module/src/web/NavigationRail.d.ts +8 -0
  523. package/lib/typescript/module/src/web/NavigationRail.d.ts.map +1 -0
  524. package/lib/typescript/module/src/web/PlatformComponentsProvider.d.ts +10 -0
  525. package/lib/typescript/module/src/web/PlatformComponentsProvider.d.ts.map +1 -0
  526. package/lib/typescript/module/src/web/SegmentedControl.d.ts +8 -0
  527. package/lib/typescript/module/src/web/SegmentedControl.d.ts.map +1 -0
  528. package/lib/typescript/module/src/web/SelectionMenu.d.ts +10 -0
  529. package/lib/typescript/module/src/web/SelectionMenu.d.ts.map +1 -0
  530. package/lib/typescript/module/src/web/SplitButton.d.ts +9 -0
  531. package/lib/typescript/module/src/web/SplitButton.d.ts.map +1 -0
  532. package/lib/typescript/module/src/web/TabBar.d.ts +9 -0
  533. package/lib/typescript/module/src/web/TabBar.d.ts.map +1 -0
  534. package/lib/typescript/module/src/web/TextField.d.ts +9 -0
  535. package/lib/typescript/module/src/web/TextField.d.ts.map +1 -0
  536. package/lib/typescript/module/src/web/components.d.ts +17 -0
  537. package/lib/typescript/module/src/web/components.d.ts.map +1 -0
  538. package/lib/typescript/module/src/web/containers.d.ts +24 -0
  539. package/lib/typescript/module/src/web/containers.d.ts.map +1 -0
  540. package/lib/typescript/module/src/web/dateInput.d.ts +20 -0
  541. package/lib/typescript/module/src/web/dateInput.d.ts.map +1 -0
  542. package/lib/typescript/module/src/web/shared.d.ts +43 -0
  543. package/lib/typescript/module/src/web/shared.d.ts.map +1 -0
  544. package/lib/typescript/module/src/webComponents.d.ts +43 -0
  545. package/lib/typescript/module/src/webComponents.d.ts.map +1 -0
  546. package/package.json +55 -4
  547. package/plugin/build/index.d.ts +3 -2
  548. package/plugin/build/index.d.ts.map +1 -1
  549. package/react-native.config.js +6 -0
  550. package/shared/PCButtonComponentDescriptors-custom.h +22 -0
  551. package/shared/PCButtonGroupComponentDescriptors-custom.h +22 -0
  552. package/shared/PCButtonGroupShadowNode-custom.cpp +48 -0
  553. package/shared/PCButtonGroupShadowNode-custom.h +55 -0
  554. package/shared/PCButtonGroupState-custom.h +61 -0
  555. package/shared/PCButtonShadowNode-custom.cpp +48 -0
  556. package/shared/PCButtonShadowNode-custom.h +55 -0
  557. package/shared/PCButtonState-custom.h +61 -0
  558. package/shared/PCFloatingActionButtonComponentDescriptors-custom.h +22 -0
  559. package/shared/PCFloatingActionButtonShadowNode-custom.cpp +48 -0
  560. package/shared/PCFloatingActionButtonShadowNode-custom.h +54 -0
  561. package/shared/PCFloatingActionButtonState-custom.h +61 -0
  562. package/shared/PCNavigationRailComponentDescriptors-custom.h +47 -0
  563. package/shared/PCNavigationRailShadowNode-custom.h +42 -0
  564. package/shared/PCNavigationRailState-custom.h +62 -0
  565. package/shared/PCTabBarComponentDescriptors-custom.h +22 -0
  566. package/shared/PCTabBarShadowNode-custom.cpp +54 -0
  567. package/shared/PCTabBarShadowNode-custom.h +54 -0
  568. package/shared/PCTabBarState-custom.h +62 -0
  569. package/shared/PCTextFieldComponentDescriptors-custom.h +22 -0
  570. package/shared/PCTextFieldShadowNode-custom.cpp +47 -0
  571. package/shared/PCTextFieldShadowNode-custom.h +55 -0
  572. package/shared/PCTextFieldState-custom.h +61 -0
  573. package/shared/react/renderer/components/PlatformComponentsViewSpec/ComponentDescriptors.h +6 -0
  574. package/src/Button.tsx +359 -0
  575. package/src/ButtonGroup.tsx +251 -0
  576. package/src/ButtonGroupNativeComponent.ts +191 -0
  577. package/src/ButtonNativeComponent.ts +192 -0
  578. package/src/ContextMenu.tsx +34 -81
  579. package/src/ContextMenuNativeComponent.ts +47 -49
  580. package/src/DatePicker.tsx +182 -4
  581. package/src/DatePickerNativeComponent.ts +19 -2
  582. package/src/FloatingActionButton.tsx +121 -0
  583. package/src/FloatingActionButtonNativeComponent.ts +58 -0
  584. package/src/FloatingToolbar.tsx +164 -0
  585. package/src/FloatingToolbarNativeComponent.ts +47 -0
  586. package/src/LiquidGlass.tsx +24 -1
  587. package/src/LiquidGlassContainer.tsx +42 -0
  588. package/src/LiquidGlassContainerNativeComponent.ts +17 -0
  589. package/src/LiquidGlassNativeComponent.ts +8 -0
  590. package/src/NavigationRail.tsx +203 -0
  591. package/src/NavigationRailNativeComponent.ts +107 -0
  592. package/src/PlatformComponentsProvider.tsx +15 -0
  593. package/src/SegmentedControl.tsx +57 -119
  594. package/src/SegmentedControlNativeComponent.ts +14 -0
  595. package/src/SelectionMenu.tsx +81 -6
  596. package/src/SelectionMenuNativeComponent.ts +26 -4
  597. package/src/SplitButton.tsx +198 -0
  598. package/src/TabBar.tsx +373 -0
  599. package/src/TabBarAccessoryNativeComponent.ts +19 -0
  600. package/src/TabBarNativeComponent.ts +145 -0
  601. package/src/TextField.tsx +908 -0
  602. package/src/TextFieldNativeComponent.ts +324 -0
  603. package/src/focusRegistry.ts +90 -0
  604. package/src/haptics.ts +31 -0
  605. package/src/icons.ts +143 -0
  606. package/src/index.tsx +13 -0
  607. package/src/index.web.tsx +53 -199
  608. package/src/jest.tsx +958 -0
  609. package/src/labelStyle.ts +36 -0
  610. package/src/menuItems.ts +152 -0
  611. package/src/reactNativeInternals.d.ts +22 -0
  612. package/src/selectionIdentifiers.ts +17 -0
  613. package/src/sharedTypes.ts +7 -1
  614. package/src/submitBehavior.ts +16 -0
  615. package/src/tabItems.ts +113 -0
  616. package/src/web/Button.tsx +201 -0
  617. package/src/web/ButtonGroup.tsx +154 -0
  618. package/src/web/DatePicker.tsx +204 -0
  619. package/src/web/DateRangePicker.tsx +135 -0
  620. package/src/web/Dialog.tsx +54 -0
  621. package/src/web/FloatingActionButton.tsx +76 -0
  622. package/src/web/Icon.tsx +33 -0
  623. package/src/web/NativeTheme.ts +23 -0
  624. package/src/web/NavigationRail.tsx +148 -0
  625. package/src/web/PlatformComponentsProvider.tsx +48 -0
  626. package/src/web/SegmentedControl.tsx +127 -0
  627. package/src/web/SelectionMenu.tsx +149 -0
  628. package/src/web/SplitButton.tsx +32 -0
  629. package/src/web/TabBar.tsx +150 -0
  630. package/src/web/TextField.tsx +361 -0
  631. package/src/web/components.tsx +71 -0
  632. package/src/web/containers.tsx +130 -0
  633. package/src/web/dateInput.ts +137 -0
  634. package/src/web/shared.ts +176 -0
  635. package/src/webComponents.ts +45 -0
  636. package/android/src/main/java/com/platformcomponents/DateConstraints.kt +0 -83
@@ -0,0 +1,908 @@
1
+ // TextField.tsx
2
+ import React, {
3
+ forwardRef,
4
+ useCallback,
5
+ useImperativeHandle,
6
+ useLayoutEffect,
7
+ useMemo,
8
+ useRef,
9
+ useState,
10
+ } from 'react';
11
+ import type { ColorValue, NativeSyntheticEvent, ViewProps } from 'react-native';
12
+
13
+ import NativeTextField, {
14
+ Commands,
15
+ type TextFieldChangeEvent as NativeChangeEvent,
16
+ type TextFieldSelectionEvent as NativeSelectionEvent,
17
+ type TextFieldTextEvent as NativeTextEvent,
18
+ type TextFieldToolbarItem as NativeToolbarItem,
19
+ type TextFieldToolbarPressEvent as NativeToolbarPressEvent,
20
+ } from './TextFieldNativeComponent';
21
+ import { NO_ICON, resolveIcon, type PlatformIcon } from './icons';
22
+ import { normalizeLabelStyle, type LabelStyle } from './labelStyle';
23
+ import { focusRegistry } from './focusRegistry';
24
+ import { resolveSubmitBehavior } from './submitBehavior';
25
+ import type { AndroidMaterialMode } from './sharedTypes';
26
+
27
+ /** Keyboard to show; the React Native `TextInput` values. */
28
+ export type TextFieldKeyboardType =
29
+ | 'default'
30
+ | 'number-pad'
31
+ | 'decimal-pad'
32
+ | 'numeric'
33
+ | 'email-address'
34
+ | 'phone-pad'
35
+ | 'url'
36
+ | 'ascii-capable'
37
+ | 'numbers-and-punctuation'
38
+ | 'name-phone-pad'
39
+ | 'twitter'
40
+ | 'web-search'
41
+ | 'visible-password';
42
+
43
+ /** Return key label; the React Native `TextInput` values. */
44
+ export type TextFieldReturnKeyType =
45
+ 'default' | 'done' | 'go' | 'next' | 'search' | 'send' | 'none' | 'previous';
46
+
47
+ /**
48
+ * Autofill hint: the React Native `TextInput` `autoComplete` values, which
49
+ * include the HTML autocomplete names. iOS maps them to `textContentType`,
50
+ * Android to autofill hints. A value one platform has no equivalent for is
51
+ * ignored there.
52
+ */
53
+ export type TextFieldAutoComplete =
54
+ | 'off'
55
+ | 'username'
56
+ | 'username-new'
57
+ | 'password'
58
+ | 'current-password'
59
+ | 'new-password'
60
+ | 'password-new'
61
+ | 'one-time-code'
62
+ | 'sms-otp'
63
+ | 'email-otp'
64
+ | '2fa-app-otp'
65
+ | 'email'
66
+ | 'name'
67
+ | 'given-name'
68
+ | 'family-name'
69
+ | 'additional-name'
70
+ | 'name-given'
71
+ | 'name-family'
72
+ | 'name-middle'
73
+ | 'name-middle-initial'
74
+ | 'name-prefix'
75
+ | 'name-suffix'
76
+ | 'honorific-prefix'
77
+ | 'honorific-suffix'
78
+ | 'nickname'
79
+ | 'organization'
80
+ | 'organization-title'
81
+ | 'tel'
82
+ | 'tel-country-code'
83
+ | 'tel-national'
84
+ | 'tel-device'
85
+ | 'street-address'
86
+ | 'address-line1'
87
+ | 'address-line2'
88
+ | 'postal-address'
89
+ | 'postal-address-country'
90
+ | 'postal-address-extended'
91
+ | 'postal-address-extended-postal-code'
92
+ | 'postal-address-locality'
93
+ | 'postal-address-region'
94
+ | 'postal-address-dependent-locality'
95
+ | 'postal-address-unit'
96
+ | 'postal-code'
97
+ | 'country'
98
+ | 'birthdate-full'
99
+ | 'birthdate-day'
100
+ | 'birthdate-month'
101
+ | 'birthdate-year'
102
+ | 'gender'
103
+ | 'cc-number'
104
+ | 'cc-exp'
105
+ | 'cc-exp-day'
106
+ | 'cc-exp-month'
107
+ | 'cc-exp-year'
108
+ | 'cc-csc'
109
+ | 'cc-name'
110
+ | 'cc-given-name'
111
+ | 'cc-middle-name'
112
+ | 'cc-family-name'
113
+ | 'cc-type'
114
+ | 'url'
115
+ | 'flight-number'
116
+ | 'flight-confirmation-code'
117
+ | 'gift-card-number'
118
+ | 'gift-card-pin'
119
+ | 'loyalty-account-number'
120
+ | 'promo-code'
121
+ | 'upi-vpa'
122
+ | 'wifi-password';
123
+
124
+ export type TextFieldAutoCapitalize =
125
+ 'none' | 'sentences' | 'words' | 'characters';
126
+
127
+ export type TextFieldClearButtonMode =
128
+ 'never' | 'while-editing' | 'unless-editing' | 'always';
129
+
130
+ /** An iOS text trait: the system default, on, or off. */
131
+ export type TextFieldIOSChoice = 'default' | 'yes' | 'no';
132
+
133
+ /** Focus, blur and submit events carry the text at that moment. */
134
+ export type TextFieldEvent = NativeSyntheticEvent<{ text: string }>;
135
+
136
+ /** Change events carry the text and the native edit counter. */
137
+ export type TextFieldChangeEvent = NativeSyntheticEvent<{
138
+ text: string;
139
+ eventCount: number;
140
+ }>;
141
+
142
+ /** A cursor position or selected range, as UTF-16 offsets into the text. */
143
+ export type TextFieldSelection = { start: number; end: number };
144
+
145
+ /** Selection events carry the new selection, as on `TextInput`. */
146
+ export type TextFieldSelectionChangeEvent = NativeSyntheticEvent<{
147
+ selection: TextFieldSelection;
148
+ }>;
149
+
150
+ /**
151
+ * What the return key does, as on `TextInput`: `'blurAndSubmit'` calls
152
+ * `onSubmitEditing` and dismisses the keyboard, `'submit'` calls it and keeps
153
+ * the keyboard up, `'newline'` inserts a newline (multi-line fields).
154
+ */
155
+ export type TextFieldSubmitBehavior = 'submit' | 'blurAndSubmit' | 'newline';
156
+
157
+ /** A system button of the iOS keyboard toolbar (`UIBarButtonItem.SystemItem`). */
158
+ export type TextFieldToolbarSystemItem =
159
+ | 'done'
160
+ | 'cancel'
161
+ | 'save'
162
+ | 'add'
163
+ | 'edit'
164
+ | 'close'
165
+ | 'search'
166
+ | 'compose'
167
+ | 'reply'
168
+ | 'action'
169
+ | 'camera'
170
+ | 'trash'
171
+ | 'undo'
172
+ | 'redo';
173
+
174
+ /**
175
+ * An item of the iOS keyboard toolbar: a button, or `'flexibleSpace'` to push
176
+ * the next items to the end.
177
+ */
178
+ export type TextFieldToolbarItem =
179
+ | 'flexibleSpace'
180
+ | {
181
+ /** Passed to `onItemPress`. */
182
+ id: string;
183
+ /** Button title. */
184
+ title?: string;
185
+ /** An icon instead of the title: an SF Symbol name or an image. */
186
+ icon?: PlatformIcon;
187
+ /** A system button, with its own localized title or symbol. */
188
+ systemItem?: TextFieldToolbarSystemItem;
189
+ /** The prominent style: bold, or tinted glass on iOS 26. */
190
+ prominent?: boolean;
191
+ /** Screen-reader label; defaults to the title. */
192
+ accessibilityLabel?: string;
193
+ /** Test identifier of the button. */
194
+ testID?: string;
195
+ };
196
+
197
+ /** The iOS keyboard toolbar, a `UIToolbar` shown above the keyboard. */
198
+ export interface TextFieldKeyboardToolbar {
199
+ /**
200
+ * A Done button at the end of the toolbar that dismisses the keyboard
201
+ * (`onBlur` is called; `onSubmitEditing` is not). `true` is the system
202
+ * Done button; a string is a prominent button with that title.
203
+ */
204
+ done?: boolean | string;
205
+ /** Buttons at the start of the toolbar, before Done. */
206
+ items?: TextFieldToolbarItem[];
207
+ /** Called with the `id` of a pressed item. */
208
+ onItemPress?: (id: string) => void;
209
+ /** Test identifier of the Done button. */
210
+ doneTestID?: string;
211
+ }
212
+
213
+ /** Methods available through the `ref`. */
214
+ export interface TextFieldRef {
215
+ /** Focuses the field and shows the keyboard. */
216
+ focus(): void;
217
+ /** Removes focus and hides the keyboard. */
218
+ blur(): void;
219
+ /** Clears the text. Fires `onChangeText('')`. */
220
+ clear(): void;
221
+ /** Whether the field currently has focus. */
222
+ isFocused(): boolean;
223
+ /**
224
+ * Moves the cursor to `start`, or selects `start`..`end`, in UTF-16
225
+ * offsets clamped to the text.
226
+ */
227
+ setSelection(start: number, end?: number): void;
228
+ }
229
+
230
+ export interface TextFieldProps extends Omit<
231
+ ViewProps,
232
+ 'onFocus' | 'onBlur' | 'children'
233
+ > {
234
+ /**
235
+ * Controlled text. Native keeps what the user typed until the next
236
+ * `onChangeText` round-trip, so updating state from `onChangeText` never
237
+ * drops characters.
238
+ */
239
+ value?: string;
240
+
241
+ /** Initial text of an uncontrolled field. */
242
+ defaultValue?: string;
243
+
244
+ /** Called with the new text on every edit. */
245
+ onChangeText?: (text: string) => void;
246
+
247
+ /** Called on every edit with the native event. */
248
+ onChange?: (event: TextFieldChangeEvent) => void;
249
+
250
+ /** Called when the field gains focus. */
251
+ onFocus?: (event: TextFieldEvent) => void;
252
+
253
+ /** Called when the field loses focus. */
254
+ onBlur?: (event: TextFieldEvent) => void;
255
+
256
+ /**
257
+ * Called when the return key is pressed, unless it inserts a newline (see
258
+ * `submitBehavior`).
259
+ */
260
+ onSubmitEditing?: (event: TextFieldEvent) => void;
261
+
262
+ /**
263
+ * What the return key does. Default: `'blurAndSubmit'` for single-line
264
+ * fields, `'newline'` for multi-line fields. `'submit'` keeps the keyboard
265
+ * up, for a chat composer that sends on return.
266
+ */
267
+ submitBehavior?: TextFieldSubmitBehavior;
268
+
269
+ /**
270
+ * Called when the cursor moves or the selection changes, with
271
+ * `nativeEvent.selection` in UTF-16 offsets.
272
+ */
273
+ onSelectionChange?: (event: TextFieldSelectionChangeEvent) => void;
274
+
275
+ /**
276
+ * Controlled cursor position or selection, in UTF-16 offsets; `end`
277
+ * defaults to `start`, a cursor. Like `value`, the field returns to it
278
+ * when the user moves the cursor, so update it from `onSelectionChange`.
279
+ * For a one-off move, use the ref's `setSelection` instead.
280
+ */
281
+ selection?: { start: number; end?: number };
282
+
283
+ /**
284
+ * Field label. Android: the Material floating label. iOS: a caption above
285
+ * the field, which takes the tint color while focused.
286
+ */
287
+ label?: string;
288
+
289
+ /** Placeholder shown while the field is empty. */
290
+ placeholder?: string;
291
+
292
+ /** Helper text below the field. */
293
+ supportingText?: string;
294
+
295
+ /**
296
+ * Error state. A string is shown below the field in place of the
297
+ * supporting text; `true` marks the field as invalid and keeps the
298
+ * supporting text.
299
+ */
300
+ error?: boolean | string;
301
+
302
+ /** Text shown before the input, inside the field (a currency sign). */
303
+ prefix?: string;
304
+
305
+ /** Text shown after the input, inside the field (a unit). */
306
+ suffix?: string;
307
+
308
+ /** Icon at the start of the field. */
309
+ leadingIcon?: PlatformIcon;
310
+
311
+ /** Icon at the end of the field. Pressing it calls `onTrailingIconPress`. */
312
+ trailingIcon?: PlatformIcon;
313
+
314
+ /** Called when the trailing icon is pressed. */
315
+ onTrailingIconPress?: () => void;
316
+
317
+ /** Test identifier of the leading icon (Android: Material fields only). */
318
+ leadingIconTestID?: string;
319
+
320
+ /** Screen-reader label of the leading icon, which is decorative without one. */
321
+ leadingIconAccessibilityLabel?: string;
322
+
323
+ /** Test identifier of the trailing icon (Android: Material fields only). */
324
+ trailingIconTestID?: string;
325
+
326
+ /** Screen-reader label of the trailing icon. */
327
+ trailingIconAccessibilityLabel?: string;
328
+
329
+ /**
330
+ * Called when a field with `editable={false}` is pressed, for a field that
331
+ * opens a menu, a date picker or another screen. The field doesn't focus
332
+ * or show the keyboard, keeps its enabled look, and is announced as a
333
+ * button. Ignored while the field is editable.
334
+ */
335
+ onPress?: () => void;
336
+
337
+ /**
338
+ * Color of the focused outline (underline for filled fields), the focused
339
+ * label and the cursor. Default: the tint / Material primary color.
340
+ */
341
+ activeColor?: ColorValue;
342
+
343
+ /**
344
+ * Color of the unfocused outline (underline for filled fields). iOS draws
345
+ * the rounded-rect border itself when this, `activeColor` or
346
+ * `containerColor` is set.
347
+ */
348
+ outlineColor?: ColorValue;
349
+
350
+ /** Color of the outline, label and message in the error state. */
351
+ errorColor?: ColorValue;
352
+
353
+ /** Background of the field's box. The host `style.backgroundColor` paints the whole view. */
354
+ containerColor?: ColorValue;
355
+
356
+ /** Color of the typed text. */
357
+ textColor?: ColorValue;
358
+
359
+ /** Color of the placeholder. */
360
+ placeholderTextColor?: ColorValue;
361
+
362
+ /**
363
+ * Largest scale the field's text may reach with the system text size
364
+ * (Dynamic Type / font scale), as on React Native `Text`: `2` caps a 17pt
365
+ * font at 34pt. Unset or `0`: no cap. Applies to the input, label,
366
+ * placeholder, prefix, suffix and supporting text.
367
+ */
368
+ maxFontSizeMultiplier?: number;
369
+
370
+ /** Horizontal alignment of the text. Default: the natural (leading) alignment. */
371
+ textAlign?: 'left' | 'center' | 'right';
372
+
373
+ /** Multi-line fields: the height in lines the field starts at. */
374
+ minLines?: number;
375
+
376
+ /** Multi-line fields: the lines the field grows to before it scrolls. */
377
+ maxLines?: number;
378
+
379
+ /**
380
+ * When to show a clear button inside the field. Default: `'never'`.
381
+ * Android shows the Material clear icon while the field has text.
382
+ * Clearing fires `onChange` and `onChangeText('')` on both platforms.
383
+ */
384
+ clearButtonMode?: TextFieldClearButtonMode;
385
+
386
+ /**
387
+ * Shows a button that toggles `secureTextEntry`, for password fields.
388
+ * Android: the Material password toggle. iOS: an eye button.
389
+ */
390
+ passwordToggle?: boolean;
391
+
392
+ /** Shows the character count below the field (`12 / 100` with `maxLength`). */
393
+ showCharacterCount?: boolean;
394
+
395
+ /** Maximum number of characters. */
396
+ maxLength?: number;
397
+
398
+ /** Keyboard to show. Default: `'default'`. */
399
+ keyboardType?: TextFieldKeyboardType;
400
+
401
+ /** Return key label. Default: `'default'`. */
402
+ returnKeyType?: TextFieldReturnKeyType;
403
+
404
+ /** Automatic capitalization. Default: `'sentences'`. */
405
+ autoCapitalize?: TextFieldAutoCapitalize;
406
+
407
+ /** Auto-correction and suggestions. Default: `true`. */
408
+ autoCorrect?: boolean;
409
+
410
+ /** Obscures the text, for passwords. */
411
+ secureTextEntry?: boolean;
412
+
413
+ /**
414
+ * Multi-line field that grows with its content, between `minLines` and
415
+ * `maxLines`. Return inserts a newline.
416
+ */
417
+ multiline?: boolean;
418
+
419
+ /** Whether the text can be edited. Default: `true`. */
420
+ editable?: boolean;
421
+
422
+ /** Focuses the field when it mounts. */
423
+ autoFocus?: boolean;
424
+
425
+ /** Selects all text when the field gains focus. */
426
+ selectTextOnFocus?: boolean;
427
+
428
+ /**
429
+ * Autofill hint. Android: autofill hints. iOS: `textContentType`, which
430
+ * also enables the password and one-time-code suggestions.
431
+ */
432
+ autoComplete?: TextFieldAutoComplete;
433
+
434
+ /** iOS: keyboard appearance. Default: `'default'`. */
435
+ keyboardAppearance?: 'default' | 'light' | 'dark';
436
+
437
+ /** Font of the input text. */
438
+ textStyle?: LabelStyle;
439
+
440
+ /** Screen-reader label. Defaults to `label`. */
441
+ accessibilityLabel?: string;
442
+
443
+ /**
444
+ * iOS-specific configuration. Each trait defaults to the system default.
445
+ */
446
+ ios?: {
447
+ /**
448
+ * Writing Tools (iOS 18): `'complete'` allows rewrites in place,
449
+ * `'limited'` only the overlay panel, `'none'` disables them.
450
+ */
451
+ writingTools?: 'default' | 'complete' | 'limited' | 'none';
452
+
453
+ /** Inline predictive text (iOS 17). */
454
+ inlinePrediction?: TextFieldIOSChoice;
455
+
456
+ /** Smart quotes. */
457
+ smartQuotes?: TextFieldIOSChoice;
458
+
459
+ /** Smart dashes. */
460
+ smartDashes?: TextFieldIOSChoice;
461
+
462
+ /** Smart insert and delete (spaces around pasted words). */
463
+ smartInsertDelete?: TextFieldIOSChoice;
464
+
465
+ /** Math expression completion, `1+1=` (iOS 18). */
466
+ mathExpressionCompletion?: TextFieldIOSChoice;
467
+
468
+ /** `UITextField.borderStyle`. Default: `'roundedRect'`. */
469
+ borderStyle?: 'roundedRect' | 'none' | 'line' | 'bezel';
470
+
471
+ /**
472
+ * Where the label sits: above the field (default), or in a leading
473
+ * column with the field beside it, the layout of the grouped forms in
474
+ * Contacts and Settings. Pair `'leading'` with `borderStyle: 'none'`
475
+ * inside your own grouped row.
476
+ */
477
+ labelPlacement?: 'above' | 'leading';
478
+
479
+ /** Width of the leading label column, in points. Default: 100. */
480
+ labelWidth?: number;
481
+
482
+ /**
483
+ * A toolbar above the keyboard (`inputAccessoryView`) with a Done
484
+ * button and your own buttons. Number and phone pads have no return
485
+ * key, so this is how they are dismissed.
486
+ */
487
+ keyboardToolbar?: TextFieldKeyboardToolbar;
488
+
489
+ /**
490
+ * Requirements for the strong passwords iOS suggests, as a
491
+ * `UITextInputPasswordRules` descriptor, e.g.
492
+ * `'minlength: 12; required: lower; required: upper; required: digit;'`.
493
+ * Use with `autoComplete="new-password"`.
494
+ */
495
+ passwordRules?: string;
496
+ };
497
+
498
+ /**
499
+ * Android-specific configuration
500
+ */
501
+ android?: {
502
+ /**
503
+ * Material preference: the Material 3 text field (default), or
504
+ * `'system'` for the platform `EditText` (the hint as placeholder,
505
+ * supporting text below, icons as compound drawables; no box, floating
506
+ * label, clear button, password toggle, counter, prefix or suffix).
507
+ */
508
+ material?: AndroidMaterialMode;
509
+
510
+ /**
511
+ * Material 3 text field style. Default: `'outlined'`. `'plain'` has no
512
+ * box or underline (the label still floats), for a large standalone
513
+ * input such as an amount; the iOS equivalent is `ios.borderStyle: 'none'`.
514
+ */
515
+ variant?: 'outlined' | 'filled' | 'plain';
516
+
517
+ /** The dense variant, a shorter field. */
518
+ dense?: boolean;
519
+ };
520
+
521
+ /**
522
+ * Test identifier. It is set on the inner text input (the `UITextField` /
523
+ * `UITextView` on iOS, the `EditText` on Android) rather than the host
524
+ * view, so E2E drivers such as Detox can type into and clear the field.
525
+ */
526
+ testID?: string;
527
+ }
528
+
529
+ type NativeTextFieldInstance = React.ComponentRef<typeof NativeTextField>;
530
+
531
+ const TOOLBAR_ITEM: NativeToolbarItem = {
532
+ kind: 'button',
533
+ itemId: '',
534
+ title: '',
535
+ systemItem: '',
536
+ ...NO_ICON,
537
+ prominent: 'false',
538
+ accessibilityLabel: '',
539
+ testID: '',
540
+ };
541
+
542
+ /** The keyboard toolbar as flat items: yours, then a Done button at the end. */
543
+ function toolbarItems(
544
+ toolbar: TextFieldKeyboardToolbar | undefined
545
+ ): NativeToolbarItem[] {
546
+ if (toolbar == null) return [];
547
+ const items = (toolbar.items ?? []).map((item): NativeToolbarItem =>
548
+ item === 'flexibleSpace'
549
+ ? { ...TOOLBAR_ITEM, kind: 'flexibleSpace' }
550
+ : {
551
+ ...TOOLBAR_ITEM,
552
+ itemId: item.id,
553
+ title: item.title ?? '',
554
+ systemItem: item.systemItem ?? '',
555
+ ...resolveIcon(item.icon),
556
+ prominent: item.prominent ? 'true' : 'false',
557
+ accessibilityLabel: item.accessibilityLabel ?? '',
558
+ testID: item.testID ?? '',
559
+ }
560
+ );
561
+ if (toolbar.done) {
562
+ if (items[items.length - 1]?.kind !== 'flexibleSpace') {
563
+ items.push({ ...TOOLBAR_ITEM, kind: 'flexibleSpace' });
564
+ }
565
+ items.push({
566
+ ...TOOLBAR_ITEM,
567
+ kind: 'done',
568
+ title: typeof toolbar.done === 'string' ? toolbar.done : '',
569
+ prominent: 'true',
570
+ testID: toolbar.doneTestID ?? '',
571
+ });
572
+ }
573
+ return items;
574
+ }
575
+
576
+ export const TextField = forwardRef<TextFieldRef, TextFieldProps>(
577
+ function TextFieldComponent(props, ref): React.ReactElement {
578
+ const {
579
+ value,
580
+ defaultValue,
581
+ onChangeText,
582
+ onChange,
583
+ onFocus,
584
+ onBlur,
585
+ onSubmitEditing,
586
+ submitBehavior,
587
+ onSelectionChange,
588
+ selection,
589
+ label,
590
+ placeholder,
591
+ supportingText,
592
+ error,
593
+ prefix,
594
+ suffix,
595
+ leadingIcon,
596
+ trailingIcon,
597
+ onTrailingIconPress,
598
+ leadingIconTestID,
599
+ leadingIconAccessibilityLabel,
600
+ trailingIconTestID,
601
+ trailingIconAccessibilityLabel,
602
+ onPress,
603
+ activeColor,
604
+ outlineColor,
605
+ errorColor,
606
+ containerColor,
607
+ textColor,
608
+ placeholderTextColor,
609
+ maxFontSizeMultiplier,
610
+ textAlign,
611
+ minLines,
612
+ maxLines,
613
+ clearButtonMode,
614
+ passwordToggle,
615
+ showCharacterCount,
616
+ maxLength,
617
+ keyboardType,
618
+ returnKeyType,
619
+ autoCapitalize,
620
+ autoCorrect,
621
+ secureTextEntry,
622
+ multiline,
623
+ editable,
624
+ autoFocus,
625
+ selectTextOnFocus,
626
+ autoComplete,
627
+ keyboardAppearance,
628
+ textStyle,
629
+ accessibilityLabel,
630
+ ios,
631
+ android,
632
+ ...viewProps
633
+ } = props;
634
+
635
+ const nativeRef = useRef<NativeTextFieldInstance>(null);
636
+ const focused = useRef(false);
637
+
638
+ // The same synchronization as React Native's TextInput: every native edit
639
+ // reports an event count, and a controlled value is pushed with the last
640
+ // count JS has seen. Native drops the update when the user has typed
641
+ // since, and the edit that follows brings JS back in line.
642
+ const [mostRecentEventCount, setMostRecentEventCount] = useState(0);
643
+ const eventCountRef = useRef(0);
644
+ const [lastNativeText, setLastNativeText] = useState<string | undefined>(
645
+ value ?? defaultValue
646
+ );
647
+ // The selection last reported by native or pushed from here; a
648
+ // `selection` prop that differs from it is pushed, the same way
649
+ const [lastNativeSelection, setLastNativeSelection] =
650
+ useState<TextFieldSelection | null>(null);
651
+
652
+ // Registered like a TextInput, so Keyboard.dismiss() and the ScrollView
653
+ // keyboard props treat the field as one (see focusRegistry.ts)
654
+ useLayoutEffect(() => {
655
+ const node = nativeRef.current;
656
+ if (node == null) return undefined;
657
+ focusRegistry.register(node);
658
+ return () => focusRegistry.unregister(node);
659
+ }, []);
660
+
661
+ // Text first, then the selection, which may point into the new text
662
+ const selectionStart = selection?.start;
663
+ const selectionEnd = selection?.end ?? selectionStart;
664
+ useLayoutEffect(() => {
665
+ const node = nativeRef.current;
666
+ if (typeof value === 'string' && value !== lastNativeText) {
667
+ setLastNativeText(value);
668
+ if (node != null) {
669
+ Commands.setText(node, mostRecentEventCount, value);
670
+ }
671
+ }
672
+ if (
673
+ selectionStart != null &&
674
+ selectionEnd != null &&
675
+ (lastNativeSelection?.start !== selectionStart ||
676
+ lastNativeSelection?.end !== selectionEnd)
677
+ ) {
678
+ setLastNativeSelection({ start: selectionStart, end: selectionEnd });
679
+ if (node != null) {
680
+ Commands.setSelection(
681
+ node,
682
+ mostRecentEventCount,
683
+ selectionStart,
684
+ selectionEnd
685
+ );
686
+ }
687
+ }
688
+ }, [
689
+ value,
690
+ lastNativeText,
691
+ mostRecentEventCount,
692
+ selectionStart,
693
+ selectionEnd,
694
+ lastNativeSelection,
695
+ ]);
696
+
697
+ useImperativeHandle(
698
+ ref,
699
+ () => ({
700
+ focus: () => {
701
+ const node = nativeRef.current;
702
+ if (node != null) Commands.focus(node);
703
+ },
704
+ blur: () => {
705
+ const node = nativeRef.current;
706
+ if (node != null) Commands.blur(node);
707
+ },
708
+ clear: () => {
709
+ const node = nativeRef.current;
710
+ if (node != null) Commands.clear(node);
711
+ },
712
+ isFocused: () => focused.current,
713
+ setSelection: (start: number, end?: number) => {
714
+ const node = nativeRef.current;
715
+ if (node != null) {
716
+ Commands.setSelection(
717
+ node,
718
+ eventCountRef.current,
719
+ start,
720
+ end ?? start
721
+ );
722
+ }
723
+ },
724
+ }),
725
+ []
726
+ );
727
+
728
+ const handleChange = useCallback(
729
+ (event: NativeSyntheticEvent<NativeChangeEvent>) => {
730
+ const { text, eventCount } = event.nativeEvent;
731
+ eventCountRef.current = eventCount;
732
+ setMostRecentEventCount(eventCount);
733
+ setLastNativeText(text);
734
+ onChange?.(event);
735
+ onChangeText?.(text);
736
+ },
737
+ [onChange, onChangeText]
738
+ );
739
+
740
+ const handleFocus = useCallback(
741
+ (event: NativeSyntheticEvent<NativeTextEvent>) => {
742
+ focused.current = true;
743
+ focusRegistry.focused(nativeRef.current);
744
+ onFocus?.(event);
745
+ },
746
+ [onFocus]
747
+ );
748
+
749
+ const handleBlur = useCallback(
750
+ (event: NativeSyntheticEvent<NativeTextEvent>) => {
751
+ focused.current = false;
752
+ focusRegistry.blurred(nativeRef.current);
753
+ onBlur?.(event);
754
+ },
755
+ [onBlur]
756
+ );
757
+
758
+ const handleSubmit = useCallback(
759
+ (event: NativeSyntheticEvent<NativeTextEvent>) => {
760
+ onSubmitEditing?.(event);
761
+ },
762
+ [onSubmitEditing]
763
+ );
764
+
765
+ const handleSelectionChange = useCallback(
766
+ (event: NativeSyntheticEvent<NativeSelectionEvent>) => {
767
+ const { start, end } = event.nativeEvent;
768
+ setLastNativeSelection({ start, end });
769
+ onSelectionChange?.({
770
+ ...event,
771
+ nativeEvent: { selection: { start, end } },
772
+ });
773
+ },
774
+ [onSelectionChange]
775
+ );
776
+
777
+ const onToolbarItemPress = ios?.keyboardToolbar?.onItemPress;
778
+ const handleToolbarPress = useCallback(
779
+ (event: NativeSyntheticEvent<NativeToolbarPressEvent>) => {
780
+ onToolbarItemPress?.(event.nativeEvent.itemId);
781
+ },
782
+ [onToolbarItemPress]
783
+ );
784
+
785
+ const handleTrailingIconPress = useCallback(() => {
786
+ onTrailingIconPress?.();
787
+ }, [onTrailingIconPress]);
788
+
789
+ const handlePress = useCallback(() => {
790
+ onPress?.();
791
+ }, [onPress]);
792
+
793
+ // A read-only field with onPress acts as a button
794
+ const pressable = editable === false && onPress != null;
795
+
796
+ const nativeLeadingIcon = useMemo(
797
+ () => resolveIcon(leadingIcon),
798
+ [leadingIcon]
799
+ );
800
+ const nativeTrailingIcon = useMemo(
801
+ () => resolveIcon(trailingIcon),
802
+ [trailingIcon]
803
+ );
804
+ const nativeTextStyle = useMemo(
805
+ () => normalizeLabelStyle(textStyle),
806
+ [textStyle]
807
+ );
808
+
809
+ const nativeIOS = useMemo(
810
+ () => ({
811
+ writingTools: ios?.writingTools ?? '',
812
+ inlinePrediction: ios?.inlinePrediction ?? '',
813
+ smartQuotes: ios?.smartQuotes ?? '',
814
+ smartDashes: ios?.smartDashes ?? '',
815
+ smartInsertDelete: ios?.smartInsertDelete ?? '',
816
+ mathExpressionCompletion: ios?.mathExpressionCompletion ?? '',
817
+ borderStyle: ios?.borderStyle ?? '',
818
+ labelPlacement: ios?.labelPlacement ?? '',
819
+ labelWidth: ios?.labelWidth ?? 0,
820
+ passwordRules: ios?.passwordRules ?? '',
821
+ }),
822
+ [ios]
823
+ );
824
+
825
+ const nativeToolbarItems = useMemo(
826
+ () => toolbarItems(ios?.keyboardToolbar),
827
+ [ios?.keyboardToolbar]
828
+ );
829
+
830
+ const nativeAndroid = useMemo(
831
+ () => ({
832
+ material: android?.material ?? 'm3',
833
+ variant: android?.variant ?? 'outlined',
834
+ density: android?.dense ? 'dense' : 'standard',
835
+ }),
836
+ [android]
837
+ );
838
+
839
+ return (
840
+ <NativeTextField
841
+ ref={nativeRef}
842
+ initialText={value ?? defaultValue ?? ''}
843
+ label={label ?? ''}
844
+ placeholder={placeholder ?? ''}
845
+ supportingText={supportingText ?? ''}
846
+ errorState={error ? 'error' : 'none'}
847
+ errorText={typeof error === 'string' ? error : ''}
848
+ prefix={prefix ?? ''}
849
+ suffix={suffix ?? ''}
850
+ leadingIcon={nativeLeadingIcon}
851
+ trailingIcon={nativeTrailingIcon}
852
+ clearButtonMode={clearButtonMode ?? 'never'}
853
+ passwordToggle={passwordToggle ? 'shown' : 'hidden'}
854
+ characterCount={showCharacterCount ? 'shown' : 'hidden'}
855
+ maxLength={maxLength ?? 0}
856
+ keyboardType={keyboardType ?? 'default'}
857
+ returnKeyType={returnKeyType ?? 'default'}
858
+ autoCapitalize={autoCapitalize ?? 'sentences'}
859
+ autoCorrect={autoCorrect === false ? 'disabled' : 'enabled'}
860
+ secureTextEntry={secureTextEntry ? 'secure' : 'plain'}
861
+ lines={multiline ? 'multiline' : 'single'}
862
+ submitBehavior={resolveSubmitBehavior(submitBehavior, multiline)}
863
+ keyboardToolbarItems={nativeToolbarItems}
864
+ interactivity={editable === false ? 'disabled' : 'enabled'}
865
+ autoFocus={autoFocus ? 'focus' : 'none'}
866
+ selectTextOnFocus={selectTextOnFocus ? 'select' : 'keep'}
867
+ autoComplete={autoComplete ?? ''}
868
+ keyboardAppearance={keyboardAppearance ?? 'default'}
869
+ textStyle={nativeTextStyle}
870
+ spokenLabel={accessibilityLabel ?? ''}
871
+ leadingIconTestID={leadingIconTestID ?? ''}
872
+ leadingIconSpokenLabel={leadingIconAccessibilityLabel ?? ''}
873
+ trailingIconTestID={trailingIconTestID ?? ''}
874
+ trailingIconSpokenLabel={trailingIconAccessibilityLabel ?? ''}
875
+ activeColor={activeColor}
876
+ outlineColor={outlineColor}
877
+ errorColor={errorColor}
878
+ containerColor={containerColor}
879
+ textColor={textColor}
880
+ placeholderTextColor={placeholderTextColor}
881
+ maxFontSizeMultiplier={maxFontSizeMultiplier ?? 0}
882
+ textAlign={textAlign ?? ''}
883
+ minLines={minLines ?? 0}
884
+ maxLines={maxLines ?? 0}
885
+ pressMode={pressable ? 'button' : 'none'}
886
+ ios={nativeIOS}
887
+ android={nativeAndroid}
888
+ onFieldChange={handleChange}
889
+ onFieldFocus={handleFocus}
890
+ onFieldBlur={handleBlur}
891
+ onFieldSubmit={onSubmitEditing ? handleSubmit : undefined}
892
+ onFieldSelectionChange={
893
+ onSelectionChange || selection ? handleSelectionChange : undefined
894
+ }
895
+ onKeyboardToolbarPress={
896
+ onToolbarItemPress ? handleToolbarPress : undefined
897
+ }
898
+ onTrailingIconPress={
899
+ onTrailingIconPress ? handleTrailingIconPress : undefined
900
+ }
901
+ onFieldPress={pressable ? handlePress : undefined}
902
+ {...viewProps}
903
+ />
904
+ );
905
+ }
906
+ );
907
+
908
+ TextField.displayName = 'TextField';