react-native-platform-components 1.4.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 (598) hide show
  1. package/PlatformComponents.podspec +1 -1
  2. package/README.md +33 -31
  3. package/android/src/main/java/com/platformcomponents/PCButtonGroupView.kt +175 -9
  4. package/android/src/main/java/com/platformcomponents/PCButtonGroupViewManager.kt +52 -2
  5. package/android/src/main/java/com/platformcomponents/PCButtonSupport.kt +44 -12
  6. package/android/src/main/java/com/platformcomponents/PCButtonView.kt +187 -5
  7. package/android/src/main/java/com/platformcomponents/PCButtonViewManager.kt +85 -7
  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 +6 -1
  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 +132 -0
  16. package/android/src/main/java/com/platformcomponents/PCFloatingToolbarViewManager.kt +8 -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 +24 -14
  28. package/android/src/main/java/com/platformcomponents/PCSegmentedControlViewManager.kt +14 -2
  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 +415 -40
  34. package/android/src/main/java/com/platformcomponents/PCTextFieldViewManager.kt +109 -3
  35. package/android/src/main/java/com/platformcomponents/PCThemeSupport.kt +37 -0
  36. package/android/src/main/java/com/platformcomponents/PlatformComponentsPackage.kt +4 -0
  37. package/android/src/main/res/drawable/pc_ic_search.xml +12 -0
  38. package/android/src/main/res/values/ids.xml +5 -0
  39. package/android/src/main/res/values/styles.xml +24 -0
  40. package/ios/PCButton.mm +122 -7
  41. package/ios/PCButtonGroup.mm +68 -1
  42. package/ios/PCButtonGroupView.swift +225 -6
  43. package/ios/PCButtonSupport.swift +181 -10
  44. package/ios/PCButtonView.swift +297 -14
  45. package/ios/PCConstants.swift +23 -2
  46. package/ios/PCContextMenu.mm +28 -110
  47. package/ios/PCContextMenu.swift +106 -167
  48. package/ios/PCDatePicker.mm +21 -9
  49. package/ios/PCDatePickerView.swift +94 -20
  50. package/ios/PCFloatingActionButton.h +10 -0
  51. package/ios/PCFloatingActionButton.mm +177 -0
  52. package/ios/PCFloatingActionButtonView.swift +426 -0
  53. package/ios/PCFloatingToolbar.mm +27 -0
  54. package/ios/PCFloatingToolbarView.swift +241 -0
  55. package/ios/PCHaptics.swift +91 -0
  56. package/ios/PCImageLoader.swift +76 -12
  57. package/ios/PCLiquidGlass.mm +36 -0
  58. package/ios/PCLiquidGlass.swift +221 -114
  59. package/ios/PCLiquidGlassContainer.h +10 -0
  60. package/ios/PCLiquidGlassContainer.mm +84 -0
  61. package/ios/PCLiquidGlassContainer.swift +69 -0
  62. package/ios/PCMenuItems.h +76 -0
  63. package/ios/PCMenuSupport.swift +350 -0
  64. package/ios/PCNavigationRail.h +10 -0
  65. package/ios/PCNavigationRail.mm +270 -0
  66. package/ios/PCNavigationRailView.swift +415 -0
  67. package/ios/PCSegmentedControl.mm +17 -2
  68. package/ios/PCSegmentedControl.swift +57 -7
  69. package/ios/PCSelectionMenu.mm +36 -8
  70. package/ios/PCSelectionMenu.swift +224 -48
  71. package/ios/PCTabBar.h +10 -0
  72. package/ios/PCTabBar.mm +285 -0
  73. package/ios/PCTabBarAccessory.h +10 -0
  74. package/ios/PCTabBarAccessory.mm +93 -0
  75. package/ios/PCTabBarAccessoryView.swift +96 -0
  76. package/ios/PCTabBarView.swift +671 -0
  77. package/ios/PCTextField.mm +159 -4
  78. package/ios/PCTextFieldView.swift +603 -57
  79. package/lib/commonjs/Button.js +73 -1
  80. package/lib/commonjs/Button.js.map +1 -1
  81. package/lib/commonjs/ButtonGroup.js +13 -3
  82. package/lib/commonjs/ButtonGroup.js.map +1 -1
  83. package/lib/commonjs/ButtonGroupNativeComponent.ts +74 -4
  84. package/lib/commonjs/ButtonNativeComponent.ts +119 -3
  85. package/lib/commonjs/ContextMenu.js +9 -48
  86. package/lib/commonjs/ContextMenu.js.map +1 -1
  87. package/lib/commonjs/ContextMenuNativeComponent.ts +47 -49
  88. package/lib/commonjs/DatePicker.js +98 -2
  89. package/lib/commonjs/DatePicker.js.map +1 -1
  90. package/lib/commonjs/DatePickerNativeComponent.ts +19 -2
  91. package/lib/commonjs/FloatingActionButton.js +60 -0
  92. package/lib/commonjs/FloatingActionButton.js.map +1 -0
  93. package/lib/commonjs/FloatingActionButtonNativeComponent.ts +58 -0
  94. package/lib/commonjs/FloatingToolbar.js +9 -1
  95. package/lib/commonjs/FloatingToolbar.js.map +1 -1
  96. package/lib/commonjs/FloatingToolbarNativeComponent.ts +16 -0
  97. package/lib/commonjs/LiquidGlass.js +7 -1
  98. package/lib/commonjs/LiquidGlass.js.map +1 -1
  99. package/lib/commonjs/LiquidGlassContainer.js +32 -0
  100. package/lib/commonjs/LiquidGlassContainer.js.map +1 -0
  101. package/lib/commonjs/LiquidGlassContainerNativeComponent.ts +17 -0
  102. package/lib/commonjs/LiquidGlassNativeComponent.ts +8 -0
  103. package/lib/commonjs/NavigationRail.js +104 -0
  104. package/lib/commonjs/NavigationRail.js.map +1 -0
  105. package/lib/commonjs/NavigationRailNativeComponent.ts +107 -0
  106. package/lib/commonjs/PlatformComponentsProvider.js +18 -0
  107. package/lib/commonjs/PlatformComponentsProvider.js.map +1 -0
  108. package/lib/commonjs/SegmentedControl.js +7 -0
  109. package/lib/commonjs/SegmentedControl.js.map +1 -1
  110. package/lib/commonjs/SegmentedControlNativeComponent.ts +11 -0
  111. package/lib/commonjs/SelectionMenu.js +27 -3
  112. package/lib/commonjs/SelectionMenu.js.map +1 -1
  113. package/lib/commonjs/SelectionMenuNativeComponent.ts +26 -4
  114. package/lib/commonjs/SplitButton.js +98 -0
  115. package/lib/commonjs/SplitButton.js.map +1 -0
  116. package/lib/commonjs/TabBar.js +203 -0
  117. package/lib/commonjs/TabBar.js.map +1 -0
  118. package/lib/commonjs/TabBarAccessoryNativeComponent.ts +19 -0
  119. package/lib/commonjs/TabBarNativeComponent.ts +145 -0
  120. package/lib/commonjs/TextField.js +171 -8
  121. package/lib/commonjs/TextField.js.map +1 -1
  122. package/lib/commonjs/TextFieldNativeComponent.ts +110 -4
  123. package/lib/commonjs/focusRegistry.js +2 -1
  124. package/lib/commonjs/focusRegistry.js.map +1 -1
  125. package/lib/commonjs/haptics.js +2 -0
  126. package/lib/commonjs/haptics.js.map +1 -0
  127. package/lib/commonjs/icons.js +15 -1
  128. package/lib/commonjs/icons.js.map +1 -1
  129. package/lib/commonjs/index.js +77 -0
  130. package/lib/commonjs/index.js.map +1 -1
  131. package/lib/commonjs/index.web.js +156 -92
  132. package/lib/commonjs/index.web.js.map +1 -1
  133. package/lib/commonjs/jest.js +910 -0
  134. package/lib/commonjs/jest.js.map +1 -0
  135. package/lib/commonjs/menuItems.js +68 -0
  136. package/lib/commonjs/menuItems.js.map +1 -0
  137. package/lib/commonjs/selectionIdentifiers.js +18 -0
  138. package/lib/commonjs/selectionIdentifiers.js.map +1 -0
  139. package/lib/commonjs/submitBehavior.js +19 -0
  140. package/lib/commonjs/submitBehavior.js.map +1 -0
  141. package/lib/commonjs/tabItems.js +49 -0
  142. package/lib/commonjs/tabItems.js.map +1 -0
  143. package/lib/commonjs/web/Button.js +170 -0
  144. package/lib/commonjs/web/Button.js.map +1 -0
  145. package/lib/commonjs/web/ButtonGroup.js +119 -0
  146. package/lib/commonjs/web/ButtonGroup.js.map +1 -0
  147. package/lib/commonjs/web/DatePicker.js +168 -0
  148. package/lib/commonjs/web/DatePicker.js.map +1 -0
  149. package/lib/commonjs/web/DateRangePicker.js +137 -0
  150. package/lib/commonjs/web/DateRangePicker.js.map +1 -0
  151. package/lib/commonjs/web/Dialog.js +54 -0
  152. package/lib/commonjs/web/Dialog.js.map +1 -0
  153. package/lib/commonjs/web/FloatingActionButton.js +98 -0
  154. package/lib/commonjs/web/FloatingActionButton.js.map +1 -0
  155. package/lib/commonjs/web/Icon.js +34 -0
  156. package/lib/commonjs/web/Icon.js.map +1 -0
  157. package/lib/commonjs/web/NativeTheme.js +28 -0
  158. package/lib/commonjs/web/NativeTheme.js.map +1 -0
  159. package/lib/commonjs/web/NavigationRail.js +139 -0
  160. package/lib/commonjs/web/NavigationRail.js.map +1 -0
  161. package/lib/commonjs/web/PlatformComponentsProvider.js +51 -0
  162. package/lib/commonjs/web/PlatformComponentsProvider.js.map +1 -0
  163. package/lib/commonjs/web/SegmentedControl.js +117 -0
  164. package/lib/commonjs/web/SegmentedControl.js.map +1 -0
  165. package/lib/commonjs/web/SelectionMenu.js +142 -0
  166. package/lib/commonjs/web/SelectionMenu.js.map +1 -0
  167. package/lib/commonjs/web/SplitButton.js +35 -0
  168. package/lib/commonjs/web/SplitButton.js.map +1 -0
  169. package/lib/commonjs/web/TabBar.js +131 -0
  170. package/lib/commonjs/web/TabBar.js.map +1 -0
  171. package/lib/commonjs/web/TextField.js +322 -0
  172. package/lib/commonjs/web/TextField.js.map +1 -0
  173. package/lib/commonjs/web/components.js +36 -0
  174. package/lib/commonjs/web/components.js.map +1 -0
  175. package/lib/commonjs/web/containers.js +121 -0
  176. package/lib/commonjs/web/containers.js.map +1 -0
  177. package/lib/commonjs/web/dateInput.js +116 -0
  178. package/lib/commonjs/web/dateInput.js.map +1 -0
  179. package/lib/commonjs/web/shared.js +192 -0
  180. package/lib/commonjs/web/shared.js.map +1 -0
  181. package/lib/commonjs/webComponents.js +6 -0
  182. package/lib/commonjs/webComponents.js.map +1 -0
  183. package/lib/module/Button.js +74 -2
  184. package/lib/module/Button.js.map +1 -1
  185. package/lib/module/ButtonGroup.js +13 -3
  186. package/lib/module/ButtonGroup.js.map +1 -1
  187. package/lib/module/ButtonGroupNativeComponent.ts +74 -4
  188. package/lib/module/ButtonNativeComponent.ts +119 -3
  189. package/lib/module/ContextMenu.js +9 -48
  190. package/lib/module/ContextMenu.js.map +1 -1
  191. package/lib/module/ContextMenuNativeComponent.ts +47 -49
  192. package/lib/module/DatePicker.js +98 -4
  193. package/lib/module/DatePicker.js.map +1 -1
  194. package/lib/module/DatePickerNativeComponent.ts +19 -2
  195. package/lib/module/FloatingActionButton.js +53 -0
  196. package/lib/module/FloatingActionButton.js.map +1 -0
  197. package/lib/module/FloatingActionButtonNativeComponent.ts +58 -0
  198. package/lib/module/FloatingToolbar.js +9 -1
  199. package/lib/module/FloatingToolbar.js.map +1 -1
  200. package/lib/module/FloatingToolbarNativeComponent.ts +16 -0
  201. package/lib/module/LiquidGlass.js +7 -1
  202. package/lib/module/LiquidGlass.js.map +1 -1
  203. package/lib/module/LiquidGlassContainer.js +26 -0
  204. package/lib/module/LiquidGlassContainer.js.map +1 -0
  205. package/lib/module/LiquidGlassContainerNativeComponent.ts +17 -0
  206. package/lib/module/LiquidGlassNativeComponent.ts +8 -0
  207. package/lib/module/NavigationRail.js +99 -0
  208. package/lib/module/NavigationRail.js.map +1 -0
  209. package/lib/module/NavigationRailNativeComponent.ts +107 -0
  210. package/lib/module/PlatformComponentsProvider.js +13 -0
  211. package/lib/module/PlatformComponentsProvider.js.map +1 -0
  212. package/lib/module/SegmentedControl.js +9 -1
  213. package/lib/module/SegmentedControl.js.map +1 -1
  214. package/lib/module/SegmentedControlNativeComponent.ts +11 -0
  215. package/lib/module/SelectionMenu.js +27 -3
  216. package/lib/module/SelectionMenu.js.map +1 -1
  217. package/lib/module/SelectionMenuNativeComponent.ts +26 -4
  218. package/lib/module/SplitButton.js +91 -0
  219. package/lib/module/SplitButton.js.map +1 -0
  220. package/lib/module/TabBar.js +196 -0
  221. package/lib/module/TabBar.js.map +1 -0
  222. package/lib/module/TabBarAccessoryNativeComponent.ts +19 -0
  223. package/lib/module/TabBarNativeComponent.ts +145 -0
  224. package/lib/module/TextField.js +172 -9
  225. package/lib/module/TextField.js.map +1 -1
  226. package/lib/module/TextFieldNativeComponent.ts +110 -4
  227. package/lib/module/focusRegistry.js +1 -0
  228. package/lib/module/focusRegistry.js.map +1 -1
  229. package/lib/module/haptics.js +2 -0
  230. package/lib/module/haptics.js.map +1 -0
  231. package/lib/module/icons.js +15 -1
  232. package/lib/module/icons.js.map +1 -1
  233. package/lib/module/index.js +7 -0
  234. package/lib/module/index.js.map +1 -1
  235. package/lib/module/index.web.js +12 -87
  236. package/lib/module/index.web.js.map +1 -1
  237. package/lib/module/jest.js +840 -0
  238. package/lib/module/jest.js.map +1 -0
  239. package/lib/module/menuItems.js +65 -0
  240. package/lib/module/menuItems.js.map +1 -0
  241. package/lib/module/selectionIdentifiers.js +14 -0
  242. package/lib/module/selectionIdentifiers.js.map +1 -0
  243. package/lib/module/submitBehavior.js +15 -0
  244. package/lib/module/submitBehavior.js.map +1 -0
  245. package/lib/module/tabItems.js +45 -0
  246. package/lib/module/tabItems.js.map +1 -0
  247. package/lib/module/web/Button.js +164 -0
  248. package/lib/module/web/Button.js.map +1 -0
  249. package/lib/module/web/ButtonGroup.js +113 -0
  250. package/lib/module/web/ButtonGroup.js.map +1 -0
  251. package/lib/module/web/DatePicker.js +162 -0
  252. package/lib/module/web/DatePicker.js.map +1 -0
  253. package/lib/module/web/DateRangePicker.js +131 -0
  254. package/lib/module/web/DateRangePicker.js.map +1 -0
  255. package/lib/module/web/Dialog.js +48 -0
  256. package/lib/module/web/Dialog.js.map +1 -0
  257. package/lib/module/web/FloatingActionButton.js +94 -0
  258. package/lib/module/web/FloatingActionButton.js.map +1 -0
  259. package/lib/module/web/Icon.js +29 -0
  260. package/lib/module/web/Icon.js.map +1 -0
  261. package/lib/module/web/NativeTheme.js +23 -0
  262. package/lib/module/web/NativeTheme.js.map +1 -0
  263. package/lib/module/web/NavigationRail.js +133 -0
  264. package/lib/module/web/NavigationRail.js.map +1 -0
  265. package/lib/module/web/PlatformComponentsProvider.js +44 -0
  266. package/lib/module/web/PlatformComponentsProvider.js.map +1 -0
  267. package/lib/module/web/SegmentedControl.js +112 -0
  268. package/lib/module/web/SegmentedControl.js.map +1 -0
  269. package/lib/module/web/SelectionMenu.js +137 -0
  270. package/lib/module/web/SelectionMenu.js.map +1 -0
  271. package/lib/module/web/SplitButton.js +30 -0
  272. package/lib/module/web/SplitButton.js.map +1 -0
  273. package/lib/module/web/TabBar.js +126 -0
  274. package/lib/module/web/TabBar.js.map +1 -0
  275. package/lib/module/web/TextField.js +316 -0
  276. package/lib/module/web/TextField.js.map +1 -0
  277. package/lib/module/web/components.js +33 -0
  278. package/lib/module/web/components.js.map +1 -0
  279. package/lib/module/web/containers.js +112 -0
  280. package/lib/module/web/containers.js.map +1 -0
  281. package/lib/module/web/dateInput.js +109 -0
  282. package/lib/module/web/dateInput.js.map +1 -0
  283. package/lib/module/web/shared.js +179 -0
  284. package/lib/module/web/shared.js.map +1 -0
  285. package/lib/module/webComponents.js +4 -0
  286. package/lib/module/webComponents.js.map +1 -0
  287. package/lib/typescript/commonjs/docs/sidebars.d.ts.map +1 -1
  288. package/lib/typescript/commonjs/src/Button.d.ts +111 -3
  289. package/lib/typescript/commonjs/src/Button.d.ts.map +1 -1
  290. package/lib/typescript/commonjs/src/ButtonGroup.d.ts +21 -6
  291. package/lib/typescript/commonjs/src/ButtonGroup.d.ts.map +1 -1
  292. package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts +64 -3
  293. package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts.map +1 -1
  294. package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts +94 -3
  295. package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts.map +1 -1
  296. package/lib/typescript/commonjs/src/ContextMenu.d.ts +20 -33
  297. package/lib/typescript/commonjs/src/ContextMenu.d.ts.map +1 -1
  298. package/lib/typescript/commonjs/src/ContextMenuNativeComponent.d.ts +45 -47
  299. package/lib/typescript/commonjs/src/ContextMenuNativeComponent.d.ts.map +1 -1
  300. package/lib/typescript/commonjs/src/DatePicker.d.ts +74 -1
  301. package/lib/typescript/commonjs/src/DatePicker.d.ts.map +1 -1
  302. package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts +16 -1
  303. package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts.map +1 -1
  304. package/lib/typescript/commonjs/src/FloatingActionButton.d.ts +67 -0
  305. package/lib/typescript/commonjs/src/FloatingActionButton.d.ts.map +1 -0
  306. package/lib/typescript/commonjs/src/FloatingActionButtonNativeComponent.d.ts +43 -0
  307. package/lib/typescript/commonjs/src/FloatingActionButtonNativeComponent.d.ts.map +1 -0
  308. package/lib/typescript/commonjs/src/FloatingToolbar.d.ts +30 -0
  309. package/lib/typescript/commonjs/src/FloatingToolbar.d.ts.map +1 -1
  310. package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts +12 -0
  311. package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts.map +1 -1
  312. package/lib/typescript/commonjs/src/LiquidGlass.d.ts +17 -0
  313. package/lib/typescript/commonjs/src/LiquidGlass.d.ts.map +1 -1
  314. package/lib/typescript/commonjs/src/LiquidGlassContainer.d.ts +27 -0
  315. package/lib/typescript/commonjs/src/LiquidGlassContainer.d.ts.map +1 -0
  316. package/lib/typescript/commonjs/src/LiquidGlassContainerNativeComponent.d.ts +13 -0
  317. package/lib/typescript/commonjs/src/LiquidGlassContainerNativeComponent.d.ts.map +1 -0
  318. package/lib/typescript/commonjs/src/LiquidGlassNativeComponent.d.ts +7 -0
  319. package/lib/typescript/commonjs/src/LiquidGlassNativeComponent.d.ts.map +1 -1
  320. package/lib/typescript/commonjs/src/NavigationRail.d.ts +86 -0
  321. package/lib/typescript/commonjs/src/NavigationRail.d.ts.map +1 -0
  322. package/lib/typescript/commonjs/src/NavigationRailNativeComponent.d.ts +81 -0
  323. package/lib/typescript/commonjs/src/NavigationRailNativeComponent.d.ts.map +1 -0
  324. package/lib/typescript/commonjs/src/PlatformComponentsProvider.d.ts +6 -0
  325. package/lib/typescript/commonjs/src/PlatformComponentsProvider.d.ts.map +1 -0
  326. package/lib/typescript/commonjs/src/SegmentedControl.d.ts +18 -1
  327. package/lib/typescript/commonjs/src/SegmentedControl.d.ts.map +1 -1
  328. package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts +9 -0
  329. package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts.map +1 -1
  330. package/lib/typescript/commonjs/src/SelectionMenu.d.ts +44 -2
  331. package/lib/typescript/commonjs/src/SelectionMenu.d.ts.map +1 -1
  332. package/lib/typescript/commonjs/src/SelectionMenuNativeComponent.d.ts +20 -4
  333. package/lib/typescript/commonjs/src/SelectionMenuNativeComponent.d.ts.map +1 -1
  334. package/lib/typescript/commonjs/src/SplitButton.d.ts +83 -0
  335. package/lib/typescript/commonjs/src/SplitButton.d.ts.map +1 -0
  336. package/lib/typescript/commonjs/src/TabBar.d.ts +144 -0
  337. package/lib/typescript/commonjs/src/TabBar.d.ts.map +1 -0
  338. package/lib/typescript/commonjs/src/TabBarAccessoryNativeComponent.d.ts +13 -0
  339. package/lib/typescript/commonjs/src/TabBarAccessoryNativeComponent.d.ts.map +1 -0
  340. package/lib/typescript/commonjs/src/TabBarNativeComponent.d.ts +110 -0
  341. package/lib/typescript/commonjs/src/TabBarNativeComponent.d.ts.map +1 -0
  342. package/lib/typescript/commonjs/src/TextField.d.ts +166 -8
  343. package/lib/typescript/commonjs/src/TextField.d.ts.map +1 -1
  344. package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts +81 -3
  345. package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts.map +1 -1
  346. package/lib/typescript/commonjs/src/focusRegistry.d.ts.map +1 -1
  347. package/lib/typescript/commonjs/src/haptics.d.ts +20 -0
  348. package/lib/typescript/commonjs/src/haptics.d.ts.map +1 -0
  349. package/lib/typescript/commonjs/src/icons.d.ts +7 -1
  350. package/lib/typescript/commonjs/src/icons.d.ts.map +1 -1
  351. package/lib/typescript/commonjs/src/index.d.ts +7 -0
  352. package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
  353. package/lib/typescript/commonjs/src/index.web.d.ts +25 -254
  354. package/lib/typescript/commonjs/src/index.web.d.ts.map +1 -1
  355. package/lib/typescript/commonjs/src/jest.d.ts +139 -0
  356. package/lib/typescript/commonjs/src/jest.d.ts.map +1 -0
  357. package/lib/typescript/commonjs/src/menuItems.d.ts +100 -0
  358. package/lib/typescript/commonjs/src/menuItems.d.ts.map +1 -0
  359. package/lib/typescript/commonjs/src/selectionIdentifiers.d.ts +3 -0
  360. package/lib/typescript/commonjs/src/selectionIdentifiers.d.ts.map +1 -0
  361. package/lib/typescript/commonjs/src/submitBehavior.d.ts +9 -0
  362. package/lib/typescript/commonjs/src/submitBehavior.d.ts.map +1 -0
  363. package/lib/typescript/commonjs/src/tabItems.d.ts +55 -0
  364. package/lib/typescript/commonjs/src/tabItems.d.ts.map +1 -0
  365. package/lib/typescript/commonjs/src/web/Button.d.ts +9 -0
  366. package/lib/typescript/commonjs/src/web/Button.d.ts.map +1 -0
  367. package/lib/typescript/commonjs/src/web/ButtonGroup.d.ts +11 -0
  368. package/lib/typescript/commonjs/src/web/ButtonGroup.d.ts.map +1 -0
  369. package/lib/typescript/commonjs/src/web/DatePicker.d.ts +14 -0
  370. package/lib/typescript/commonjs/src/web/DatePicker.d.ts.map +1 -0
  371. package/lib/typescript/commonjs/src/web/DateRangePicker.d.ts +11 -0
  372. package/lib/typescript/commonjs/src/web/DateRangePicker.d.ts.map +1 -0
  373. package/lib/typescript/commonjs/src/web/Dialog.d.ts +12 -0
  374. package/lib/typescript/commonjs/src/web/Dialog.d.ts.map +1 -0
  375. package/lib/typescript/commonjs/src/web/FloatingActionButton.d.ts +8 -0
  376. package/lib/typescript/commonjs/src/web/FloatingActionButton.d.ts.map +1 -0
  377. package/lib/typescript/commonjs/src/web/Icon.d.ts +12 -0
  378. package/lib/typescript/commonjs/src/web/Icon.d.ts.map +1 -0
  379. package/lib/typescript/commonjs/src/web/NativeTheme.d.ts +10 -0
  380. package/lib/typescript/commonjs/src/web/NativeTheme.d.ts.map +1 -0
  381. package/lib/typescript/commonjs/src/web/NavigationRail.d.ts +8 -0
  382. package/lib/typescript/commonjs/src/web/NavigationRail.d.ts.map +1 -0
  383. package/lib/typescript/commonjs/src/web/PlatformComponentsProvider.d.ts +10 -0
  384. package/lib/typescript/commonjs/src/web/PlatformComponentsProvider.d.ts.map +1 -0
  385. package/lib/typescript/commonjs/src/web/SegmentedControl.d.ts +8 -0
  386. package/lib/typescript/commonjs/src/web/SegmentedControl.d.ts.map +1 -0
  387. package/lib/typescript/commonjs/src/web/SelectionMenu.d.ts +10 -0
  388. package/lib/typescript/commonjs/src/web/SelectionMenu.d.ts.map +1 -0
  389. package/lib/typescript/commonjs/src/web/SplitButton.d.ts +9 -0
  390. package/lib/typescript/commonjs/src/web/SplitButton.d.ts.map +1 -0
  391. package/lib/typescript/commonjs/src/web/TabBar.d.ts +9 -0
  392. package/lib/typescript/commonjs/src/web/TabBar.d.ts.map +1 -0
  393. package/lib/typescript/commonjs/src/web/TextField.d.ts +9 -0
  394. package/lib/typescript/commonjs/src/web/TextField.d.ts.map +1 -0
  395. package/lib/typescript/commonjs/src/web/components.d.ts +17 -0
  396. package/lib/typescript/commonjs/src/web/components.d.ts.map +1 -0
  397. package/lib/typescript/commonjs/src/web/containers.d.ts +24 -0
  398. package/lib/typescript/commonjs/src/web/containers.d.ts.map +1 -0
  399. package/lib/typescript/commonjs/src/web/dateInput.d.ts +20 -0
  400. package/lib/typescript/commonjs/src/web/dateInput.d.ts.map +1 -0
  401. package/lib/typescript/commonjs/src/web/shared.d.ts +43 -0
  402. package/lib/typescript/commonjs/src/web/shared.d.ts.map +1 -0
  403. package/lib/typescript/commonjs/src/webComponents.d.ts +43 -0
  404. package/lib/typescript/commonjs/src/webComponents.d.ts.map +1 -0
  405. package/lib/typescript/module/docs/sidebars.d.ts.map +1 -1
  406. package/lib/typescript/module/src/Button.d.ts +111 -3
  407. package/lib/typescript/module/src/Button.d.ts.map +1 -1
  408. package/lib/typescript/module/src/ButtonGroup.d.ts +21 -6
  409. package/lib/typescript/module/src/ButtonGroup.d.ts.map +1 -1
  410. package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts +64 -3
  411. package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts.map +1 -1
  412. package/lib/typescript/module/src/ButtonNativeComponent.d.ts +94 -3
  413. package/lib/typescript/module/src/ButtonNativeComponent.d.ts.map +1 -1
  414. package/lib/typescript/module/src/ContextMenu.d.ts +20 -33
  415. package/lib/typescript/module/src/ContextMenu.d.ts.map +1 -1
  416. package/lib/typescript/module/src/ContextMenuNativeComponent.d.ts +45 -47
  417. package/lib/typescript/module/src/ContextMenuNativeComponent.d.ts.map +1 -1
  418. package/lib/typescript/module/src/DatePicker.d.ts +74 -1
  419. package/lib/typescript/module/src/DatePicker.d.ts.map +1 -1
  420. package/lib/typescript/module/src/DatePickerNativeComponent.d.ts +16 -1
  421. package/lib/typescript/module/src/DatePickerNativeComponent.d.ts.map +1 -1
  422. package/lib/typescript/module/src/FloatingActionButton.d.ts +67 -0
  423. package/lib/typescript/module/src/FloatingActionButton.d.ts.map +1 -0
  424. package/lib/typescript/module/src/FloatingActionButtonNativeComponent.d.ts +43 -0
  425. package/lib/typescript/module/src/FloatingActionButtonNativeComponent.d.ts.map +1 -0
  426. package/lib/typescript/module/src/FloatingToolbar.d.ts +30 -0
  427. package/lib/typescript/module/src/FloatingToolbar.d.ts.map +1 -1
  428. package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts +12 -0
  429. package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts.map +1 -1
  430. package/lib/typescript/module/src/LiquidGlass.d.ts +17 -0
  431. package/lib/typescript/module/src/LiquidGlass.d.ts.map +1 -1
  432. package/lib/typescript/module/src/LiquidGlassContainer.d.ts +27 -0
  433. package/lib/typescript/module/src/LiquidGlassContainer.d.ts.map +1 -0
  434. package/lib/typescript/module/src/LiquidGlassContainerNativeComponent.d.ts +13 -0
  435. package/lib/typescript/module/src/LiquidGlassContainerNativeComponent.d.ts.map +1 -0
  436. package/lib/typescript/module/src/LiquidGlassNativeComponent.d.ts +7 -0
  437. package/lib/typescript/module/src/LiquidGlassNativeComponent.d.ts.map +1 -1
  438. package/lib/typescript/module/src/NavigationRail.d.ts +86 -0
  439. package/lib/typescript/module/src/NavigationRail.d.ts.map +1 -0
  440. package/lib/typescript/module/src/NavigationRailNativeComponent.d.ts +81 -0
  441. package/lib/typescript/module/src/NavigationRailNativeComponent.d.ts.map +1 -0
  442. package/lib/typescript/module/src/PlatformComponentsProvider.d.ts +6 -0
  443. package/lib/typescript/module/src/PlatformComponentsProvider.d.ts.map +1 -0
  444. package/lib/typescript/module/src/SegmentedControl.d.ts +18 -1
  445. package/lib/typescript/module/src/SegmentedControl.d.ts.map +1 -1
  446. package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts +9 -0
  447. package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts.map +1 -1
  448. package/lib/typescript/module/src/SelectionMenu.d.ts +44 -2
  449. package/lib/typescript/module/src/SelectionMenu.d.ts.map +1 -1
  450. package/lib/typescript/module/src/SelectionMenuNativeComponent.d.ts +20 -4
  451. package/lib/typescript/module/src/SelectionMenuNativeComponent.d.ts.map +1 -1
  452. package/lib/typescript/module/src/SplitButton.d.ts +83 -0
  453. package/lib/typescript/module/src/SplitButton.d.ts.map +1 -0
  454. package/lib/typescript/module/src/TabBar.d.ts +144 -0
  455. package/lib/typescript/module/src/TabBar.d.ts.map +1 -0
  456. package/lib/typescript/module/src/TabBarAccessoryNativeComponent.d.ts +13 -0
  457. package/lib/typescript/module/src/TabBarAccessoryNativeComponent.d.ts.map +1 -0
  458. package/lib/typescript/module/src/TabBarNativeComponent.d.ts +110 -0
  459. package/lib/typescript/module/src/TabBarNativeComponent.d.ts.map +1 -0
  460. package/lib/typescript/module/src/TextField.d.ts +166 -8
  461. package/lib/typescript/module/src/TextField.d.ts.map +1 -1
  462. package/lib/typescript/module/src/TextFieldNativeComponent.d.ts +81 -3
  463. package/lib/typescript/module/src/TextFieldNativeComponent.d.ts.map +1 -1
  464. package/lib/typescript/module/src/focusRegistry.d.ts.map +1 -1
  465. package/lib/typescript/module/src/haptics.d.ts +20 -0
  466. package/lib/typescript/module/src/haptics.d.ts.map +1 -0
  467. package/lib/typescript/module/src/icons.d.ts +7 -1
  468. package/lib/typescript/module/src/icons.d.ts.map +1 -1
  469. package/lib/typescript/module/src/index.d.ts +7 -0
  470. package/lib/typescript/module/src/index.d.ts.map +1 -1
  471. package/lib/typescript/module/src/index.web.d.ts +25 -254
  472. package/lib/typescript/module/src/index.web.d.ts.map +1 -1
  473. package/lib/typescript/module/src/jest.d.ts +139 -0
  474. package/lib/typescript/module/src/jest.d.ts.map +1 -0
  475. package/lib/typescript/module/src/menuItems.d.ts +100 -0
  476. package/lib/typescript/module/src/menuItems.d.ts.map +1 -0
  477. package/lib/typescript/module/src/selectionIdentifiers.d.ts +3 -0
  478. package/lib/typescript/module/src/selectionIdentifiers.d.ts.map +1 -0
  479. package/lib/typescript/module/src/submitBehavior.d.ts +9 -0
  480. package/lib/typescript/module/src/submitBehavior.d.ts.map +1 -0
  481. package/lib/typescript/module/src/tabItems.d.ts +55 -0
  482. package/lib/typescript/module/src/tabItems.d.ts.map +1 -0
  483. package/lib/typescript/module/src/web/Button.d.ts +9 -0
  484. package/lib/typescript/module/src/web/Button.d.ts.map +1 -0
  485. package/lib/typescript/module/src/web/ButtonGroup.d.ts +11 -0
  486. package/lib/typescript/module/src/web/ButtonGroup.d.ts.map +1 -0
  487. package/lib/typescript/module/src/web/DatePicker.d.ts +14 -0
  488. package/lib/typescript/module/src/web/DatePicker.d.ts.map +1 -0
  489. package/lib/typescript/module/src/web/DateRangePicker.d.ts +11 -0
  490. package/lib/typescript/module/src/web/DateRangePicker.d.ts.map +1 -0
  491. package/lib/typescript/module/src/web/Dialog.d.ts +12 -0
  492. package/lib/typescript/module/src/web/Dialog.d.ts.map +1 -0
  493. package/lib/typescript/module/src/web/FloatingActionButton.d.ts +8 -0
  494. package/lib/typescript/module/src/web/FloatingActionButton.d.ts.map +1 -0
  495. package/lib/typescript/module/src/web/Icon.d.ts +12 -0
  496. package/lib/typescript/module/src/web/Icon.d.ts.map +1 -0
  497. package/lib/typescript/module/src/web/NativeTheme.d.ts +10 -0
  498. package/lib/typescript/module/src/web/NativeTheme.d.ts.map +1 -0
  499. package/lib/typescript/module/src/web/NavigationRail.d.ts +8 -0
  500. package/lib/typescript/module/src/web/NavigationRail.d.ts.map +1 -0
  501. package/lib/typescript/module/src/web/PlatformComponentsProvider.d.ts +10 -0
  502. package/lib/typescript/module/src/web/PlatformComponentsProvider.d.ts.map +1 -0
  503. package/lib/typescript/module/src/web/SegmentedControl.d.ts +8 -0
  504. package/lib/typescript/module/src/web/SegmentedControl.d.ts.map +1 -0
  505. package/lib/typescript/module/src/web/SelectionMenu.d.ts +10 -0
  506. package/lib/typescript/module/src/web/SelectionMenu.d.ts.map +1 -0
  507. package/lib/typescript/module/src/web/SplitButton.d.ts +9 -0
  508. package/lib/typescript/module/src/web/SplitButton.d.ts.map +1 -0
  509. package/lib/typescript/module/src/web/TabBar.d.ts +9 -0
  510. package/lib/typescript/module/src/web/TabBar.d.ts.map +1 -0
  511. package/lib/typescript/module/src/web/TextField.d.ts +9 -0
  512. package/lib/typescript/module/src/web/TextField.d.ts.map +1 -0
  513. package/lib/typescript/module/src/web/components.d.ts +17 -0
  514. package/lib/typescript/module/src/web/components.d.ts.map +1 -0
  515. package/lib/typescript/module/src/web/containers.d.ts +24 -0
  516. package/lib/typescript/module/src/web/containers.d.ts.map +1 -0
  517. package/lib/typescript/module/src/web/dateInput.d.ts +20 -0
  518. package/lib/typescript/module/src/web/dateInput.d.ts.map +1 -0
  519. package/lib/typescript/module/src/web/shared.d.ts +43 -0
  520. package/lib/typescript/module/src/web/shared.d.ts.map +1 -0
  521. package/lib/typescript/module/src/webComponents.d.ts +43 -0
  522. package/lib/typescript/module/src/webComponents.d.ts.map +1 -0
  523. package/package.json +32 -2
  524. package/plugin/build/index.d.ts +3 -2
  525. package/plugin/build/index.d.ts.map +1 -1
  526. package/react-native.config.js +3 -0
  527. package/shared/PCFloatingActionButtonComponentDescriptors-custom.h +22 -0
  528. package/shared/PCFloatingActionButtonShadowNode-custom.cpp +48 -0
  529. package/shared/PCFloatingActionButtonShadowNode-custom.h +54 -0
  530. package/shared/PCFloatingActionButtonState-custom.h +61 -0
  531. package/shared/PCNavigationRailComponentDescriptors-custom.h +47 -0
  532. package/shared/PCNavigationRailShadowNode-custom.h +42 -0
  533. package/shared/PCNavigationRailState-custom.h +62 -0
  534. package/shared/PCTabBarComponentDescriptors-custom.h +22 -0
  535. package/shared/PCTabBarShadowNode-custom.cpp +54 -0
  536. package/shared/PCTabBarShadowNode-custom.h +54 -0
  537. package/shared/PCTabBarState-custom.h +62 -0
  538. package/shared/react/renderer/components/PlatformComponentsViewSpec/ComponentDescriptors.h +3 -0
  539. package/src/Button.tsx +222 -7
  540. package/src/ButtonGroup.tsx +29 -11
  541. package/src/ButtonGroupNativeComponent.ts +74 -4
  542. package/src/ButtonNativeComponent.ts +119 -3
  543. package/src/ContextMenu.tsx +34 -81
  544. package/src/ContextMenuNativeComponent.ts +47 -49
  545. package/src/DatePicker.tsx +182 -4
  546. package/src/DatePickerNativeComponent.ts +19 -2
  547. package/src/FloatingActionButton.tsx +121 -0
  548. package/src/FloatingActionButtonNativeComponent.ts +58 -0
  549. package/src/FloatingToolbar.tsx +54 -3
  550. package/src/FloatingToolbarNativeComponent.ts +16 -0
  551. package/src/LiquidGlass.tsx +24 -1
  552. package/src/LiquidGlassContainer.tsx +42 -0
  553. package/src/LiquidGlassContainerNativeComponent.ts +17 -0
  554. package/src/LiquidGlassNativeComponent.ts +8 -0
  555. package/src/NavigationRail.tsx +203 -0
  556. package/src/NavigationRailNativeComponent.ts +107 -0
  557. package/src/PlatformComponentsProvider.tsx +15 -0
  558. package/src/SegmentedControl.tsx +31 -1
  559. package/src/SegmentedControlNativeComponent.ts +11 -0
  560. package/src/SelectionMenu.tsx +81 -6
  561. package/src/SelectionMenuNativeComponent.ts +26 -4
  562. package/src/SplitButton.tsx +198 -0
  563. package/src/TabBar.tsx +373 -0
  564. package/src/TabBarAccessoryNativeComponent.ts +19 -0
  565. package/src/TabBarNativeComponent.ts +145 -0
  566. package/src/TextField.tsx +428 -14
  567. package/src/TextFieldNativeComponent.ts +110 -4
  568. package/src/focusRegistry.ts +1 -0
  569. package/src/haptics.ts +31 -0
  570. package/src/icons.ts +28 -1
  571. package/src/index.tsx +7 -0
  572. package/src/index.web.tsx +51 -391
  573. package/src/jest.tsx +958 -0
  574. package/src/menuItems.ts +152 -0
  575. package/src/selectionIdentifiers.ts +17 -0
  576. package/src/submitBehavior.ts +16 -0
  577. package/src/tabItems.ts +113 -0
  578. package/src/web/Button.tsx +201 -0
  579. package/src/web/ButtonGroup.tsx +154 -0
  580. package/src/web/DatePicker.tsx +204 -0
  581. package/src/web/DateRangePicker.tsx +135 -0
  582. package/src/web/Dialog.tsx +54 -0
  583. package/src/web/FloatingActionButton.tsx +76 -0
  584. package/src/web/Icon.tsx +33 -0
  585. package/src/web/NativeTheme.ts +23 -0
  586. package/src/web/NavigationRail.tsx +148 -0
  587. package/src/web/PlatformComponentsProvider.tsx +48 -0
  588. package/src/web/SegmentedControl.tsx +127 -0
  589. package/src/web/SelectionMenu.tsx +149 -0
  590. package/src/web/SplitButton.tsx +32 -0
  591. package/src/web/TabBar.tsx +150 -0
  592. package/src/web/TextField.tsx +361 -0
  593. package/src/web/components.tsx +71 -0
  594. package/src/web/containers.tsx +130 -0
  595. package/src/web/dateInput.ts +137 -0
  596. package/src/web/shared.ts +176 -0
  597. package/src/webComponents.ts +45 -0
  598. package/android/src/main/java/com/platformcomponents/DateConstraints.kt +0 -83
