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,397 @@
1
+ package com.platformcomponents
2
+
3
+ import android.content.Context
4
+ import android.view.View
5
+ import android.widget.FrameLayout
6
+ import androidx.core.view.ViewCompat
7
+ import com.facebook.react.bridge.WritableNativeMap
8
+ import com.facebook.react.uimanager.PixelUtil
9
+ import com.facebook.react.uimanager.ReactCompoundViewGroup
10
+ import com.facebook.react.uimanager.StateWrapper
11
+ import com.facebook.react.uimanager.util.ReactFindViewUtil
12
+ import com.facebook.react.views.scroll.ReactScrollViewHelper
13
+ import com.google.android.material.bottomnavigation.BottomNavigationView
14
+ import com.platformcomponents.PCNavigationBarSupport.Indicator
15
+ import com.platformcomponents.PCNavigationBarSupport.Item
16
+ import com.platformcomponents.PCNavigationBarSupport.LabelFont
17
+
18
+ /**
19
+ * A Material 3 navigation bar (BottomNavigationView): icons over (or beside)
20
+ * labels, the active indicator, badges. Selection is controlled from JS; a
21
+ * press reports the tab and whether it was already selected.
22
+ *
23
+ * The bar is rebuilt for every prop that Material only reads at construction
24
+ * or when the menu is inflated; it keeps no state of its own besides the
25
+ * props, so a rebuild is invisible.
26
+ */
27
+ class PCTabBarView(context: Context) :
28
+ FrameLayout(context),
29
+ ReactScrollViewHelper.HasStateWrapper,
30
+ ReactCompoundViewGroup {
31
+
32
+ // --- State Wrapper for Fabric state updates ---
33
+ override var stateWrapper: StateWrapper? = null
34
+ private var lastReportedHeight: Float = -1f
35
+
36
+ // --- Props ---
37
+ var tabs: List<Item> = emptyList()
38
+ var selectedValue: String = ""
39
+ var labelVisibility: String = "auto"
40
+ var activeTintColor: Int? = null
41
+ var inactiveTintColor: Int? = null
42
+ var barColor: Int? = null
43
+ var badgeBackgroundColor: Int? = null
44
+ var badgeTextColor: Int? = null
45
+ var indicatorColor: Int? = null
46
+ var rippleColor: Int? = null
47
+ var labelFont: LabelFont = LabelFont()
48
+ var indicator: Indicator = Indicator()
49
+ var itemLayout: String = "" // "" | "vertical" | "horizontal" | "auto"
50
+ var minimizeBehavior: String = "" // "" | "automatic" | "never" | "onScrollDown" | "onScrollUp"
51
+ var scrollViewNativeID: String = ""
52
+ var accessoryID: String = "" // nativeID of the accessory view above the bar
53
+
54
+ /** The `haptics` prop; the manager plays it with the user's action (see PCHaptics). */
55
+ var haptics: String = ""
56
+
57
+ // --- Events ---
58
+ var onTabPress: ((index: Int, value: String, reselected: Boolean) -> Unit)? = null
59
+
60
+ // --- UI (declared before init: rebuildUI() runs from it) ---
61
+ private var bar: BottomNavigationView? = null
62
+ private var suppressCallbacks = false
63
+
64
+ /** Bumped on every rebuild so late image loads can't touch a stale bar. */
65
+ private var rebuildGeneration = 0
66
+
67
+ // --- Native theme ---
68
+ // Widgets read theme colors when they are created, so the bar is rebuilt
69
+ // when the native theme changes (brand color, light/dark switch).
70
+ private var builtThemeVersion = PCNativeTheme.version
71
+ private val nativeThemeListener = PCNativeTheme.Listener {
72
+ PCThemeSupport.clearColorStateListCaches(this)
73
+ rebuildUI()
74
+ }
75
+
76
+ init {
77
+ rebuildUI()
78
+ }
79
+
80
+ // ---- Public apply* (called by manager) ----
81
+
82
+ fun applyTabs(value: List<Item>) {
83
+ if (tabs == value) return
84
+ tabs = value
85
+ rebuildUI()
86
+ }
87
+
88
+ fun applySelectedValue(value: String) {
89
+ if (selectedValue == value) return
90
+ selectedValue = value
91
+ updateSelection()
92
+ }
93
+
94
+ fun applyLabelVisibility(value: String?) {
95
+ val next = value ?: "auto"
96
+ if (labelVisibility == next) return
97
+ labelVisibility = next
98
+ bar?.labelVisibilityMode = PCNavigationBarSupport.labelVisibilityMode(labelVisibility)
99
+ requestLayout()
100
+ }
101
+
102
+ fun applyColors(active: Int?, inactive: Int?, background: Int?, indicator: Int?, ripple: Int?) {
103
+ if (activeTintColor == active && inactiveTintColor == inactive && barColor == background &&
104
+ indicatorColor == indicator && rippleColor == ripple
105
+ ) return
106
+ activeTintColor = active
107
+ inactiveTintColor = inactive
108
+ barColor = background
109
+ indicatorColor = indicator
110
+ rippleColor = ripple
111
+ // The theme's colors are only known on a fresh bar
112
+ rebuildUI()
113
+ }
114
+
115
+ fun applyBadgeColors(background: Int?, text: Int?) {
116
+ if (badgeBackgroundColor == background && badgeTextColor == text) return
117
+ badgeBackgroundColor = background
118
+ badgeTextColor = text
119
+ bar?.let { PCNavigationBarSupport.applyBadges(it, tabs, badgeBackgroundColor, badgeTextColor) }
120
+ }
121
+
122
+ fun applyLabelFont(value: LabelFont) {
123
+ if (labelFont == value) return
124
+ labelFont = value
125
+ rebuildUI()
126
+ }
127
+
128
+ fun applyIndicator(value: Indicator) {
129
+ if (indicator == value) return
130
+ indicator = value
131
+ // Back to the theme's indicator for the fields left unset
132
+ rebuildUI()
133
+ }
134
+
135
+ fun applyItemLayout(value: String) {
136
+ if (itemLayout == value) return
137
+ itemLayout = value
138
+ bar?.let { PCNavigationBarSupport.applyItemLayout(it, itemLayout, width) }
139
+ requestLayout()
140
+ }
141
+
142
+ fun applyAccessoryID(value: String) {
143
+ if (accessoryID == value) return
144
+ if (barHidden) setBarHidden(false)
145
+ accessoryID = value
146
+ }
147
+
148
+ // ---- Hide on scroll ----
149
+ // Android has no minimized tab bar; the Material behavior is the bar
150
+ // sliding away while the content scrolls (HideBottomViewOnScrollBehavior),
151
+ // with its timings. The host view moves, so React Native's touch targeting
152
+ // follows it and the content underneath takes the touches.
153
+
154
+ private var watchedScrollView: View? = null
155
+ private var barHidden = false
156
+ private val scrollViewFinder = object : ReactFindViewUtil.OnViewFoundListener {
157
+ override fun getNativeId(): String = scrollViewNativeID
158
+ override fun onViewFound(view: View) = watch(view)
159
+ }
160
+
161
+ fun applyMinimize(behavior: String, nativeID: String) {
162
+ if (minimizeBehavior == behavior && scrollViewNativeID == nativeID) return
163
+ val targetChanged = scrollViewNativeID != nativeID
164
+ minimizeBehavior = behavior
165
+ scrollViewNativeID = nativeID
166
+ if (!hidesOnScroll) setBarHidden(false)
167
+ if (targetChanged || watchedScrollView == null) findScrollView()
168
+ }
169
+
170
+ private val hidesOnScroll: Boolean
171
+ get() = minimizeBehavior == "automatic" || minimizeBehavior == "onScrollDown" || minimizeBehavior == "onScrollUp"
172
+
173
+ /** The ScrollView with scrollViewNativeID, now or once it mounts. */
174
+ private fun findScrollView() {
175
+ unwatch()
176
+ ReactFindViewUtil.removeViewListener(scrollViewFinder)
177
+ if (scrollViewNativeID.isEmpty() || !isAttachedToWindow) return
178
+ val found = ReactFindViewUtil.findView(rootView, scrollViewNativeID)
179
+ if (found != null) watch(found) else ReactFindViewUtil.addViewListener(scrollViewFinder)
180
+ }
181
+
182
+ private fun watch(view: View) {
183
+ ReactFindViewUtil.removeViewListener(scrollViewFinder)
184
+ unwatch()
185
+ watchedScrollView = view
186
+ view.setOnScrollChangeListener { _, _, scrollY, _, oldScrollY -> onContentScrolled(scrollY, scrollY - oldScrollY) }
187
+ }
188
+
189
+ private fun unwatch() {
190
+ watchedScrollView?.setOnScrollChangeListener(null)
191
+ watchedScrollView = null
192
+ }
193
+
194
+ private fun onContentScrolled(scrollY: Int, dy: Int) {
195
+ if (!hidesOnScroll || dy == 0) return
196
+ val scrollingDown = dy > 0
197
+ // Back at the top the bar always shows
198
+ val hide = scrollY > 0 && if (minimizeBehavior == "onScrollUp") !scrollingDown else scrollingDown
199
+ setBarHidden(hide)
200
+ }
201
+
202
+ /** The accessory view above the bar (TabBar's `accessory`), if any. */
203
+ private fun accessoryView(): View? =
204
+ if (accessoryID.isEmpty() || !isAttachedToWindow) null
205
+ else ReactFindViewUtil.findView(rootView, accessoryID)
206
+
207
+ private fun setBarHidden(hide: Boolean) {
208
+ if (barHidden == hide) return
209
+ barHidden = hide
210
+ // An accessory above the bar slides away with it, as one bottom group
211
+ val accessory = accessoryView()
212
+ val distance = height + (accessory?.height ?: 0)
213
+ for (view in listOfNotNull(this, accessory)) {
214
+ view.animate().cancel()
215
+ view.animate()
216
+ .translationY(if (hide) distance.toFloat() else 0f)
217
+ .setDuration(if (hide) 175L else 225L)
218
+ .setInterpolator(
219
+ if (hide) android.view.animation.AccelerateInterpolator() else android.view.animation.DecelerateInterpolator()
220
+ )
221
+ .start()
222
+ }
223
+ }
224
+
225
+ // ---- Touch ----
226
+
227
+ // The tab views carry the menu item ids, which React Native's touch handling
228
+ // would take for React tags. Claim the touch for this view; the tabs still
229
+ // receive it natively.
230
+ override fun interceptsTouchEvent(touchX: Float, touchY: Float): Boolean = true
231
+
232
+ override fun reactTagForTouch(touchX: Float, touchY: Float): Int = id
233
+
234
+ // ---- Lifecycle ----
235
+
236
+ override fun onAttachedToWindow() {
237
+ super.onAttachedToWindow()
238
+ PCNativeTheme.addListener(nativeThemeListener)
239
+ PCNativeTheme.attach(context)
240
+ if (builtThemeVersion != PCNativeTheme.version) nativeThemeListener.onNativeThemeChanged()
241
+ if (hidesOnScroll && watchedScrollView == null) findScrollView()
242
+ }
243
+
244
+ override fun onDetachedFromWindow() {
245
+ ReactFindViewUtil.removeViewListener(scrollViewFinder)
246
+ unwatch()
247
+ PCNativeTheme.removeListener(nativeThemeListener)
248
+ super.onDetachedFromWindow()
249
+ }
250
+
251
+ // ---- UI Building ----
252
+
253
+ private fun rebuildUI() {
254
+ builtThemeVersion = PCNativeTheme.version
255
+ removeAllViews()
256
+ rebuildGeneration += 1
257
+ val generation = rebuildGeneration
258
+
259
+ // Material widgets need a Material theme; fall back to Material 3 defaults instead of crashing.
260
+ val base = PCThemeSupport.materialContext(context, "TabBar")
261
+ val b = BottomNavigationView(base).apply {
262
+ layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
263
+ labelVisibilityMode = PCNavigationBarSupport.labelVisibilityMode(labelVisibility)
264
+ }
265
+ // The bar pads itself for the system navigation bar when it sits at the
266
+ // bottom of the window; here it is a control inside the app's layout,
267
+ // which handles safe areas itself
268
+ ViewCompat.setOnApplyWindowInsetsListener(b, null)
269
+ b.setPadding(0, 0, 0, 0)
270
+
271
+ PCNavigationBarSupport.applyColors(b, activeTintColor, inactiveTintColor, indicatorColor, rippleColor, barColor)
272
+ PCNavigationBarSupport.populateMenu(b, tabs, isCurrent = { generation == rebuildGeneration }) {
273
+ requestLayout()
274
+ }
275
+
276
+ PCNavigationBarSupport.applyIndicator(b, indicator)
277
+ PCNavigationBarSupport.applyItemLayout(b, itemLayout, width)
278
+ // Select or reselect is decided against selectedValue: with no tab
279
+ // selected the widget still counts its last one as selected
280
+ b.setOnItemSelectedListener { item ->
281
+ if (!suppressCallbacks) report(item.itemId - 1)
282
+ // Controlled: the selection follows selectedValue once JS updates it
283
+ post { updateSelection() }
284
+ true
285
+ }
286
+ b.setOnItemReselectedListener { item ->
287
+ if (!suppressCallbacks) report(item.itemId - 1)
288
+ }
289
+
290
+ addView(b)
291
+ bar = b
292
+ PCNavigationBarSupport.applyBadges(b, tabs, badgeBackgroundColor, badgeTextColor)
293
+ updateSelection()
294
+ PCNavigationBarSupport.applyTestIDsAndFonts(b, tabs, labelFont)
295
+ requestLayout()
296
+ }
297
+
298
+ private fun report(index: Int) {
299
+ if (index !in tabs.indices) return
300
+ val value = tabs[index].value
301
+ onTabPress?.invoke(index, value, value == selectedValue)
302
+ }
303
+
304
+ private fun updateSelection() {
305
+ val b = bar ?: return
306
+ val index = tabs.indexOfFirst { it.value == selectedValue }
307
+ suppressCallbacks = true
308
+ val group = b.menu
309
+ if (index in 0 until minOf(tabs.size, b.maxItemCount)) {
310
+ group.setGroupCheckable(android.view.Menu.NONE, true, true)
311
+ val id = PCNavigationBarSupport.itemId(index)
312
+ if (b.selectedItemId != id) b.selectedItemId = id
313
+ } else {
314
+ // No selection: nothing is checked, so no tab shows the indicator
315
+ group.setGroupCheckable(android.view.Menu.NONE, false, true)
316
+ }
317
+ suppressCallbacks = false
318
+ }
319
+
320
+ // ---- Layout ----
321
+
322
+ private var manualLayoutPending = false
323
+
324
+ /**
325
+ * React Native's root view ignores requestLayout after the initial pass, so
326
+ * a native view that changes its own subtree later has to measure and lay
327
+ * itself out. Coalesced to one pass per frame.
328
+ */
329
+ override fun requestLayout() {
330
+ super.requestLayout()
331
+ if (!manualLayoutPending) {
332
+ manualLayoutPending = true
333
+ post { runManualLayout() }
334
+ }
335
+ }
336
+
337
+ private fun runManualLayout() {
338
+ manualLayoutPending = false
339
+ if (width == 0 || height == 0) return
340
+ measure(
341
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
342
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
343
+ )
344
+ layout(left, top, right, bottom)
345
+ }
346
+
347
+ override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
348
+ val b = bar
349
+ if (b == null) {
350
+ setMeasuredDimension(0, 0)
351
+ return
352
+ }
353
+ val width = MeasureSpec.getSize(widthMeasureSpec).let {
354
+ if (it > 0) it else (PCConstants.FALLBACK_WIDTH_DP * resources.displayMetrics.density).toInt()
355
+ }
356
+ PCNavigationBarSupport.applyItemLayout(b, itemLayout, width)
357
+ b.measure(
358
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
359
+ MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
360
+ )
361
+ // Keep the bar's natural height even before Yoga has caught up
362
+ setMeasuredDimension(width, b.measuredHeight)
363
+ reportHeight(b.measuredHeight)
364
+ }
365
+
366
+ override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
367
+ val b = bar ?: return
368
+ b.layout(0, 0, right - left, b.measuredHeight)
369
+ // Material creates the label views as tabs are added; style any new ones
370
+ PCNavigationBarSupport.applyTestIDsAndFonts(b, tabs, labelFont)
371
+ }
372
+
373
+ /** Reports the intrinsic height to Fabric; the width is left to Yoga. */
374
+ fun reportIntrinsicSize() {
375
+ val b = bar ?: return
376
+ val width = if (width > 0) width else (PCConstants.FALLBACK_WIDTH_DP * resources.displayMetrics.density).toInt()
377
+ PCNavigationBarSupport.applyItemLayout(b, itemLayout, width)
378
+ b.measure(
379
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
380
+ MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
381
+ )
382
+ reportHeight(b.measuredHeight)
383
+ }
384
+
385
+ private fun reportHeight(heightPx: Int) {
386
+ val wrapper = stateWrapper ?: return
387
+ val heightDp = PixelUtil.toDIPFromPixel(heightPx.toFloat())
388
+ if (heightDp == lastReportedHeight) return
389
+ lastReportedHeight = heightDp
390
+ wrapper.updateState(
391
+ WritableNativeMap().apply {
392
+ putDouble("width", 0.0)
393
+ putDouble("height", heightDp.toDouble())
394
+ }
395
+ )
396
+ }
397
+ }
@@ -0,0 +1,182 @@
1
+ package com.platformcomponents
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.ReadableArray
5
+ import com.facebook.react.bridge.ReadableMap
6
+ import com.facebook.react.bridge.WritableMap
7
+ import com.facebook.react.uimanager.ReactStylesDiffMap
8
+ import com.facebook.react.uimanager.SimpleViewManager
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.ViewManagerDelegate
13
+ import com.facebook.react.uimanager.events.Event
14
+ import com.facebook.react.viewmanagers.PCTabBarManagerDelegate
15
+ import com.facebook.react.viewmanagers.PCTabBarManagerInterface
16
+ import com.platformcomponents.PCButtonSupport.doubleOr
17
+ import com.platformcomponents.PCButtonSupport.stringOr
18
+
19
+ class PCTabBarViewManager :
20
+ SimpleViewManager<PCTabBarView>(),
21
+ PCTabBarManagerInterface<PCTabBarView> {
22
+
23
+ private val delegate: ViewManagerDelegate<PCTabBarView> = PCTabBarManagerDelegate(this)
24
+
25
+ override fun getName(): String = "PCTabBar"
26
+
27
+ override fun getDelegate(): ViewManagerDelegate<PCTabBarView> = delegate
28
+
29
+ override fun createViewInstance(reactContext: ThemedReactContext): PCTabBarView =
30
+ PCTabBarView(reactContext)
31
+
32
+ /**
33
+ * Pass the StateWrapper to the view so it can update Fabric state with its
34
+ * natural height, and report it right away so the first layout already fits.
35
+ */
36
+ override fun updateState(
37
+ view: PCTabBarView,
38
+ props: ReactStylesDiffMap,
39
+ stateWrapper: StateWrapper
40
+ ): Any? {
41
+ view.stateWrapper = stateWrapper
42
+ view.reportIntrinsicSize()
43
+ return null
44
+ }
45
+
46
+ override fun addEventEmitters(reactContext: ThemedReactContext, view: PCTabBarView) {
47
+ // Looked up per press, with the view's surface: a bar mounted inside
48
+ // another native container (a FloatingToolbar) lost its events when the
49
+ // dispatcher was taken at creation
50
+ view.onTabPress = { index, value, reselected ->
51
+ PCHaptics.perform(view, view.haptics)
52
+ UIManagerHelper.getEventDispatcherForReactTag(reactContext, view.id)?.dispatchEvent(
53
+ TabPressEvent(UIManagerHelper.getSurfaceId(view), view.id, index, value, reselected)
54
+ )
55
+ }
56
+ }
57
+
58
+ // --- Props ---
59
+
60
+ override fun setItems(view: PCTabBarView, value: ReadableArray?) {
61
+ view.applyTabs(PCNavigationBarSupport.parseItems(value))
62
+ }
63
+
64
+ override fun setSelectedValue(view: PCTabBarView, value: String?) {
65
+ view.applySelectedValue(value ?: "")
66
+ }
67
+
68
+ override fun setLabelVisibility(view: PCTabBarView, value: String?) {
69
+ view.applyLabelVisibility(value)
70
+ }
71
+
72
+ // Colors arrive already processed by React Native (ARGB ints)
73
+ override fun setActiveTintColor(view: PCTabBarView, value: Int?) {
74
+ view.applyColors(value, view.inactiveTintColor, view.barColor, view.indicatorColor, view.rippleColor)
75
+ }
76
+
77
+ override fun setInactiveTintColor(view: PCTabBarView, value: Int?) {
78
+ view.applyColors(view.activeTintColor, value, view.barColor, view.indicatorColor, view.rippleColor)
79
+ }
80
+
81
+ override fun setBarColor(view: PCTabBarView, value: Int?) {
82
+ view.applyColors(view.activeTintColor, view.inactiveTintColor, value, view.indicatorColor, view.rippleColor)
83
+ }
84
+
85
+ override fun setAndroidIndicatorColor(view: PCTabBarView, value: Int?) {
86
+ view.applyColors(view.activeTintColor, view.inactiveTintColor, view.barColor, value, view.rippleColor)
87
+ }
88
+
89
+ override fun setAndroidRippleColor(view: PCTabBarView, value: Int?) {
90
+ view.applyColors(view.activeTintColor, view.inactiveTintColor, view.barColor, view.indicatorColor, value)
91
+ }
92
+
93
+ override fun setBadgeBackgroundColor(view: PCTabBarView, value: Int?) {
94
+ view.applyBadgeColors(value, view.badgeTextColor)
95
+ }
96
+
97
+ override fun setBadgeTextColor(view: PCTabBarView, value: Int?) {
98
+ view.applyBadgeColors(view.badgeBackgroundColor, value)
99
+ }
100
+
101
+ // labelStyle: {fontFamily, fontSize, fontWeight, fontStyle}; empty / 0 = default
102
+ override fun setLabelStyle(view: PCTabBarView, value: ReadableMap?) {
103
+ view.applyLabelFont(
104
+ view.labelFont.copy(
105
+ family = value?.stringOr("fontFamily", "") ?: "",
106
+ size = value?.doubleOr("fontSize", 0.0)?.toFloat() ?: 0f,
107
+ weight = value?.stringOr("fontWeight", "") ?: "",
108
+ style = value?.stringOr("fontStyle", "") ?: ""
109
+ )
110
+ )
111
+ }
112
+
113
+ // Active indicator: 'true' | 'false' ('' = shown), shape, size in dp
114
+ override fun setAndroidIndicator(view: PCTabBarView, value: String?) {
115
+ view.applyIndicator(view.indicator.copy(enabled = value != "false"))
116
+ }
117
+
118
+ override fun setAndroidIndicatorShape(view: PCTabBarView, value: String?) {
119
+ view.applyIndicator(view.indicator.copy(shape = value ?: ""))
120
+ }
121
+
122
+ override fun setAndroidIndicatorCornerRadius(view: PCTabBarView, value: Double) {
123
+ view.applyIndicator(view.indicator.copy(cornerRadius = value.toFloat()))
124
+ }
125
+
126
+ override fun setAndroidIndicatorWidth(view: PCTabBarView, value: Double) {
127
+ view.applyIndicator(view.indicator.copy(width = value.toFloat()))
128
+ }
129
+
130
+ override fun setAndroidIndicatorHeight(view: PCTabBarView, value: Double) {
131
+ view.applyIndicator(view.indicator.copy(height = value.toFloat()))
132
+ }
133
+
134
+ // '' | 'vertical' | 'horizontal' | 'auto'
135
+ override fun setAndroidItemLayout(view: PCTabBarView, value: String?) {
136
+ view.applyItemLayout(value ?: "")
137
+ }
138
+
139
+ // The accessory view above the bar, by nativeID: it slides away with the bar
140
+ override fun setAccessoryID(view: PCTabBarView, value: String?) {
141
+ view.applyAccessoryID(value ?: "")
142
+ }
143
+
144
+ // "" (none added) | "none" | "selection" | "light" | "medium" | "heavy" | "success" | "warning" | "error"
145
+ override fun setHaptics(view: PCTabBarView, value: String?) {
146
+ view.haptics = PCHaptics.configure(view, value)
147
+ }
148
+
149
+ override fun setMinimizeBehavior(view: PCTabBarView, value: String?) {
150
+ view.applyMinimize(value ?: "", view.scrollViewNativeID)
151
+ }
152
+
153
+ override fun setScrollViewNativeID(view: PCTabBarView, value: String?) {
154
+ view.applyMinimize(view.minimizeBehavior, value ?: "")
155
+ }
156
+
157
+ override fun setMaxFontSizeMultiplier(view: PCTabBarView, value: Double) {
158
+ view.applyLabelFont(view.labelFont.copy(maxFontSizeMultiplier = value.toFloat()))
159
+ }
160
+
161
+ // --- Events ---
162
+
163
+ private class TabPressEvent(
164
+ surfaceId: Int,
165
+ viewTag: Int,
166
+ private val index: Int,
167
+ private val value: String,
168
+ private val reselected: Boolean
169
+ ) : Event<TabPressEvent>(surfaceId, viewTag) {
170
+ // Every press counts; two quick presses must not merge into one
171
+ override fun canCoalesce(): Boolean = false
172
+
173
+ override fun getEventName(): String = "topTabPress"
174
+
175
+ // Fabric reads the payload from here
176
+ override fun getEventData(): WritableMap = Arguments.createMap().apply {
177
+ putInt("index", index)
178
+ putString("value", value)
179
+ putString("reselected", if (reselected) "true" else "false")
180
+ }
181
+ }
182
+ }