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
@@ -0,0 +1,448 @@
1
+ package com.platformcomponents
2
+
3
+ import android.content.Context
4
+ import android.graphics.Rect
5
+ import android.view.ContextThemeWrapper
6
+ import android.view.Gravity
7
+ import android.view.Menu
8
+ import android.view.View
9
+ import android.view.ViewGroup
10
+ import android.view.ViewTreeObserver
11
+ import android.widget.FrameLayout
12
+ import androidx.core.view.ViewCompat
13
+ import com.facebook.react.bridge.WritableNativeMap
14
+ import com.facebook.react.uimanager.PixelUtil
15
+ import com.facebook.react.uimanager.ReactCompoundViewGroup
16
+ import com.facebook.react.uimanager.StateWrapper
17
+ import com.facebook.react.views.scroll.ReactScrollViewHelper
18
+ import com.google.android.material.R as MaterialR
19
+ import com.google.android.material.navigation.NavigationBarView
20
+ import com.google.android.material.navigationrail.NavigationRailView
21
+ import com.platformcomponents.PCNavigationBarSupport.Item
22
+ import com.platformcomponents.PCNavigationBarSupport.LabelFont
23
+
24
+ /**
25
+ * A Material 3 Expressive navigation rail (NavigationRailView): destinations
26
+ * with the active indicator and badges, an optional header (the React
27
+ * `header`, in the rail's header slot), `menuGravity`, and the expanded rail.
28
+ * Selection is controlled from JS; a press reports the destination and
29
+ * whether it was already selected. The destinations are built like TabBar's
30
+ * tabs (PCNavigationBarSupport).
31
+ *
32
+ * The rail takes its natural width, which is reported to Fabric (the shadow
33
+ * node turns it into padding, see shared/); the app gives it its height. The
34
+ * rail is rebuilt for every prop Material only reads at construction or when
35
+ * the menu is inflated.
36
+ */
37
+ class PCNavigationRailView(context: Context) :
38
+ FrameLayout(context),
39
+ ReactScrollViewHelper.HasStateWrapper,
40
+ ReactCompoundViewGroup {
41
+
42
+ // --- State Wrapper for Fabric state updates ---
43
+ override var stateWrapper: StateWrapper? = null
44
+ private var lastReportedWidth: Float = -1f
45
+
46
+ // --- Props ---
47
+ var items: List<Item> = emptyList()
48
+ var selectedValue: String = ""
49
+ var labelVisibility: String = "auto"
50
+ var menuGravity: String = "top"
51
+ var expanded: Boolean = false
52
+ var activeTintColor: Int? = null
53
+ var inactiveTintColor: Int? = null
54
+ var railColor: Int? = null
55
+ var badgeBackgroundColor: Int? = null
56
+ var badgeTextColor: Int? = null
57
+ var indicatorColor: Int? = null
58
+ var rippleColor: Int? = null
59
+ var labelFont: LabelFont = LabelFont()
60
+
61
+ /** The `haptics` prop; the manager plays it with the user's action (see PCHaptics). */
62
+ var haptics: String = ""
63
+
64
+ // --- Events ---
65
+ var onItemPress: ((index: Int, value: String, reselected: Boolean) -> Unit)? = null
66
+
67
+ // --- UI (declared before init: rebuildUI() runs from it) ---
68
+ private var rail: Rail? = null
69
+ private var suppressCallbacks = false
70
+
71
+ /** The React header, laid out by this view inside the rail's header slot. */
72
+ private var headerChild: View? = null
73
+ private val headerContainer = HeaderContainer(context)
74
+
75
+ /** Bumped on every rebuild so late image loads can't touch a stale rail. */
76
+ private var rebuildGeneration = 0
77
+
78
+ // --- Native theme ---
79
+ // Widgets read theme colors when they are created, so the rail is rebuilt
80
+ // when the native theme changes (brand color, light/dark switch).
81
+ private var builtThemeVersion = PCNativeTheme.version
82
+ private val nativeThemeListener = PCNativeTheme.Listener {
83
+ PCThemeSupport.clearColorStateListCaches(this)
84
+ rebuildUI()
85
+ }
86
+
87
+ /**
88
+ * Lays the rail out again when React resizes the header: Fabric measures
89
+ * the header but leaves its layout to this view.
90
+ */
91
+ private val headerSizeWatcher = ViewTreeObserver.OnPreDrawListener {
92
+ val child = headerChild
93
+ if (child != null && headerContainer.parent != null &&
94
+ (child.measuredWidth != headerContainer.width || child.measuredHeight != headerContainer.height)
95
+ ) {
96
+ // Through the container, so every view up to the rail measures again
97
+ headerContainer.requestLayout()
98
+ }
99
+ true
100
+ }
101
+
102
+ init {
103
+ clipChildren = false
104
+ clipToPadding = false
105
+ rebuildUI()
106
+ }
107
+
108
+ // ---- Public apply* (called by manager) ----
109
+
110
+ fun applyItems(value: List<Item>) {
111
+ if (items == value) return
112
+ val badgesOnly = items.size == value.size &&
113
+ items.zip(value).all { (old, new) -> old.copy(badge = new.badge) == new }
114
+ items = value
115
+ // A new count needs no new rail (nor a TalkBack announcement of its state)
116
+ val r = rail
117
+ if (badgesOnly && r != null) {
118
+ PCNavigationBarSupport.applyBadges(r, items, badgeBackgroundColor, badgeTextColor)
119
+ } else {
120
+ rebuildUI()
121
+ }
122
+ }
123
+
124
+ fun applySelectedValue(value: String) {
125
+ if (selectedValue == value) return
126
+ selectedValue = value
127
+ updateSelection()
128
+ }
129
+
130
+ fun applyLabelVisibility(value: String?) {
131
+ val next = value ?: "auto"
132
+ if (labelVisibility == next) return
133
+ labelVisibility = next
134
+ rail?.labelVisibilityMode = labelVisibilityMode()
135
+ requestLayout()
136
+ }
137
+
138
+ fun applyMenuGravity(value: String?) {
139
+ val next = value ?: "top"
140
+ if (menuGravity == next) return
141
+ menuGravity = next
142
+ rail?.menuGravity = gravity()
143
+ requestLayout()
144
+ }
145
+
146
+ fun applyExpanded(value: Boolean) {
147
+ if (expanded == value) return
148
+ expanded = value
149
+ val r = rail ?: return
150
+ // Material animates the change once the rail is laid out
151
+ if (value) r.expand() else r.collapse()
152
+ }
153
+
154
+ fun applyColors(active: Int?, inactive: Int?, background: Int?, indicator: Int?, ripple: Int?) {
155
+ if (activeTintColor == active && inactiveTintColor == inactive && railColor == background &&
156
+ indicatorColor == indicator && rippleColor == ripple
157
+ ) return
158
+ activeTintColor = active
159
+ inactiveTintColor = inactive
160
+ railColor = background
161
+ indicatorColor = indicator
162
+ rippleColor = ripple
163
+ // The theme's colors are only known on a fresh rail
164
+ rebuildUI()
165
+ }
166
+
167
+ fun applyBadgeColors(background: Int?, text: Int?) {
168
+ if (badgeBackgroundColor == background && badgeTextColor == text) return
169
+ badgeBackgroundColor = background
170
+ badgeTextColor = text
171
+ rail?.let { PCNavigationBarSupport.applyBadges(it, items, badgeBackgroundColor, badgeTextColor) }
172
+ }
173
+
174
+ fun applyLabelFont(value: LabelFont) {
175
+ if (labelFont == value) return
176
+ labelFont = value
177
+ rebuildUI()
178
+ }
179
+
180
+ // ---- Header ----
181
+
182
+ /** The React header view (the NavigationRail's `header`), or null. */
183
+ fun setHeaderChild(child: View?) {
184
+ if (headerChild === child) return
185
+ headerChild?.let { headerContainer.removeView(it) }
186
+ headerChild = child
187
+ if (child != null) headerContainer.addView(child)
188
+ attachHeader(rail)
189
+ headerContainer.requestLayout()
190
+ requestLayout()
191
+ }
192
+
193
+ fun headerView(): View? = headerChild
194
+
195
+ private fun attachHeader(r: Rail?) {
196
+ val current = r?.headerView
197
+ if (headerChild == null) {
198
+ if (current != null) r?.removeHeaderView()
199
+ return
200
+ }
201
+ if (r == null || current === headerContainer) return
202
+ (headerContainer.parent as? ViewGroup)?.removeView(headerContainer)
203
+ r.addHeaderView(headerContainer)
204
+ }
205
+
206
+ /**
207
+ * Holds the React header in the rail's header slot at the size React gave
208
+ * it; the rail places it (centered at the top, above the destinations).
209
+ */
210
+ private class HeaderContainer(context: Context) : FrameLayout(context) {
211
+ init {
212
+ clipChildren = false
213
+ clipToPadding = false
214
+ }
215
+
216
+ override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
217
+ val child = if (childCount > 0) getChildAt(0) else null
218
+ // React measured the header; keep its size
219
+ setMeasuredDimension(child?.measuredWidth ?: 0, child?.measuredHeight ?: 0)
220
+ }
221
+
222
+ override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
223
+ val child = if (childCount > 0) getChildAt(0) else return
224
+ child.layout(0, 0, child.measuredWidth, child.measuredHeight)
225
+ }
226
+ }
227
+
228
+ // ---- Touch ----
229
+
230
+ // The destinations carry the menu item ids, which React Native's touch
231
+ // handling would take for React tags. Claim the touch for this view, except
232
+ // on the header, whose React views take their own touches; the rail still
233
+ // receives it natively.
234
+ override fun interceptsTouchEvent(touchX: Float, touchY: Float): Boolean {
235
+ if (headerChild == null || headerContainer.parent == null) return true
236
+ val bounds = Rect()
237
+ headerContainer.getDrawingRect(bounds)
238
+ offsetDescendantRectToMyCoords(headerContainer, bounds)
239
+ return !bounds.contains(touchX.toInt(), touchY.toInt())
240
+ }
241
+
242
+ override fun reactTagForTouch(touchX: Float, touchY: Float): Int = id
243
+
244
+ // ---- Lifecycle ----
245
+
246
+ override fun onAttachedToWindow() {
247
+ super.onAttachedToWindow()
248
+ PCNativeTheme.addListener(nativeThemeListener)
249
+ PCNativeTheme.attach(context)
250
+ viewTreeObserver.addOnPreDrawListener(headerSizeWatcher)
251
+ if (builtThemeVersion != PCNativeTheme.version) nativeThemeListener.onNativeThemeChanged()
252
+ }
253
+
254
+ override fun onDetachedFromWindow() {
255
+ viewTreeObserver.removeOnPreDrawListener(headerSizeWatcher)
256
+ PCNativeTheme.removeListener(nativeThemeListener)
257
+ super.onDetachedFromWindow()
258
+ }
259
+
260
+ // ---- UI Building ----
261
+
262
+ private fun labelVisibilityMode(): Int = when (labelVisibility) {
263
+ "selected" -> NavigationBarView.LABEL_VISIBILITY_SELECTED
264
+ "unlabeled" -> NavigationBarView.LABEL_VISIBILITY_UNLABELED
265
+ // The rail labels every destination by default
266
+ else -> NavigationBarView.LABEL_VISIBILITY_LABELED
267
+ }
268
+
269
+ private fun gravity(): Int = when (menuGravity) {
270
+ "center" -> Gravity.CENTER
271
+ "bottom" -> Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL
272
+ else -> Gravity.TOP or Gravity.CENTER_HORIZONTAL
273
+ }
274
+
275
+ private fun rebuildUI() {
276
+ builtThemeVersion = PCNativeTheme.version
277
+ rail?.let { old ->
278
+ if (old.headerView != null) old.removeHeaderView()
279
+ }
280
+ removeAllViews()
281
+ rebuildGeneration += 1
282
+ val generation = rebuildGeneration
283
+
284
+ // Material widgets need a Material theme; fall back to Material 3 defaults
285
+ // instead of crashing. The overlay picks the Expressive rail style.
286
+ // A rail built expanded starts expanded, without animating or announcing it
287
+ val base = ContextThemeWrapper(
288
+ PCThemeSupport.materialContext(context, "NavigationRail"),
289
+ if (expanded) R.style.PCNavigationRailOverlay_Expanded else R.style.PCNavigationRailOverlay
290
+ )
291
+ val r = Rail(base) { reportWidth(it) }
292
+ r.labelVisibilityMode = labelVisibilityMode()
293
+ r.menuGravity = gravity()
294
+ // The rail pads itself for the system bars when it sits at the window's
295
+ // edge; here it is a control inside the app's layout, which handles safe
296
+ // areas itself
297
+ ViewCompat.setOnApplyWindowInsetsListener(r, null)
298
+ r.setPadding(0, 0, 0, 0)
299
+
300
+ PCNavigationBarSupport.applyColors(r, activeTintColor, inactiveTintColor, indicatorColor, rippleColor, railColor)
301
+ PCNavigationBarSupport.populateMenu(r, items, { generation == rebuildGeneration }) { requestLayout() }
302
+ // Select or reselect is decided against selectedValue: with nothing
303
+ // selected the widget still counts its last destination as selected
304
+ r.setOnItemSelectedListener { menuItem ->
305
+ if (!suppressCallbacks) report(menuItem.itemId - 1)
306
+ // Controlled: the selection follows selectedValue once JS updates it
307
+ post { updateSelection() }
308
+ true
309
+ }
310
+ r.setOnItemReselectedListener { menuItem ->
311
+ if (!suppressCallbacks) report(menuItem.itemId - 1)
312
+ }
313
+
314
+ addView(r, LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT))
315
+ rail = r
316
+ attachHeader(r)
317
+ PCNavigationBarSupport.applyBadges(r, items, badgeBackgroundColor, badgeTextColor)
318
+ updateSelection()
319
+ PCNavigationBarSupport.applyTestIDsAndFonts(r, items, labelFont)
320
+ requestLayout()
321
+ reportIntrinsicSize()
322
+ }
323
+
324
+ private fun report(index: Int) {
325
+ if (index !in items.indices) return
326
+ val value = items[index].value
327
+ onItemPress?.invoke(index, value, value == selectedValue)
328
+ }
329
+
330
+ private fun updateSelection() {
331
+ val r = rail ?: return
332
+ val index = items.indexOfFirst { it.value == selectedValue }
333
+ suppressCallbacks = true
334
+ val group = r.menu
335
+ if (index in items.indices) {
336
+ group.setGroupCheckable(Menu.NONE, true, true)
337
+ if (r.selectedItemId != PCNavigationBarSupport.itemId(index)) r.selectedItemId = PCNavigationBarSupport.itemId(index)
338
+ } else {
339
+ // No selection: nothing is checked, so no destination shows the indicator
340
+ group.setGroupCheckable(Menu.NONE, false, true)
341
+ }
342
+ suppressCallbacks = false
343
+ }
344
+
345
+ // ---- Layout ----
346
+
347
+ private var manualLayoutPending = false
348
+
349
+ /**
350
+ * React Native's root view ignores requestLayout after the initial pass, so
351
+ * a native view that changes its own subtree later has to measure and lay
352
+ * itself out. Coalesced to one pass per frame.
353
+ */
354
+ override fun requestLayout() {
355
+ super.requestLayout()
356
+ if (!manualLayoutPending) {
357
+ manualLayoutPending = true
358
+ post { runManualLayout() }
359
+ }
360
+ }
361
+
362
+ private fun runManualLayout() {
363
+ manualLayoutPending = false
364
+ if (width == 0 || height == 0) return
365
+ measure(
366
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
367
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
368
+ )
369
+ layout(left, top, right, bottom)
370
+ }
371
+
372
+ /**
373
+ * The rail at its natural width and the height it is given. Material caps
374
+ * a non-exact width at the spec's size, so the cap is the screen width
375
+ * rather than an unspecified 0.
376
+ */
377
+ private fun measureRail(r: NavigationRailView, heightSpec: Int) {
378
+ val maxWidth = resources.displayMetrics.widthPixels
379
+ r.measure(MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST), heightSpec)
380
+ }
381
+
382
+ override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
383
+ val r = rail
384
+ if (r == null) {
385
+ setMeasuredDimension(0, 0)
386
+ return
387
+ }
388
+ val height = MeasureSpec.getSize(heightMeasureSpec)
389
+ measureRail(
390
+ r,
391
+ if (height > 0) MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
392
+ else MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
393
+ )
394
+ val width = MeasureSpec.getSize(widthMeasureSpec).let { if (it > 0) it else r.measuredWidth }
395
+ setMeasuredDimension(width, if (height > 0) height else r.measuredHeight)
396
+ }
397
+
398
+ override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
399
+ val r = rail ?: return
400
+ // The rail keeps its own width, at the start edge; Fabric follows it
401
+ val railWidth = r.measuredWidth
402
+ if (layoutDirection == View.LAYOUT_DIRECTION_RTL) {
403
+ r.layout(right - left - railWidth, 0, right - left, bottom - top)
404
+ } else {
405
+ r.layout(0, 0, railWidth, bottom - top)
406
+ }
407
+ // Material creates the label views as destinations are added; style any new ones
408
+ PCNavigationBarSupport.applyTestIDsAndFonts(r, items, labelFont)
409
+ }
410
+
411
+ /** Reports the natural width to Fabric; the height is left to the app's layout. */
412
+ fun reportIntrinsicSize() {
413
+ val r = rail ?: return
414
+ measureRail(
415
+ r,
416
+ if (height > 0) MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
417
+ else MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
418
+ )
419
+ reportWidth(r.measuredWidth)
420
+ }
421
+
422
+ /**
423
+ * Called with the rail's natural width, and with every width it passes
424
+ * through while it expands or collapses, so the content beside it follows.
425
+ */
426
+ private fun reportWidth(widthPx: Int) {
427
+ val wrapper = stateWrapper ?: return
428
+ if (widthPx <= 0) return
429
+ val widthDp = PixelUtil.toDIPFromPixel(widthPx.toFloat())
430
+ if (widthDp == lastReportedWidth) return
431
+ lastReportedWidth = widthDp
432
+ wrapper.updateState(
433
+ WritableNativeMap().apply {
434
+ putDouble("width", widthDp.toDouble())
435
+ putDouble("height", 0.0)
436
+ }
437
+ )
438
+ }
439
+
440
+ /** The Material rail, reporting its size as it changes (and animates). */
441
+ private class Rail(context: Context, private val onWidth: (Int) -> Unit) :
442
+ NavigationRailView(context, null, MaterialR.attr.navigationRailStyle) {
443
+ override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
444
+ super.onSizeChanged(w, h, oldw, oldh)
445
+ if (w != oldw) onWidth(w)
446
+ }
447
+ }
448
+ }
@@ -0,0 +1,176 @@
1
+ package com.platformcomponents
2
+
3
+ import android.view.View
4
+ import com.facebook.react.bridge.Arguments
5
+ import com.facebook.react.bridge.ReadableArray
6
+ import com.facebook.react.bridge.ReadableMap
7
+ import com.facebook.react.bridge.WritableMap
8
+ import com.facebook.react.uimanager.ReactStylesDiffMap
9
+ import com.facebook.react.uimanager.StateWrapper
10
+ import com.facebook.react.uimanager.ThemedReactContext
11
+ import com.facebook.react.uimanager.UIManagerHelper
12
+ import com.facebook.react.uimanager.ViewGroupManager
13
+ import com.facebook.react.uimanager.ViewManagerDelegate
14
+ import com.facebook.react.uimanager.events.Event
15
+ import com.facebook.react.viewmanagers.PCNavigationRailManagerDelegate
16
+ import com.facebook.react.viewmanagers.PCNavigationRailManagerInterface
17
+ import com.platformcomponents.PCButtonSupport.doubleOr
18
+ import com.platformcomponents.PCButtonSupport.stringOr
19
+
20
+ /**
21
+ * Android ViewManager for NavigationRail. A ViewGroupManager: its one React
22
+ * child, the header, goes into the rail's header slot, where the view lays
23
+ * it out.
24
+ */
25
+ class PCNavigationRailViewManager :
26
+ ViewGroupManager<PCNavigationRailView>(),
27
+ PCNavigationRailManagerInterface<PCNavigationRailView> {
28
+
29
+ private val delegate: ViewManagerDelegate<PCNavigationRailView> =
30
+ PCNavigationRailManagerDelegate(this)
31
+
32
+ override fun getName(): String = "PCNavigationRail"
33
+
34
+ override fun getDelegate(): ViewManagerDelegate<PCNavigationRailView> = delegate
35
+
36
+ override fun createViewInstance(reactContext: ThemedReactContext): PCNavigationRailView =
37
+ PCNavigationRailView(reactContext)
38
+
39
+ /**
40
+ * Pass the StateWrapper to the view so it can report its natural width,
41
+ * and report it right away so the first layout already fits.
42
+ */
43
+ override fun updateState(
44
+ view: PCNavigationRailView,
45
+ props: ReactStylesDiffMap,
46
+ stateWrapper: StateWrapper
47
+ ): Any? {
48
+ view.stateWrapper = stateWrapper
49
+ view.reportIntrinsicSize()
50
+ return null
51
+ }
52
+
53
+ override fun addEventEmitters(reactContext: ThemedReactContext, view: PCNavigationRailView) {
54
+ view.onItemPress = { index, value, reselected ->
55
+ PCHaptics.perform(view, view.haptics)
56
+ UIManagerHelper.getEventDispatcherForReactTag(reactContext, view.id)?.dispatchEvent(
57
+ ItemPressEvent(UIManagerHelper.getSurfaceId(view), view.id, index, value, reselected)
58
+ )
59
+ }
60
+ }
61
+
62
+ // --- Header (the one React child) ---
63
+
64
+ override fun addView(parent: PCNavigationRailView, child: View, index: Int) {
65
+ parent.setHeaderChild(child)
66
+ }
67
+
68
+ override fun removeViewAt(parent: PCNavigationRailView, index: Int) {
69
+ parent.setHeaderChild(null)
70
+ }
71
+
72
+ override fun getChildCount(parent: PCNavigationRailView): Int =
73
+ if (parent.headerView() != null) 1 else 0
74
+
75
+ override fun getChildAt(parent: PCNavigationRailView, index: Int): View? = parent.headerView()
76
+
77
+ // The rail places the header; Fabric only sizes it
78
+ override fun needsCustomLayoutForChildren(): Boolean = true
79
+
80
+ // --- Props ---
81
+
82
+ // items: [{label, value, disabled, icon…, selectedIcon…, badge, accessibilityLabel, testID, role}]
83
+ override fun setItems(view: PCNavigationRailView, value: ReadableArray?) {
84
+ view.applyItems(PCNavigationBarSupport.parseItems(value))
85
+ }
86
+
87
+ override fun setSelectedValue(view: PCNavigationRailView, value: String?) {
88
+ view.applySelectedValue(value ?: "")
89
+ }
90
+
91
+ override fun setLabelVisibility(view: PCNavigationRailView, value: String?) {
92
+ view.applyLabelVisibility(value)
93
+ }
94
+
95
+ // "top" | "center" | "bottom"
96
+ override fun setMenuGravity(view: PCNavigationRailView, value: String?) {
97
+ view.applyMenuGravity(value)
98
+ }
99
+
100
+ // "true" | "false"
101
+ override fun setExpanded(view: PCNavigationRailView, value: String?) {
102
+ view.applyExpanded(value == "true")
103
+ }
104
+
105
+ // Colors arrive already processed by React Native (ARGB ints)
106
+ override fun setActiveTintColor(view: PCNavigationRailView, value: Int?) {
107
+ view.applyColors(value, view.inactiveTintColor, view.railColor, view.indicatorColor, view.rippleColor)
108
+ }
109
+
110
+ override fun setInactiveTintColor(view: PCNavigationRailView, value: Int?) {
111
+ view.applyColors(view.activeTintColor, value, view.railColor, view.indicatorColor, view.rippleColor)
112
+ }
113
+
114
+ override fun setRailColor(view: PCNavigationRailView, value: Int?) {
115
+ view.applyColors(view.activeTintColor, view.inactiveTintColor, value, view.indicatorColor, view.rippleColor)
116
+ }
117
+
118
+ override fun setAndroidIndicatorColor(view: PCNavigationRailView, value: Int?) {
119
+ view.applyColors(view.activeTintColor, view.inactiveTintColor, view.railColor, value, view.rippleColor)
120
+ }
121
+
122
+ override fun setAndroidRippleColor(view: PCNavigationRailView, value: Int?) {
123
+ view.applyColors(view.activeTintColor, view.inactiveTintColor, view.railColor, view.indicatorColor, value)
124
+ }
125
+
126
+ override fun setBadgeBackgroundColor(view: PCNavigationRailView, value: Int?) {
127
+ view.applyBadgeColors(value, view.badgeTextColor)
128
+ }
129
+
130
+ override fun setBadgeTextColor(view: PCNavigationRailView, value: Int?) {
131
+ view.applyBadgeColors(view.badgeBackgroundColor, value)
132
+ }
133
+
134
+ // labelStyle: {fontFamily, fontSize, fontWeight, fontStyle}; empty / 0 = default
135
+ override fun setLabelStyle(view: PCNavigationRailView, value: ReadableMap?) {
136
+ view.applyLabelFont(
137
+ view.labelFont.copy(
138
+ family = value?.stringOr("fontFamily", "") ?: "",
139
+ size = value?.doubleOr("fontSize", 0.0)?.toFloat() ?: 0f,
140
+ weight = value?.stringOr("fontWeight", "") ?: "",
141
+ style = value?.stringOr("fontStyle", "") ?: ""
142
+ )
143
+ )
144
+ }
145
+
146
+ // "" (none added) | "none" | "selection" | "light" | "medium" | "heavy" | "success" | "warning" | "error"
147
+ override fun setHaptics(view: PCNavigationRailView, value: String?) {
148
+ view.haptics = PCHaptics.configure(view, value)
149
+ }
150
+
151
+ override fun setMaxFontSizeMultiplier(view: PCNavigationRailView, value: Double) {
152
+ view.applyLabelFont(view.labelFont.copy(maxFontSizeMultiplier = value.toFloat()))
153
+ }
154
+
155
+ // --- Events ---
156
+
157
+ private class ItemPressEvent(
158
+ surfaceId: Int,
159
+ viewTag: Int,
160
+ private val index: Int,
161
+ private val value: String,
162
+ private val reselected: Boolean
163
+ ) : Event<ItemPressEvent>(surfaceId, viewTag) {
164
+ // Every press counts; two quick presses must not merge into one
165
+ override fun canCoalesce(): Boolean = false
166
+
167
+ override fun getEventName(): String = "topItemPress"
168
+
169
+ // Fabric reads the payload from here
170
+ override fun getEventData(): WritableMap = Arguments.createMap().apply {
171
+ putInt("index", index)
172
+ putString("value", value)
173
+ putString("reselected", if (reselected) "true" else "false")
174
+ }
175
+ }
176
+ }