@@ -15,11 +15,14 @@ import android.view.KeyEvent
15
15
  import android.view.View
16
16
  import android.view.ViewGroup
17
17
  import android.view.inputmethod.EditorInfo
18
+ import android.view.inputmethod.InputConnection
18
19
  import android.view.inputmethod.InputMethodManager
19
20
  import android.widget.FrameLayout
20
21
  import android.widget.LinearLayout
21
22
  import android.widget.TextView
22
23
  import android.content.res.ColorStateList
24
+ import android.view.accessibility.AccessibilityNodeInfo
25
+ import android.widget.Button
23
26
  import android.util.TypedValue
24
27
  import android.view.MotionEvent
25
28
  import androidx.core.widget.TextViewCompat
@@ -32,6 +35,7 @@ import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper
32
35
  import com.facebook.react.views.scroll.ReactScrollViewHelper
33
36
  import com.google.android.material.textfield.TextInputEditText
34
37
  import com.google.android.material.textfield.TextInputLayout
38
+ import com.google.android.material.R as MaterialR
35
39
 
36
40
  /**
37
41
  * A Material 3 text field: a TextInputLayout (floating label, box, icons,
@@ -83,6 +87,7 @@ class PCTextFieldView(context: Context) :
83
87
  var autoCorrect: Boolean = true
84
88
  var secure: Boolean = false
85
89
  var multiline: Boolean = false
90
+ var submitBehavior: String = "" // "" | "submit" | "blurAndSubmit" | "newline"
86
91
  var fieldEnabled: Boolean = true
87
92
  var autoFocus: Boolean = false
88
93
  var selectTextOnFocus: Boolean = false
@@ -92,15 +97,33 @@ class PCTextFieldView(context: Context) :
92
97
  var fontSize: Float = 0f
93
98
  var fontWeight: String = ""
94
99
  var fontStyle: String = ""
95
- var variant: String = "outlined" // "outlined" | "filled"
100
+ var variant: String = "outlined" // "outlined" | "filled" | "plain"
96
101
  var dense: Boolean = false
97
102
  var materialMode: String = "m3" // "m3" | "system"
103
+ var inputTestID: String = ""
104
+ var leadingIconTestID: String = ""
105
+ var leadingIconSpokenLabel: String = ""
106
+ var trailingIconTestID: String = ""
107
+ var trailingIconSpokenLabel: String = ""
108
+ var activeColor: Int? = null
109
+ var outlineColor: Int? = null
110
+ var errorColor: Int? = null
111
+ var containerColor: Int? = null
112
+ var textColor: Int? = null
113
+ var placeholderTextColor: Int? = null
114
+ var maxFontSizeMultiplier: Float = 0f
115
+ var textAlign: String = "" // "" | "left" | "center" | "right"
116
+ var minLines: Int = 0
117
+ var maxLines: Int = 0
118
+ var pressable: Boolean = false
98
119
 
99
120
  // --- Events ---
100
121
  var onChange: ((text: String, eventCount: Int) -> Unit)? = null
101
122
  var onFocusChange: ((focused: Boolean, text: String) -> Unit)? = null
102
123
  var onSubmit: ((text: String) -> Unit)? = null
124
+ var onSelectionChange: ((start: Int, end: Int) -> Unit)? = null
103
125
  var onTrailingIconPress: (() -> Unit)? = null
126
+ var onPress: (() -> Unit)? = null
104
127
 
105
128
  // --- Text state (survives rebuilds) ---
106
129
  private var text: String = ""
@@ -109,6 +132,13 @@ class PCTextFieldView(context: Context) :
109
132
  private var initialTextApplied = false
110
133
  private var autoFocusDone = false
111
134
 
135
+ // The selection JS last heard of, so a change is reported once. Text and
136
+ // selection set from JS update it without an event. Declared before init:
137
+ // the edit text reports selections while rebuildUI() builds it.
138
+ private var reportedSelectionStart = -1
139
+ private var reportedSelectionEnd = -1
140
+ private var applyingSelection = false
141
+
112
142
  // --- UI ---
113
143
  /** The top-level widget: the TextInputLayout, or the system field's column. */
114
144
  private var widget: View? = null
@@ -118,6 +148,8 @@ class PCTextFieldView(context: Context) :
118
148
 
119
149
  /** The Material style's error icon, shown in the end slot while there is an error. */
120
150
  private var defaultErrorIcon: Drawable? = null
151
+ private var defaultStartIconTint: ColorStateList? = null
152
+ private var defaultEndIconTint: ColorStateList? = null
121
153
 
122
154
  /** Bumped on every rebuild and icon change so late image loads can't touch stale widgets. */
123
155
  private var startIconGeneration = 0
@@ -279,12 +311,22 @@ class PCTextFieldView(context: Context) :
279
311
  applyInputType()
280
312
  }
281
313
 
314
+ fun applySubmitBehavior(value: String) {
315
+ if (submitBehavior == value) return
316
+ submitBehavior = value
317
+ // The IME asks for the enter key's action when input starts
318
+ val edit = editText ?: return
319
+ if (multiline && edit.isFocused) {
320
+ val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
321
+ imm?.restartInput(edit)
322
+ }
323
+ }
324
+
282
325
  fun applyInteractivity(value: String?) {
283
326
  val next = value != "disabled"
284
327
  if (fieldEnabled == next) return
285
328
  fieldEnabled = next
286
- layout?.isEnabled = next
287
- if (layout == null) editText?.isEnabled = next
329
+ applyPressMode()
288
330
  }
289
331
 
290
332
  fun applyAutoFocus(value: Boolean) {
@@ -321,7 +363,10 @@ class PCTextFieldView(context: Context) :
321
363
  }
322
364
 
323
365
  fun applyVariant(value: String?) {
324
- val next = if (value == "filled") "filled" else "outlined"
366
+ val next = when (value) {
367
+ "filled", "plain" -> value
368
+ else -> "outlined"
369
+ }
325
370
  if (variant == next) return
326
371
  variant = next
327
372
  rebuildUI()
@@ -341,6 +386,66 @@ class PCTextFieldView(context: Context) :
341
386
  rebuildUI()
342
387
  }
343
388
 
389
+ fun applyInputTestID(value: String) {
390
+ if (inputTestID == value) return
391
+ inputTestID = value
392
+ applyTestIDs()
393
+ }
394
+
395
+ fun applyIconAccessibility(leadingID: String, leadingLabel: String, trailingID: String, trailingLabel: String) {
396
+ if (leadingIconTestID == leadingID && leadingIconSpokenLabel == leadingLabel &&
397
+ trailingIconTestID == trailingID && trailingIconSpokenLabel == trailingLabel
398
+ ) return
399
+ leadingIconTestID = leadingID
400
+ leadingIconSpokenLabel = leadingLabel
401
+ trailingIconTestID = trailingID
402
+ trailingIconSpokenLabel = trailingLabel
403
+ applyTestIDs()
404
+ }
405
+
406
+ fun applyColors(active: Int?, outline: Int?, error: Int?, container: Int?, textValue: Int?, placeholderValue: Int?) {
407
+ if (activeColor == active && outlineColor == outline && errorColor == error &&
408
+ containerColor == container && textColor == textValue && placeholderTextColor == placeholderValue
409
+ ) return
410
+ // A color going back to the default needs fresh widgets; the rest applies live
411
+ val cleared = (activeColor != null && active == null) || (outlineColor != null && outline == null) ||
412
+ (errorColor != null && error == null) || (containerColor != null && container == null) ||
413
+ (textColor != null && textValue == null) || (placeholderTextColor != null && placeholderValue == null)
414
+ activeColor = active
415
+ outlineColor = outline
416
+ errorColor = error
417
+ containerColor = container
418
+ textColor = textValue
419
+ placeholderTextColor = placeholderValue
420
+ if (cleared) rebuildUI() else applyColors()
421
+ }
422
+
423
+ fun applyMaxFontSizeMultiplier(value: Float) {
424
+ if (maxFontSizeMultiplier == value) return
425
+ maxFontSizeMultiplier = value
426
+ // Fresh widgets start from their uncapped sizes
427
+ rebuildUI()
428
+ }
429
+
430
+ fun applyTextAlign(value: String) {
431
+ if (textAlign == value) return
432
+ textAlign = value
433
+ applyInputType()
434
+ }
435
+
436
+ fun applyLineBounds(min: Int, max: Int) {
437
+ if (minLines == min && maxLines == max) return
438
+ minLines = min
439
+ maxLines = max
440
+ applyInputType()
441
+ }
442
+
443
+ fun applyPressable(value: Boolean) {
444
+ if (pressable == value) return
445
+ pressable = value
446
+ applyPressMode()
447
+ }
448
+
344
449
  // ---- Commands ----
345
450
 
346
451
  fun focusFromJS() {
@@ -373,6 +478,23 @@ class PCTextFieldView(context: Context) :
373
478
  setTextInternal(value, moveCursorToEnd = false)
374
479
  }
375
480
 
481
+ /**
482
+ * A selection from JS, clamped to the text. Dropped like a stale
483
+ * [setTextFromJS] when the user has edited since [eventCount].
484
+ */
485
+ fun setSelectionFromJS(eventCount: Int, start: Int, end: Int) {
486
+ if (eventCount < nativeEventCount) return
487
+ val edit = editText ?: return
488
+ val length = edit.length()
489
+ val from = start.coerceIn(0, length)
490
+ val to = end.coerceIn(from, length)
491
+ applyingSelection = true
492
+ edit.setSelection(from, to)
493
+ applyingSelection = false
494
+ reportedSelectionStart = edit.selectionStart
495
+ reportedSelectionEnd = edit.selectionEnd
496
+ }
497
+
376
498
  // ---- Touch ----
377
499
 
378
500
  // The widgets have generated view ids, which React Native's touch handling
@@ -453,8 +575,8 @@ class PCTextFieldView(context: Context) :
453
575
  // Material widgets need a Material theme; fall back to Material 3 defaults instead of crashing.
454
576
  val base = PCThemeSupport.materialContext(context, "TextField")
455
577
  val styleOverlay = when {
456
- variant == "filled" && dense -> R.style.PCTextField_Filled_Dense
457
- variant == "filled" -> R.style.PCTextField_Filled
578
+ variant != "outlined" && dense -> R.style.PCTextField_Filled_Dense
579
+ variant != "outlined" -> R.style.PCTextField_Filled
458
580
  dense -> R.style.PCTextField_Outlined_Dense
459
581
  else -> R.style.PCTextField_Outlined
460
582
  }
@@ -473,6 +595,14 @@ class PCTextFieldView(context: Context) :
473
595
  setSelectAllOnFocus(selectTextOnFocus)
474
596
  contentDescription = spokenLabel.ifEmpty { null }
475
597
  }
598
+ // Before it joins the layout, which sizes the resting label from it
599
+ applyFont(edit)
600
+ // The plain variant is the filled field without its box or underline;
601
+ // the mode must be set before the layout gives the edit text its box
602
+ if (variant == "plain") {
603
+ til.boxBackgroundMode = TextInputLayout.BOX_BACKGROUND_NONE
604
+ edit.background = null
605
+ }
476
606
 
477
607
  til.addView(edit)
478
608
  addView(til)
@@ -480,9 +610,24 @@ class PCTextFieldView(context: Context) :
480
610
  layout = til
481
611
  editText = edit
482
612
  defaultErrorIcon = til.errorIconDrawable
613
+ // TextInputLayout has tint setters but no getters. Resolve the same
614
+ // styled attributes its constructor uses, preserving host theme state
615
+ // colors so changing an image's template mode need not replace the input.
616
+ // https://github.com/material-components/material-components-android/blob/1.14.0/lib/java/com/google/android/material/textfield/TextInputLayout.java
617
+ val iconTints = til.context.obtainStyledAttributes(
618
+ null,
619
+ MaterialR.styleable.TextInputLayout,
620
+ MaterialR.attr.textInputStyle,
621
+ MaterialR.style.Widget_Design_TextInputLayout
622
+ )
623
+ try {
624
+ defaultStartIconTint = iconTints.getColorStateList(MaterialR.styleable.TextInputLayout_startIconTint)
625
+ defaultEndIconTint = iconTints.getColorStateList(MaterialR.styleable.TextInputLayout_endIconTint)
626
+ } finally {
627
+ iconTints.recycle()
628
+ }
483
629
  til.prefixText = prefix.ifEmpty { null }
484
630
  til.suffixText = suffix.ifEmpty { null }
485
- til.isEnabled = fieldEnabled
486
631
  }
487
632
 
488
633
  applyInputType()
@@ -492,13 +637,19 @@ class PCTextFieldView(context: Context) :
492
637
  applyEndIcon()
493
638
  applyCounterAndLength()
494
639
  applyAutofill()
640
+ applyColors()
641
+ applyPressMode()
642
+ applyTestIDs()
495
643
 
496
644
  // Restore the text without reporting it as an edit
497
645
  settingTextInternally = true
498
646
  edit.setText(text)
647
+ text = edit.text?.toString().orEmpty()
499
648
  val length = edit.length()
500
649
  edit.setSelection(if (selection in 0..length) selection else length)
501
650
  settingTextInternally = false
651
+ reportedSelectionStart = edit.selectionStart
652
+ reportedSelectionEnd = edit.selectionEnd
502
653
 
503
654
  edit.addTextChangedListener(textWatcher)
504
655
  // Focus changes are reported from FieldEditText.onFocusChanged: the Material
@@ -510,19 +661,37 @@ class PCTextFieldView(context: Context) :
510
661
  requestLayout()
511
662
  }
512
663
 
664
+ /** What the return key does; a single-line field has no newline to insert. */
665
+ private val returnKeyBehavior: String
666
+ get() = when {
667
+ submitBehavior == "submit" -> "submit"
668
+ multiline && submitBehavior != "blurAndSubmit" -> "newline"
669
+ else -> "blurAndSubmit"
670
+ }
671
+
513
672
  private fun onEditorAction(actionId: Int, event: KeyEvent?): Boolean {
514
- // Multi-line fields keep the return key for newlines
515
- if (multiline) return false
673
+ val behavior = returnKeyBehavior
674
+ // Multi-line fields keep the return key for newlines unless they submit
675
+ if (behavior == "newline") return false
516
676
  // A hardware / IME Enter reports IME_ACTION_UNSPECIFIED twice (key down and up)
517
677
  if (actionId == EditorInfo.IME_ACTION_UNSPECIFIED && event != null && event.action != KeyEvent.ACTION_DOWN) {
518
678
  return true
519
679
  }
520
680
  onSubmit?.invoke(text)
521
- // Single-line fields blur on submit, as the core TextInput does by default
522
- blurFromJS()
681
+ // Fields blur on submit unless submitBehavior is 'submit', as the core
682
+ // TextInput does; returning true keeps the keyboard up otherwise
683
+ if (behavior == "blurAndSubmit") blurFromJS()
523
684
  return true
524
685
  }
525
686
 
687
+ private fun selectionChanged(start: Int, end: Int) {
688
+ if (settingTextInternally || applyingSelection) return
689
+ if (start == reportedSelectionStart && end == reportedSelectionEnd) return
690
+ reportedSelectionStart = start
691
+ reportedSelectionEnd = end
692
+ onSelectionChange?.invoke(start, end)
693
+ }
694
+
526
695
  private fun setTextInternal(value: String, moveCursorToEnd: Boolean) {
527
696
  val edit = editText
528
697
  if (edit == null) {
@@ -533,10 +702,15 @@ class PCTextFieldView(context: Context) :
533
702
  val wasAtEnd = edit.selectionEnd == edit.length()
534
703
  val cursor = edit.selectionStart
535
704
  edit.setText(value)
536
- text = value
705
+ // InputFilter (notably maxLength) can change the supplied value. Events
706
+ // must report the text the user sees, including after a widget rebuild.
707
+ text = edit.text?.toString().orEmpty()
537
708
  val length = edit.length()
538
709
  edit.setSelection(if (moveCursorToEnd || wasAtEnd) length else cursor.coerceIn(0, length))
539
710
  settingTextInternally = false
711
+ // The cursor moved with the text; JS knows, so there is no event
712
+ reportedSelectionStart = edit.selectionStart
713
+ reportedSelectionEnd = edit.selectionEnd
540
714
  }
541
715
 
542
716
  // ---- Decorations ----
@@ -596,7 +770,7 @@ class PCTextFieldView(context: Context) :
596
770
  helper.text = message
597
771
  helper.visibility = if (message.isEmpty()) View.GONE else View.VISIBLE
598
772
  val color = if (showsError) {
599
- themeColor(AppCompatR.attr.colorError, 0xFFB3261E.toInt())
773
+ errorColor ?: themeColor(AppCompatR.attr.colorError, 0xFFB3261E.toInt())
600
774
  } else {
601
775
  themeColor(android.R.attr.textColorSecondary, 0xFF757575.toInt())
602
776
  }
@@ -620,12 +794,13 @@ class PCTextFieldView(context: Context) :
620
794
  val edit = editText ?: return
621
795
  val start = systemStart
622
796
  val end = systemEnd
797
+ val tint = ColorStateList.valueOf(themeColor(android.R.attr.colorControlNormal, 0xFF757575.toInt()))
798
+ // TextView's compound tint applies to every side. Each icon has its own
799
+ // template preference, so put the tint on the drawable instead.
800
+ // https://developer.android.com/reference/android/widget/TextView#setCompoundDrawableTintList(android.content.res.ColorStateList)
801
+ start?.mutate()?.setTintList(if (leadingIcon.tinted) tint else null)
802
+ end?.mutate()?.setTintList(if (trailingIcon.tinted) tint else null)
623
803
  edit.setCompoundDrawablesRelativeWithIntrinsicBounds(start, null, end, null)
624
- val tinted = (start != null && leadingIcon.tinted) || (end != null && trailingIcon.tinted)
625
- TextViewCompat.setCompoundDrawableTintList(
626
- edit,
627
- if (tinted) ColorStateList.valueOf(themeColor(android.R.attr.colorControlNormal, 0xFF757575.toInt())) else null
628
- )
629
804
  if (end != null) {
630
805
  edit.setOnTouchListener { v, event ->
631
806
  if (event.action == MotionEvent.ACTION_UP) {
@@ -669,8 +844,9 @@ class PCTextFieldView(context: Context) :
669
844
  }
670
845
  loadIcon(leadingIcon) { drawable ->
671
846
  if (generation != startIconGeneration || layout !== til) return@loadIcon
672
- if (!leadingIcon.tinted) til.setStartIconTintList(null)
847
+ til.setStartIconTintList(if (leadingIcon.tinted) defaultStartIconTint else null)
673
848
  til.startIconDrawable = drawable
849
+ applyTestIDs()
674
850
  requestLayout()
675
851
  }
676
852
  }
@@ -696,14 +872,15 @@ class PCTextFieldView(context: Context) :
696
872
  applySystemIcons()
697
873
  return
698
874
  }
875
+ til.setEndIconTintList(if (trailingIcon.isPresent && !trailingIcon.tinted) null else defaultEndIconTint)
699
876
  when {
700
877
  trailingIcon.isPresent -> {
701
878
  til.endIconMode = TextInputLayout.END_ICON_CUSTOM
702
879
  til.setEndIconOnClickListener { onTrailingIconPress?.invoke() }
703
880
  loadIcon(trailingIcon) { drawable ->
704
881
  if (generation != endIconGeneration || layout !== til) return@loadIcon
705
- if (!trailingIcon.tinted) til.setEndIconTintList(null)
706
882
  til.endIconDrawable = drawable
883
+ applyTestIDs()
707
884
  requestLayout()
708
885
  }
709
886
  }
@@ -714,9 +891,121 @@ class PCTextFieldView(context: Context) :
714
891
  // Material replaces the end icon with its error icon while an error shows;
715
892
  // a password toggle or a custom icon stays, since the user still needs it
716
893
  til.errorIconDrawable = if (trailingIcon.isPresent || passwordToggle) null else defaultErrorIcon
894
+ applyTestIDs()
717
895
  requestLayout()
718
896
  }
719
897
 
898
+ // ---- Test ids, colors, font scale, press ----
899
+
900
+ /**
901
+ * testID sits on the EditText, where Espresso's typeText / clearText work
902
+ * (Detox matches the view tag); the icon ids on the Material icon buttons.
903
+ * The system field's icons are compound drawables and can't carry one.
904
+ */
905
+ private fun applyTestIDs() {
906
+ val edit = editText ?: return
907
+ edit.tag = inputTestID.ifEmpty { null }
908
+ val til = layout ?: return
909
+ til.findViewById<View>(MaterialR.id.text_input_start_icon)?.tag = leadingIconTestID.ifEmpty { null }
910
+ til.startIconContentDescription = leadingIconSpokenLabel.ifEmpty { null }
911
+ // The password toggle and clear button keep Material's own descriptions
912
+ if (trailingIcon.isPresent) {
913
+ til.findViewById<View>(MaterialR.id.text_input_end_icon)?.tag = trailingIconTestID.ifEmpty { null }
914
+ til.endIconContentDescription = trailingIconSpokenLabel.ifEmpty { null }
915
+ } else {
916
+ til.findViewById<View>(MaterialR.id.text_input_end_icon)?.tag = null
917
+ }
918
+ }
919
+
920
+ /** Applies the color props over the style's colors; unset ones keep them. */
921
+ private fun applyColors() {
922
+ val edit = editText ?: return
923
+ textColor?.let { edit.setTextColor(it) }
924
+ placeholderTextColor?.let { edit.setHintTextColor(it) }
925
+ val til = layout
926
+ if (til == null) {
927
+ // The platform field: the underline follows the focus state
928
+ if (activeColor != null || outlineColor != null) {
929
+ val normal = outlineColor ?: themeColor(android.R.attr.colorControlNormal, 0xFF757575.toInt())
930
+ val focused = activeColor ?: themeColor(android.R.attr.colorControlActivated, normal)
931
+ edit.backgroundTintList = ColorStateList(
932
+ arrayOf(intArrayOf(android.R.attr.state_focused), intArrayOf()),
933
+ intArrayOf(focused, normal)
934
+ )
935
+ }
936
+ applySystemHelper()
937
+ return
938
+ }
939
+ if (activeColor != null || outlineColor != null) {
940
+ // The Material 3 stroke colors: outline (filled: on-surface-variant),
941
+ // on-surface while hovered, on-surface at 38% while disabled
942
+ fun attr(id: Int, fallback: Int): Int {
943
+ val value = TypedValue()
944
+ if (!til.context.theme.resolveAttribute(id, value, true)) return fallback
945
+ return if (value.resourceId != 0) til.context.getColor(value.resourceId) else value.data
946
+ }
947
+ val onSurface = attr(MaterialR.attr.colorOnSurface, 0xFF1D1B20.toInt())
948
+ val baseNormal = if (variant == "outlined") {
949
+ attr(MaterialR.attr.colorOutline, 0xFF79747E.toInt())
950
+ } else {
951
+ attr(MaterialR.attr.colorOnSurfaceVariant, 0xFF49454F.toInt())
952
+ }
953
+ val normal = outlineColor ?: baseNormal
954
+ val focused = activeColor ?: til.boxStrokeColor
955
+ val hovered = outlineColor ?: onSurface
956
+ val disabled = (onSurface and 0x00FFFFFF) or (0x61 shl 24)
957
+ til.setBoxStrokeColorStateList(
958
+ ColorStateList(
959
+ arrayOf(
960
+ intArrayOf(-android.R.attr.state_enabled),
961
+ intArrayOf(android.R.attr.state_focused),
962
+ intArrayOf(android.R.attr.state_hovered),
963
+ intArrayOf()
964
+ ),
965
+ intArrayOf(disabled, focused, hovered, normal)
966
+ )
967
+ )
968
+ }
969
+ activeColor?.let {
970
+ til.hintTextColor = ColorStateList.valueOf(it)
971
+ til.cursorColor = ColorStateList.valueOf(it)
972
+ }
973
+ errorColor?.let {
974
+ val list = ColorStateList.valueOf(it)
975
+ til.setErrorTextColor(list)
976
+ til.setBoxStrokeErrorColor(list)
977
+ til.setErrorIconTintList(list)
978
+ til.cursorErrorColor = list
979
+ }
980
+ containerColor?.let { if (til.boxBackgroundMode != TextInputLayout.BOX_BACKGROUND_NONE) til.boxBackgroundColor = it }
981
+ placeholderTextColor?.let { til.placeholderTextColor = ColorStateList.valueOf(it) }
982
+ }
983
+
984
+ private val actsAsButton: Boolean
985
+ get() = pressable && !fieldEnabled
986
+
987
+ /**
988
+ * Enabled state, or a non-editable field that acts as a button: enabled
989
+ * look, no focus or keyboard, presses reported through onPress.
990
+ */
991
+ private fun applyPressMode() {
992
+ val edit = editText ?: return
993
+ val button = actsAsButton
994
+ val enabled = fieldEnabled || button
995
+ layout?.isEnabled = enabled
996
+ if (layout == null) edit.isEnabled = enabled
997
+ edit.isFocusable = !button
998
+ edit.isFocusableInTouchMode = !button
999
+ edit.isCursorVisible = !button
1000
+ edit.isLongClickable = !button
1001
+ if (button) {
1002
+ if (edit.isFocused) clearFocusAndMaybeRefocus(edit)
1003
+ edit.setOnClickListener { onPress?.invoke() }
1004
+ } else {
1005
+ edit.setOnClickListener(null)
1006
+ }
1007
+ }
1008
+
720
1009
  private fun applyCounterAndLength() {
721
1010
  val edit = editText ?: return
722
1011
  edit.filters = if (maxLength > 0) arrayOf(InputFilter.LengthFilter(maxLength)) else emptyArray()
@@ -785,11 +1074,18 @@ class PCTextFieldView(context: Context) :
785
1074
  else -> EditorInfo.IME_ACTION_UNSPECIFIED
786
1075
  }
787
1076
 
1077
+ val horizontal = when (textAlign) {
1078
+ "left" -> Gravity.LEFT
1079
+ "center" -> Gravity.CENTER_HORIZONTAL
1080
+ "right" -> Gravity.RIGHT
1081
+ else -> Gravity.START
1082
+ }
788
1083
  if (multiline) {
789
- edit.gravity = Gravity.TOP or Gravity.START
790
- edit.minLines = 1
1084
+ edit.gravity = Gravity.TOP or horizontal
1085
+ edit.minLines = if (minLines > 0) minLines else 1
1086
+ edit.maxLines = if (maxLines > 0) maxLines else Int.MAX_VALUE
791
1087
  } else {
792
- edit.gravity = Gravity.CENTER_VERTICAL or Gravity.START
1088
+ edit.gravity = Gravity.CENTER_VERTICAL or horizontal
793
1089
  }
794
1090
 
795
1091
  applyFont(edit)
@@ -798,6 +1094,8 @@ class PCTextFieldView(context: Context) :
798
1094
 
799
1095
  private fun applyFont(edit: TextInputEditText) {
800
1096
  PCButtonSupport.applyFont(edit, fontFamily, fontSize, fontWeight, fontStyle)
1097
+ edit.setTag(R.id.pc_capped_text_size, null)
1098
+ PCThemeSupport.capTextSize(edit, maxFontSizeMultiplier)
801
1099
  }
802
1100
 
803
1101
  private fun applyAutofill() {
@@ -820,23 +1118,61 @@ class PCTextFieldView(context: Context) :
820
1118
  }
821
1119
  }
822
1120
 
823
- /** React Native autoComplete values onto the Android autofill hints. */
1121
+ /**
1122
+ * React Native autoComplete values onto the Android autofill hints: the
1123
+ * core TextInput's map, plus the HTML names it leaves out. The values are
1124
+ * androidx.autofill HintConstants, spelled out because the React Native
1125
+ * floor ships an older androidx.autofill. Unknown values give no hint.
1126
+ */
824
1127
  private fun autofillHint(value: String): String? = when (value) {
825
- "username" -> View.AUTOFILL_HINT_USERNAME
826
- "password" -> View.AUTOFILL_HINT_PASSWORD
827
- "new-password" -> "newPassword" // HintConstants.AUTOFILL_HINT_NEW_PASSWORD
828
- "one-time-code" -> "smsOTPCode" // HintConstants.AUTOFILL_HINT_SMS_OTP
829
- "email" -> View.AUTOFILL_HINT_EMAIL_ADDRESS
830
- "name" -> View.AUTOFILL_HINT_NAME
831
- "given-name" -> "personGivenName" // HintConstants.AUTOFILL_HINT_PERSON_NAME_GIVEN
832
- "family-name" -> "personFamilyName" // HintConstants.AUTOFILL_HINT_PERSON_NAME_FAMILY
833
- "tel" -> View.AUTOFILL_HINT_PHONE
834
- "street-address" -> View.AUTOFILL_HINT_POSTAL_ADDRESS
835
- "postal-code" -> View.AUTOFILL_HINT_POSTAL_CODE
836
- "country" -> "addressCountry" // HintConstants.AUTOFILL_HINT_POSTAL_ADDRESS_COUNTRY
837
- "cc-number" -> View.AUTOFILL_HINT_CREDIT_CARD_NUMBER
838
- "cc-exp" -> View.AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE
839
- "cc-csc" -> View.AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE
1128
+ "username" -> "username"
1129
+ "username-new" -> "newUsername"
1130
+ "password", "current-password" -> "password"
1131
+ "new-password", "password-new" -> "newPassword"
1132
+ "one-time-code", "sms-otp" -> "smsOTPCode"
1133
+ "email-otp" -> "emailOTPCode"
1134
+ "2fa-app-otp" -> "2faAppOTPCode"
1135
+ "email" -> "emailAddress"
1136
+ "name" -> "personName"
1137
+ "given-name", "name-given" -> "personGivenName"
1138
+ "family-name", "name-family" -> "personFamilyName"
1139
+ "additional-name", "name-middle" -> "personMiddleName"
1140
+ "name-middle-initial" -> "personMiddleInitial"
1141
+ "honorific-prefix", "name-prefix" -> "personNamePrefix"
1142
+ "honorific-suffix", "name-suffix" -> "personNameSuffix"
1143
+ "tel" -> "phoneNumber"
1144
+ "tel-country-code" -> "phoneCountryCode"
1145
+ "tel-national" -> "phoneNational"
1146
+ "tel-device" -> "phoneNumberDevice"
1147
+ "street-address", "address-line1" -> "streetAddress"
1148
+ "address-line2", "postal-address-extended" -> "extendedAddress"
1149
+ "postal-address" -> "postalAddress"
1150
+ "postal-address-country", "country" -> "addressCountry"
1151
+ "postal-address-extended-postal-code" -> "extendedPostalCode"
1152
+ "postal-address-locality" -> "addressLocality"
1153
+ "postal-address-region" -> "addressRegion"
1154
+ "postal-address-dependent-locality" -> "dependentLocality"
1155
+ "postal-address-unit" -> "aptNumber"
1156
+ "postal-code" -> "postalCode"
1157
+ "birthdate-full" -> "birthDateFull"
1158
+ "birthdate-day" -> "birthDateDay"
1159
+ "birthdate-month" -> "birthDateMonth"
1160
+ "birthdate-year" -> "birthDateYear"
1161
+ "gender" -> "gender"
1162
+ "cc-number" -> "creditCardNumber"
1163
+ "cc-exp" -> "creditCardExpirationDate"
1164
+ "cc-exp-day" -> "creditCardExpirationDay"
1165
+ "cc-exp-month" -> "creditCardExpirationMonth"
1166
+ "cc-exp-year" -> "creditCardExpirationYear"
1167
+ "cc-csc" -> "creditCardSecurityCode"
1168
+ "flight-number" -> "flightNumber"
1169
+ "flight-confirmation-code" -> "flightConfirmationCode"
1170
+ "gift-card-number" -> "giftCardNumber"
1171
+ "gift-card-pin" -> "giftCardPIN"
1172
+ "loyalty-account-number" -> "loyaltyAccountNumber"
1173
+ "promo-code" -> "promoCode"
1174
+ "upi-vpa" -> "upiVirtualPaymentAddress"
1175
+ "wifi-password" -> "wifiPassword"
840
1176
  else -> null
841
1177
  }
842
1178
 
@@ -853,7 +1189,7 @@ class PCTextFieldView(context: Context) :
853
1189
  if (!uri.contains(':')) {
854
1190
  onLoaded(ResourceDrawableIdHelper.instance.getResourceDrawable(context, uri))
855
1191
  } else {
856
- PCImageLoader.load(context, uri, icon.scale) { bitmap ->
1192
+ PCImageLoader.load(context, uri, icon.scale, icon.request) { bitmap ->
857
1193
  onLoaded(bitmap?.let { BitmapDrawable(context.resources, it) })
858
1194
  }
859
1195
  }
@@ -906,6 +1242,42 @@ class PCTextFieldView(context: Context) :
906
1242
  onFocusChange?.invoke(focused, this@PCTextFieldView.text)
907
1243
  }
908
1244
 
1245
+ override fun onSelectionChanged(selStart: Int, selEnd: Int) {
1246
+ super.onSelectionChanged(selStart, selEnd)
1247
+ selectionChanged(selStart, selEnd)
1248
+ }
1249
+
1250
+ /**
1251
+ * A multi-line field that submits on return asks the IME for its action
1252
+ * key (Send, Done) in place of Enter, which TextView turns off for
1253
+ * multi-line input.
1254
+ */
1255
+ override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection? {
1256
+ val connection = super.onCreateInputConnection(outAttrs)
1257
+ if (multiline && returnKeyBehavior != "newline") {
1258
+ outAttrs.imeOptions = outAttrs.imeOptions and EditorInfo.IME_FLAG_NO_ENTER_ACTION.inv()
1259
+ }
1260
+ return connection
1261
+ }
1262
+
1263
+ override fun onInitializeAccessibilityNodeInfo(info: AccessibilityNodeInfo) {
1264
+ super.onInitializeAccessibilityNodeInfo(info)
1265
+ if (actsAsButton) {
1266
+ info.className = Button::class.java.name
1267
+ info.isEditable = false
1268
+ }
1269
+ }
1270
+
1271
+ /** A multi-line field capped at maxLines scrolls itself, not the ScrollView around it. */
1272
+ override fun onTouchEvent(event: MotionEvent): Boolean {
1273
+ if (multiline && maxLines > 0 && (canScrollVertically(1) || canScrollVertically(-1))) {
1274
+ when (event.actionMasked) {
1275
+ MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE -> parent?.requestDisallowInterceptTouchEvent(true)
1276
+ }
1277
+ }
1278
+ return super.onTouchEvent(event)
1279
+ }
1280
+
909
1281
  override fun onKeyPreIme(keyCode: Int, event: KeyEvent): Boolean {
910
1282
  if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP && isFocused) {
911
1283
  clearFocusAndMaybeRefocus(this)
@@ -983,6 +1355,9 @@ class PCTextFieldView(context: Context) :
983
1355
  val child = widget ?: return
984
1356
  // Keep the widget at its natural height even when Yoga hasn't caught up
985
1357
  child.layout(0, 0, right - left, child.measuredHeight)
1358
+ // Material creates the helper, error, counter and placeholder views as
1359
+ // they are needed; cap the new ones (a changed size asks for a new pass)
1360
+ PCThemeSupport.capTextSizes(child, maxFontSizeMultiplier)
986
1361
  // TextInputLayout makes room for its start icon and prefix (invisible
987
1362
  // compound drawables on the edit text) from a ViewTreeObserver global
988
1363
  // layout callback, which only a window traversal delivers. React Native's