react-native-platform-components 1.4.0 → 1.6.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 (600) 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.cjs +79 -6
  525. package/plugin/build/index.d.ts +27 -2
  526. package/plugin/build/index.d.ts.map +1 -1
  527. package/plugin/tsconfig.json +2 -1
  528. package/react-native.config.js +3 -0
  529. package/shared/PCFloatingActionButtonComponentDescriptors-custom.h +22 -0
  530. package/shared/PCFloatingActionButtonShadowNode-custom.cpp +48 -0
  531. package/shared/PCFloatingActionButtonShadowNode-custom.h +54 -0
  532. package/shared/PCFloatingActionButtonState-custom.h +61 -0
  533. package/shared/PCNavigationRailComponentDescriptors-custom.h +47 -0
  534. package/shared/PCNavigationRailShadowNode-custom.h +42 -0
  535. package/shared/PCNavigationRailState-custom.h +62 -0
  536. package/shared/PCTabBarComponentDescriptors-custom.h +22 -0
  537. package/shared/PCTabBarShadowNode-custom.cpp +54 -0
  538. package/shared/PCTabBarShadowNode-custom.h +54 -0
  539. package/shared/PCTabBarState-custom.h +62 -0
  540. package/shared/react/renderer/components/PlatformComponentsViewSpec/ComponentDescriptors.h +3 -0
  541. package/src/Button.tsx +222 -7
  542. package/src/ButtonGroup.tsx +29 -11
  543. package/src/ButtonGroupNativeComponent.ts +74 -4
  544. package/src/ButtonNativeComponent.ts +119 -3
  545. package/src/ContextMenu.tsx +34 -81
  546. package/src/ContextMenuNativeComponent.ts +47 -49
  547. package/src/DatePicker.tsx +182 -4
  548. package/src/DatePickerNativeComponent.ts +19 -2
  549. package/src/FloatingActionButton.tsx +121 -0
  550. package/src/FloatingActionButtonNativeComponent.ts +58 -0
  551. package/src/FloatingToolbar.tsx +54 -3
  552. package/src/FloatingToolbarNativeComponent.ts +16 -0
  553. package/src/LiquidGlass.tsx +24 -1
  554. package/src/LiquidGlassContainer.tsx +42 -0
  555. package/src/LiquidGlassContainerNativeComponent.ts +17 -0
  556. package/src/LiquidGlassNativeComponent.ts +8 -0
  557. package/src/NavigationRail.tsx +203 -0
  558. package/src/NavigationRailNativeComponent.ts +107 -0
  559. package/src/PlatformComponentsProvider.tsx +15 -0
  560. package/src/SegmentedControl.tsx +31 -1
  561. package/src/SegmentedControlNativeComponent.ts +11 -0
  562. package/src/SelectionMenu.tsx +81 -6
  563. package/src/SelectionMenuNativeComponent.ts +26 -4
  564. package/src/SplitButton.tsx +198 -0
  565. package/src/TabBar.tsx +373 -0
  566. package/src/TabBarAccessoryNativeComponent.ts +19 -0
  567. package/src/TabBarNativeComponent.ts +145 -0
  568. package/src/TextField.tsx +428 -14
  569. package/src/TextFieldNativeComponent.ts +110 -4
  570. package/src/focusRegistry.ts +1 -0
  571. package/src/haptics.ts +31 -0
  572. package/src/icons.ts +28 -1
  573. package/src/index.tsx +7 -0
  574. package/src/index.web.tsx +51 -391
  575. package/src/jest.tsx +958 -0
  576. package/src/menuItems.ts +152 -0
  577. package/src/selectionIdentifiers.ts +17 -0
  578. package/src/submitBehavior.ts +16 -0
  579. package/src/tabItems.ts +113 -0
  580. package/src/web/Button.tsx +201 -0
  581. package/src/web/ButtonGroup.tsx +154 -0
  582. package/src/web/DatePicker.tsx +204 -0
  583. package/src/web/DateRangePicker.tsx +135 -0
  584. package/src/web/Dialog.tsx +54 -0
  585. package/src/web/FloatingActionButton.tsx +76 -0
  586. package/src/web/Icon.tsx +33 -0
  587. package/src/web/NativeTheme.ts +23 -0
  588. package/src/web/NavigationRail.tsx +148 -0
  589. package/src/web/PlatformComponentsProvider.tsx +48 -0
  590. package/src/web/SegmentedControl.tsx +127 -0
  591. package/src/web/SelectionMenu.tsx +149 -0
  592. package/src/web/SplitButton.tsx +32 -0
  593. package/src/web/TabBar.tsx +150 -0
  594. package/src/web/TextField.tsx +361 -0
  595. package/src/web/components.tsx +71 -0
  596. package/src/web/containers.tsx +130 -0
  597. package/src/web/dateInput.ts +137 -0
  598. package/src/web/shared.ts +176 -0
  599. package/src/webComponents.ts +45 -0
  600. package/android/src/main/java/com/platformcomponents/DateConstraints.kt +0 -83
@@ -1,6 +1,7 @@
1
1
  package com.platformcomponents
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.ReadableArray
4
5
  import com.facebook.react.bridge.ReadableMap
5
6
  import com.facebook.react.uimanager.ReactStylesDiffMap
6
7
  import com.facebook.react.uimanager.SimpleViewManager
@@ -59,8 +60,14 @@ class PCTextFieldViewManager :
59
60
  view.onSubmit = { text ->
60
61
  dispatcher?.dispatchEvent(TextEvent(view.id, "topFieldSubmit", text))
61
62
  }
63
+ view.onSelectionChange = { start, end ->
64
+ dispatcher?.dispatchEvent(SelectionEvent(view.id, start, end))
65
+ }
62
66
  view.onTrailingIconPress = {
63
- dispatcher?.dispatchEvent(TrailingIconPressEvent(view.id))
67
+ dispatcher?.dispatchEvent(EmptyEvent(view.id, "topTrailingIconPress"))
68
+ }
69
+ view.onPress = {
70
+ dispatcher?.dispatchEvent(EmptyEvent(view.id, "topFieldPress"))
64
71
  }
65
72
  }
66
73
 
@@ -147,6 +154,15 @@ class PCTextFieldViewManager :
147
154
  view.applyMultiline(value == "multiline")
148
155
  }
149
156
 
157
+ override fun setSubmitBehavior(view: PCTextFieldView, value: String?) {
158
+ view.applySubmitBehavior(value ?: "")
159
+ }
160
+
161
+ override fun setKeyboardToolbarItems(view: PCTextFieldView, value: ReadableArray?) {
162
+ // iOS only: Android keyboards have no toolbar; returnKeyType picks the
163
+ // action key, which number pads have too
164
+ }
165
+
150
166
  override fun setInteractivity(view: PCTextFieldView, value: String?) {
151
167
  view.applyInteractivity(value)
152
168
  }
@@ -181,6 +197,77 @@ class PCTextFieldViewManager :
181
197
  view.applySpokenLabel(value ?: "")
182
198
  }
183
199
 
200
+ /**
201
+ * testID goes on the EditText, where Espresso types (Detox matches the view
202
+ * tag); the host keeps only React Native's own test-id key, so one id never
203
+ * matches two views.
204
+ */
205
+ override fun setTestId(view: PCTextFieldView, testId: String?) {
206
+ view.setTag(com.facebook.react.R.id.react_test_id, testId)
207
+ view.applyInputTestID(testId ?: "")
208
+ }
209
+
210
+ override fun setLeadingIconTestID(view: PCTextFieldView, value: String?) {
211
+ view.applyIconAccessibility(value ?: "", view.leadingIconSpokenLabel, view.trailingIconTestID, view.trailingIconSpokenLabel)
212
+ }
213
+
214
+ override fun setLeadingIconSpokenLabel(view: PCTextFieldView, value: String?) {
215
+ view.applyIconAccessibility(view.leadingIconTestID, value ?: "", view.trailingIconTestID, view.trailingIconSpokenLabel)
216
+ }
217
+
218
+ override fun setTrailingIconTestID(view: PCTextFieldView, value: String?) {
219
+ view.applyIconAccessibility(view.leadingIconTestID, view.leadingIconSpokenLabel, value ?: "", view.trailingIconSpokenLabel)
220
+ }
221
+
222
+ override fun setTrailingIconSpokenLabel(view: PCTextFieldView, value: String?) {
223
+ view.applyIconAccessibility(view.leadingIconTestID, view.leadingIconSpokenLabel, view.trailingIconTestID, value ?: "")
224
+ }
225
+
226
+ // Colors: processed color ints, null when unset
227
+ override fun setActiveColor(view: PCTextFieldView, value: Int?) {
228
+ view.applyColors(value, view.outlineColor, view.errorColor, view.containerColor, view.textColor, view.placeholderTextColor)
229
+ }
230
+
231
+ override fun setOutlineColor(view: PCTextFieldView, value: Int?) {
232
+ view.applyColors(view.activeColor, value, view.errorColor, view.containerColor, view.textColor, view.placeholderTextColor)
233
+ }
234
+
235
+ override fun setErrorColor(view: PCTextFieldView, value: Int?) {
236
+ view.applyColors(view.activeColor, view.outlineColor, value, view.containerColor, view.textColor, view.placeholderTextColor)
237
+ }
238
+
239
+ override fun setContainerColor(view: PCTextFieldView, value: Int?) {
240
+ view.applyColors(view.activeColor, view.outlineColor, view.errorColor, value, view.textColor, view.placeholderTextColor)
241
+ }
242
+
243
+ override fun setTextColor(view: PCTextFieldView, value: Int?) {
244
+ view.applyColors(view.activeColor, view.outlineColor, view.errorColor, view.containerColor, value, view.placeholderTextColor)
245
+ }
246
+
247
+ override fun setPlaceholderTextColor(view: PCTextFieldView, value: Int?) {
248
+ view.applyColors(view.activeColor, view.outlineColor, view.errorColor, view.containerColor, view.textColor, value)
249
+ }
250
+
251
+ override fun setMaxFontSizeMultiplier(view: PCTextFieldView, value: Double) {
252
+ view.applyMaxFontSizeMultiplier(value.toFloat())
253
+ }
254
+
255
+ override fun setTextAlign(view: PCTextFieldView, value: String?) {
256
+ view.applyTextAlign(value ?: "")
257
+ }
258
+
259
+ override fun setMinLines(view: PCTextFieldView, value: Int) {
260
+ view.applyLineBounds(value, view.maxLines)
261
+ }
262
+
263
+ override fun setMaxLines(view: PCTextFieldView, value: Int) {
264
+ view.applyLineBounds(view.minLines, value)
265
+ }
266
+
267
+ override fun setPressMode(view: PCTextFieldView, value: String?) {
268
+ view.applyPressable(value == "button")
269
+ }
270
+
184
271
  override fun setIos(view: PCTextFieldView, value: ReadableMap?) {
185
272
  // Android ignores iOS config
186
273
  }
@@ -210,6 +297,10 @@ class PCTextFieldViewManager :
210
297
  view.setTextFromJS(eventCount, text ?: "")
211
298
  }
212
299
 
300
+ override fun setSelection(view: PCTextFieldView, eventCount: Int, start: Int, end: Int) {
301
+ view.setSelectionFromJS(eventCount, start, end)
302
+ }
303
+
213
304
  // --- Events ---
214
305
 
215
306
  private class ChangeEvent(
@@ -239,8 +330,23 @@ class PCTextFieldViewManager :
239
330
  }
240
331
  }
241
332
 
242
- private class TrailingIconPressEvent(surfaceId: Int) : Event<TrailingIconPressEvent>(surfaceId) {
243
- override fun getEventName(): String = "topTrailingIconPress"
333
+ private class SelectionEvent(
334
+ surfaceId: Int,
335
+ private val start: Int,
336
+ private val end: Int
337
+ ) : Event<SelectionEvent>(surfaceId) {
338
+ override fun getEventName(): String = "topFieldSelectionChange"
339
+ override fun dispatch(rctEventEmitter: RCTEventEmitter) {
340
+ val payload = Arguments.createMap().apply {
341
+ putInt("start", start)
342
+ putInt("end", end)
343
+ }
344
+ rctEventEmitter.receiveEvent(viewTag, eventName, payload)
345
+ }
346
+ }
347
+
348
+ private class EmptyEvent(surfaceId: Int, private val name: String) : Event<EmptyEvent>(surfaceId) {
349
+ override fun getEventName(): String = name
244
350
  override fun dispatch(rctEventEmitter: RCTEventEmitter) {
245
351
  rctEventEmitter.receiveEvent(viewTag, eventName, Arguments.createMap())
246
352
  }
@@ -1,12 +1,14 @@
1
1
  package com.platformcomponents
2
2
 
3
3
  import android.content.Context
4
+ import android.os.Build
4
5
  import android.content.res.Resources
5
6
  import android.util.Log
6
7
  import android.util.TypedValue
7
8
  import android.view.ContextThemeWrapper
8
9
  import android.view.View
9
10
  import android.view.ViewGroup
11
+ import android.widget.TextView
10
12
  import androidx.annotation.AttrRes
11
13
  import androidx.appcompat.R as AppCompatR
12
14
  import androidx.core.content.res.ResourcesCompat
@@ -28,6 +30,41 @@ internal object PCThemeSupport {
28
30
  @Volatile private var warnedMaterial = false
29
31
  @Volatile private var warnedAppCompat = false
30
32
 
33
+ /**
34
+ * Caps [view]'s text size at [maxMultiplier] times its size at the default
35
+ * font scale (React Native's maxFontSizeMultiplier); no-op below 1 or when
36
+ * the system scale is within the cap. The capped size is remembered on the
37
+ * view, so repeated calls leave it alone until something else sets a size.
38
+ */
39
+ fun capTextSize(view: TextView, maxMultiplier: Float) {
40
+ val resources = view.resources
41
+ val fontScale = resources.configuration.fontScale
42
+ val capped = view.getTag(R.id.pc_capped_text_size) as? Float
43
+ val px = view.textSize
44
+ if (capped != null && capped == px) return
45
+ if (maxMultiplier < 1f || fontScale <= maxMultiplier) return
46
+ val metrics = resources.displayMetrics
47
+ // The size in sp the view was given, undoing the (possibly non-linear) scale
48
+ val sp = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
49
+ TypedValue.deriveDimension(TypedValue.COMPLEX_UNIT_SP, px, metrics)
50
+ } else {
51
+ px / (metrics.density * fontScale)
52
+ }
53
+ val max = sp * metrics.density * maxMultiplier
54
+ if (px <= max) return
55
+ view.setTextSize(TypedValue.COMPLEX_UNIT_PX, max)
56
+ view.setTag(R.id.pc_capped_text_size, view.textSize)
57
+ }
58
+
59
+ /** [capTextSize] for every TextView under [root]. */
60
+ fun capTextSizes(root: View, maxMultiplier: Float) {
61
+ if (maxMultiplier < 1f || root.resources.configuration.fontScale <= maxMultiplier) return
62
+ if (root is TextView) capTextSize(root, maxMultiplier)
63
+ if (root is ViewGroup) {
64
+ for (i in 0 until root.childCount) capTextSizes(root.getChildAt(i), maxMultiplier)
65
+ }
66
+ }
67
+
31
68
  /** True for Theme.MaterialComponents.* and Theme.Material3.* (and descendants). */
32
69
  fun hasMaterialTheme(context: Context): Boolean =
33
70
  resolves(context, MaterialR.attr.materialButtonOutlinedStyle) &&
@@ -20,7 +20,11 @@ class PlatformComponentsViewPackage : BaseReactPackage() {
20
20
  PCButtonGroupViewManager(),
21
21
  PCFloatingToolbarViewManager(),
22
22
  PCLiquidGlassViewManager(),
23
+ PCLiquidGlassContainerViewManager(),
23
24
  PCTextFieldViewManager(),
25
+ PCTabBarViewManager(),
26
+ PCNavigationRailViewManager(),
27
+ PCFloatingActionButtonViewManager(),
24
28
  )
25
29
  }
26
30
 
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- The Material "search" icon (Apache 2.0), for a TabBar search tab
3
+ given no icon of its own. Tinted by the bar. -->
4
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
5
+ android:width="24dp"
6
+ android:height="24dp"
7
+ android:viewportWidth="24"
8
+ android:viewportHeight="24">
9
+ <path
10
+ android:fillColor="#FF000000"
11
+ android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z" />
12
+ </vector>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <resources>
3
+ <!-- The text size a view was capped at (maxFontSizeMultiplier); see PCThemeSupport.capTextSize -->
4
+ <item name="pc_capped_text_size" type="id" />
5
+ </resources>
@@ -1,5 +1,15 @@
1
1
  <?xml version="1.0" encoding="utf-8"?>
2
2
  <resources>
3
+ <!-- Select spinner mode before DatePicker constructs its native delegate. -->
4
+ <style name="PCInlineDatePickerThemeOverlay" parent="">
5
+ <item name="android:datePickerStyle">@style/PCInlineDatePicker</item>
6
+ </style>
7
+ <style name="PCInlineDatePicker" parent="@android:style/Widget.Material.DatePicker">
8
+ <item name="android:datePickerMode">spinner</item>
9
+ <item name="android:calendarViewShown">false</item>
10
+ <item name="android:spinnersShown">true</item>
11
+ </style>
12
+
3
13
  <!--
4
14
  Fallback dialog themes for MaterialDatePicker / MaterialTimePicker when the host
5
15
  app theme is not a Material theme (see PCThemeSupport). Each is a full
@@ -351,4 +361,18 @@
351
361
  <style name="PCTextField.Filled.Dense">
352
362
  <item name="textInputStyle">@style/Widget.Material3.TextInputLayout.FilledBox.Dense</item>
353
363
  </style>
364
+
365
+ <!--
366
+ NavigationRail: the Material 3 Expressive rail, the one with the expanded
367
+ state (expand() / collapse()), over any Material 3 app theme.
368
+ -->
369
+ <style name="PCNavigationRailOverlay" parent="">
370
+ <item name="navigationRailStyle">@style/Widget.Material3Expressive.NavigationRailView</item>
371
+ </style>
372
+ <style name="PCNavigationRailOverlay.Expanded">
373
+ <item name="navigationRailStyle">@style/PCNavigationRail.Expanded</item>
374
+ </style>
375
+ <style name="PCNavigationRail.Expanded" parent="Widget.Material3Expressive.NavigationRailView">
376
+ <item name="expanded">true</item>
377
+ </style>
354
378
  </resources>
package/ios/PCButton.mm CHANGED
@@ -21,8 +21,10 @@
21
21
  #import "PCButtonComponentDescriptors-custom.h"
22
22
  #import "PCButtonShadowNode-custom.h"
23
23
  #import "PCButtonState-custom.h"
24
+ #import "PCMenuItems.h"
24
25
 
25
26
  using namespace facebook::react;
27
+ using namespace platformcomponents;
26
28
 
27
29
  namespace {
28
30
  static inline NSString *NSStringFromStd(const std::string &s, NSString *fallback) {
@@ -30,7 +32,7 @@ static inline NSString *NSStringFromStd(const std::string &s, NSString *fallback
30
32
  }
31
33
 
32
34
  static inline bool IconEqual(const PCButtonIconStruct &a, const PCButtonIconStruct &b) {
33
- return a.iconType == b.iconType && a.iconName == b.iconName && a.iconUri == b.iconUri &&
35
+ return a.iconType == b.iconType && a.iconName == b.iconName && a.iconRequest == b.iconRequest && a.iconUri == b.iconUri &&
34
36
  a.iconScale == b.iconScale && a.iconTinted == b.iconTinted;
35
37
  }
36
38
 
@@ -42,17 +44,28 @@ static inline bool LabelStyleEqual(
42
44
  }
43
45
 
44
46
  /// Builds the label font from RN-style font props, or nil when every field is
45
- /// unset so the button keeps the configuration's font.
46
- static UIFont *FontFromLabelStyle(const PCButtonLabelStyleStruct &style) {
47
+ /// unset so the button keeps the configuration's font. Without a fontSize the
48
+ /// size follows Dynamic Type (the body style), capped at maxFontSizeMultiplier
49
+ /// times its default size when that is 1 or more.
50
+ static UIFont *FontFromLabelStyle(const PCButtonLabelStyleStruct &style, double maxFontSizeMultiplier) {
47
51
  if (style.fontFamily.empty() && style.fontSize <= 0 &&
48
52
  style.fontWeight.empty() && style.fontStyle.empty()) {
49
53
  return nil;
50
54
  }
51
55
  // UIButton titles default to the body text style; start there so a lone
52
56
  // fontWeight or fontStyle doesn't change the size.
53
- return [RCTFont updateFont:[UIFont preferredFontForTextStyle:UIFontTextStyleBody]
57
+ UIFont *body = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
58
+ NSNumber *size = style.fontSize > 0 ? @(style.fontSize) : nil;
59
+ if (!size && maxFontSizeMultiplier >= 1) {
60
+ UITraitCollection *defaultTraits =
61
+ [UITraitCollection traitCollectionWithPreferredContentSizeCategory:UIContentSizeCategoryLarge];
62
+ CGFloat baseSize = [UIFont preferredFontForTextStyle:UIFontTextStyleBody
63
+ compatibleWithTraitCollection:defaultTraits].pointSize;
64
+ size = @(MIN(body.pointSize, baseSize * maxFontSizeMultiplier));
65
+ }
66
+ return [RCTFont updateFont:body
54
67
  withFamily:NSStringFromStd(style.fontFamily, nil)
55
- size:style.fontSize > 0 ? @(style.fontSize) : nil
68
+ size:size
56
69
  weight:NSStringFromStd(style.fontWeight, nil)
57
70
  style:NSStringFromStd(style.fontStyle, nil)
58
71
  variant:nil
@@ -77,6 +90,12 @@ static UIFont *FontFromLabelStyle(const PCButtonLabelStyleStruct &style) {
77
90
 
78
91
  - (instancetype)initWithFrame:(CGRect)frame {
79
92
  if (self = [super initWithFrame:frame]) {
93
+ // Fabric views seed _props with their own defaults: RCTViewComponentView
94
+ // asserts on it in debug builds of React Native core, and the first
95
+ // updateProps would otherwise read the base ViewProps as PCButtonProps.
96
+ static const auto defaultProps = std::make_shared<const PCButtonProps>();
97
+ _props = defaultProps;
98
+
80
99
  _view = [PCButtonView new];
81
100
  self.contentView = _view;
82
101
 
@@ -86,6 +105,8 @@ static UIFont *FontFromLabelStyle(const PCButtonLabelStyleStruct &style) {
86
105
  __typeof(self) strongSelf = weakSelf;
87
106
  if (!strongSelf) return;
88
107
 
108
+ [strongSelf->_view.haptics performIn:strongSelf->_view];
109
+
89
110
  auto eventEmitter =
90
111
  std::static_pointer_cast<const PCButtonEventEmitter>(strongSelf->_eventEmitter);
91
112
  if (!eventEmitter) return;
@@ -93,6 +114,50 @@ static UIFont *FontFromLabelStyle(const PCButtonLabelStyleStruct &style) {
93
114
  eventEmitter->onButtonPress({});
94
115
  };
95
116
 
117
+ _view.onSelectedChange = ^(BOOL selected) {
118
+ __typeof(self) strongSelf = weakSelf;
119
+ if (!strongSelf) return;
120
+
121
+ auto eventEmitter =
122
+ std::static_pointer_cast<const PCButtonEventEmitter>(strongSelf->_eventEmitter);
123
+ if (!eventEmitter) return;
124
+
125
+ eventEmitter->onSelectedChange({.selected = (bool)selected});
126
+ };
127
+
128
+ _view.onMenuSelect = ^(NSString *itemId, NSString *title) {
129
+ __typeof(self) strongSelf = weakSelf;
130
+ if (!strongSelf) return;
131
+
132
+ auto eventEmitter =
133
+ std::static_pointer_cast<const PCButtonEventEmitter>(strongSelf->_eventEmitter);
134
+ if (!eventEmitter) return;
135
+
136
+ eventEmitter->onMenuSelect({.id = itemId.UTF8String, .title = title.UTF8String});
137
+ };
138
+
139
+ _view.onMenuOpen = ^{
140
+ __typeof(self) strongSelf = weakSelf;
141
+ if (!strongSelf) return;
142
+
143
+ auto eventEmitter =
144
+ std::static_pointer_cast<const PCButtonEventEmitter>(strongSelf->_eventEmitter);
145
+ if (!eventEmitter) return;
146
+
147
+ eventEmitter->onMenuOpen({});
148
+ };
149
+
150
+ _view.onMenuClose = ^{
151
+ __typeof(self) strongSelf = weakSelf;
152
+ if (!strongSelf) return;
153
+
154
+ auto eventEmitter =
155
+ std::static_pointer_cast<const PCButtonEventEmitter>(strongSelf->_eventEmitter);
156
+ if (!eventEmitter) return;
157
+
158
+ eventEmitter->onMenuClose({});
159
+ };
160
+
96
161
  _view.onNeedsRemeasure = ^{
97
162
  __typeof(self) strongSelf = weakSelf;
98
163
  if (!strongSelf) return;
@@ -116,11 +181,16 @@ static UIFont *FontFromLabelStyle(const PCButtonLabelStyleStruct &style) {
116
181
  const auto &icon = newProps.icon;
117
182
  [_view setIconWithType:NSStringFromStd(icon.iconType, @"")
118
183
  name:NSStringFromStd(icon.iconName, @"")
184
+ request:NSStringFromStd(icon.iconRequest, @"")
119
185
  uri:NSStringFromStd(icon.iconUri, @"")
120
186
  scale:icon.iconScale
121
187
  tinted:(icon.iconTinted != "false")];
122
188
  }
123
189
 
190
+ if (!prevProps || newProps.iconPosition != prevProps->iconPosition) {
191
+ _view.iconPosition = NSStringFromStd(newProps.iconPosition, @"leading");
192
+ }
193
+
124
194
  if (!prevProps || newProps.variant != prevProps->variant) {
125
195
  _view.variant = NSStringFromStd(newProps.variant, @"filled");
126
196
  }
@@ -133,10 +203,18 @@ static UIFont *FontFromLabelStyle(const PCButtonLabelStyleStruct &style) {
133
203
  _view.shape = NSStringFromStd(newProps.shape, @"");
134
204
  }
135
205
 
206
+ if (!prevProps || newProps.cornerRadius != prevProps->cornerRadius) {
207
+ _view.cornerRadius = newProps.cornerRadius;
208
+ }
209
+
136
210
  if (!prevProps || newProps.interactivity != prevProps->interactivity) {
137
211
  _view.interactivity = NSStringFromStd(newProps.interactivity, @"enabled");
138
212
  }
139
213
 
214
+ if (!prevProps || newProps.loading != prevProps->loading) {
215
+ _view.loading = newProps.loading == "true";
216
+ }
217
+
140
218
  // Colors arrive as SharedColor (already processed by React Native)
141
219
  if (!prevProps || newProps.color != prevProps->color) {
142
220
  _view.containerColor = RCTUIColorFromSharedColor(newProps.color);
@@ -146,15 +224,52 @@ static UIFont *FontFromLabelStyle(const PCButtonLabelStyleStruct &style) {
146
224
  _view.foregroundColor = RCTUIColorFromSharedColor(newProps.foregroundColor);
147
225
  }
148
226
 
227
+ if (!prevProps || newProps.disabledColor != prevProps->disabledColor) {
228
+ _view.disabledContainerColor = RCTUIColorFromSharedColor(newProps.disabledColor);
229
+ }
230
+
231
+ if (!prevProps || newProps.disabledForegroundColor != prevProps->disabledForegroundColor) {
232
+ _view.disabledForegroundColor = RCTUIColorFromSharedColor(newProps.disabledForegroundColor);
233
+ }
234
+
149
235
  // labelStyle: {fontFamily, fontSize, fontWeight, fontStyle}
150
- if (!prevProps || !LabelStyleEqual(newProps.labelStyle, prevProps->labelStyle)) {
151
- _view.labelFont = FontFromLabelStyle(newProps.labelStyle);
236
+ if (!prevProps || !LabelStyleEqual(newProps.labelStyle, prevProps->labelStyle) ||
237
+ newProps.maxFontSizeMultiplier != prevProps->maxFontSizeMultiplier) {
238
+ _view.labelFont = FontFromLabelStyle(newProps.labelStyle, newProps.maxFontSizeMultiplier);
239
+ }
240
+
241
+ if (!prevProps || newProps.maxFontSizeMultiplier != prevProps->maxFontSizeMultiplier) {
242
+ _view.maxFontSizeMultiplier = newProps.maxFontSizeMultiplier;
152
243
  }
153
244
 
154
245
  if (!prevProps || newProps.spokenLabel != prevProps->spokenLabel) {
155
246
  _view.spokenLabel = NSStringFromStd(newProps.spokenLabel, @"");
156
247
  }
157
248
 
249
+ // selected: '' (not a toggle) | 'true' | 'false'. Applied again after
250
+ // every onSelectedChange (selectedEventCount), so a toggle JS didn't take
251
+ // goes back.
252
+ if (!prevProps || newProps.selected != prevProps->selected ||
253
+ newProps.selectedEventCount != prevProps->selectedEventCount) {
254
+ [_view syncSelected:NSStringFromStd(newProps.selected, @"")];
255
+ }
256
+
257
+ // menu: the flattened menu items
258
+ if (!prevProps || !PCMenuItemsEqual(newProps.menu, prevProps->menu)) {
259
+ _view.menuItems = PCMenuItemsToArray(newProps.menu);
260
+ }
261
+
262
+ // ios: {symbolEffect, symbolEffectTrigger}
263
+ if (!prevProps || newProps.ios.symbolEffect != prevProps->ios.symbolEffect ||
264
+ newProps.ios.symbolEffectTrigger != prevProps->ios.symbolEffectTrigger) {
265
+ [_view setSymbolEffect:NSStringFromStd(newProps.ios.symbolEffect, @"")
266
+ trigger:NSStringFromStd(newProps.ios.symbolEffectTrigger, @"")];
267
+ }
268
+
269
+ if (!prevProps || newProps.haptics != prevProps->haptics) {
270
+ _view.haptics.kind = NSStringFromStd(newProps.haptics, @"");
271
+ }
272
+
158
273
  // androidRippleColor / androidStrokeColor: Android only
159
274
 
160
275
  [super updateProps:props oldProps:oldProps];
@@ -21,8 +21,10 @@
21
21
  #import "PCButtonGroupComponentDescriptors-custom.h"
22
22
  #import "PCButtonGroupShadowNode-custom.h"
23
23
  #import "PCButtonGroupState-custom.h"
24
+ #import "PCMenuItems.h"
24
25
 
25
26
  using namespace facebook::react;
27
+ using namespace platformcomponents;
26
28
 
27
29
  namespace {
28
30
  static inline bool ButtonsEqual(
@@ -35,7 +37,7 @@ static inline bool ButtonsEqual(
35
37
  if (a[i].disabled != b[i].disabled) return false;
36
38
  if (a[i].iconType != b[i].iconType) return false;
37
39
  if (a[i].iconName != b[i].iconName) return false;
38
- if (a[i].iconUri != b[i].iconUri) return false;
40
+ if (a[i].iconRequest != b[i].iconRequest || a[i].iconUri != b[i].iconUri) return false;
39
41
  if (a[i].iconScale != b[i].iconScale) return false;
40
42
  if (a[i].iconTinted != b[i].iconTinted) return false;
41
43
  if (a[i].accessibilityLabel != b[i].accessibilityLabel) return false;
@@ -96,6 +98,12 @@ static UIFont *FontFromLabelStyle(const PCButtonGroupLabelStyleStruct &style) {
96
98
 
97
99
  - (instancetype)initWithFrame:(CGRect)frame {
98
100
  if (self = [super initWithFrame:frame]) {
101
+ // Fabric views seed _props with their own defaults: RCTViewComponentView
102
+ // asserts on it in debug builds of React Native core, and the first
103
+ // updateProps would otherwise read the base ViewProps as PCButtonGroupProps.
104
+ static const auto defaultProps = std::make_shared<const PCButtonGroupProps>();
105
+ _props = defaultProps;
106
+
99
107
  _view = [PCButtonGroupView new];
100
108
  self.contentView = _view;
101
109
 
@@ -105,6 +113,8 @@ static UIFont *FontFromLabelStyle(const PCButtonGroupLabelStyleStruct &style) {
105
113
  __typeof(self) strongSelf = weakSelf;
106
114
  if (!strongSelf) return;
107
115
 
116
+ [strongSelf->_view.haptics performIn:strongSelf->_view];
117
+
108
118
  auto eventEmitter =
109
119
  std::static_pointer_cast<const PCButtonGroupEventEmitter>(strongSelf->_eventEmitter);
110
120
  if (!eventEmitter) return;
@@ -131,6 +141,39 @@ static UIFont *FontFromLabelStyle(const PCButtonGroupLabelStyleStruct &style) {
131
141
  eventEmitter->onGroupSelectionChange(payload);
132
142
  };
133
143
 
144
+ _view.onMenuSelect = ^(NSString *itemId, NSString *title) {
145
+ __typeof(self) strongSelf = weakSelf;
146
+ if (!strongSelf) return;
147
+
148
+ auto eventEmitter =
149
+ std::static_pointer_cast<const PCButtonGroupEventEmitter>(strongSelf->_eventEmitter);
150
+ if (!eventEmitter) return;
151
+
152
+ eventEmitter->onMenuSelect({.id = itemId.UTF8String, .title = title.UTF8String});
153
+ };
154
+
155
+ _view.onMenuOpen = ^{
156
+ __typeof(self) strongSelf = weakSelf;
157
+ if (!strongSelf) return;
158
+
159
+ auto eventEmitter =
160
+ std::static_pointer_cast<const PCButtonGroupEventEmitter>(strongSelf->_eventEmitter);
161
+ if (!eventEmitter) return;
162
+
163
+ eventEmitter->onMenuOpen({});
164
+ };
165
+
166
+ _view.onMenuClose = ^{
167
+ __typeof(self) strongSelf = weakSelf;
168
+ if (!strongSelf) return;
169
+
170
+ auto eventEmitter =
171
+ std::static_pointer_cast<const PCButtonGroupEventEmitter>(strongSelf->_eventEmitter);
172
+ if (!eventEmitter) return;
173
+
174
+ eventEmitter->onMenuClose({});
175
+ };
176
+
134
177
  _view.onNeedsRemeasure = ^{
135
178
  __typeof(self) strongSelf = weakSelf;
136
179
  if (!strongSelf) return;
@@ -145,6 +188,11 @@ static UIFont *FontFromLabelStyle(const PCButtonGroupLabelStyleStruct &style) {
145
188
  const auto &newProps = *std::static_pointer_cast<const PCButtonGroupProps>(props);
146
189
  const auto prevProps = std::static_pointer_cast<const PCButtonGroupProps>(oldProps);
147
190
 
191
+ // split: 'true' | 'false'. Before the buttons, which it shapes.
192
+ if (!prevProps || newProps.split != prevProps->split) {
193
+ _view.split = (newProps.split == "true");
194
+ }
195
+
148
196
  // buttons: [{label, value, disabled, iconType, iconName, iconUri, iconScale,
149
197
  // iconTinted, accessibilityLabel}]
150
198
  if (!prevProps || !ButtonsEqual(newProps.buttons, prevProps->buttons)) {
@@ -156,6 +204,7 @@ static UIFont *FontFromLabelStyle(const PCButtonGroupLabelStyleStruct &style) {
156
204
  @"disabled": NSStringFromStd(button.disabled, @"enabled"),
157
205
  @"iconType": NSStringFromStd(button.iconType, @""),
158
206
  @"iconName": NSStringFromStd(button.iconName, @""),
207
+ @"iconRequest": NSStringFromStd(button.iconRequest, @""),
159
208
  @"iconUri": NSStringFromStd(button.iconUri, @""),
160
209
  @"iconScale": @(button.iconScale),
161
210
  @"iconTinted": NSStringFromStd(button.iconTinted, @"true"),
@@ -215,6 +264,24 @@ static UIFont *FontFromLabelStyle(const PCButtonGroupLabelStyleStruct &style) {
215
264
  _view.labelFont = FontFromLabelStyle(newProps.labelStyle);
216
265
  }
217
266
 
267
+ // overflow: 'none' | 'menu' | 'wrap' (Android only)
268
+ if (!prevProps || newProps.overflow != prevProps->overflow) {
269
+ _view.overflow = NSStringFromStd(newProps.overflow, @"none");
270
+ }
271
+
272
+ // menu: the split button's flattened menu items
273
+ if (!prevProps || !PCMenuItemsEqual(newProps.menu, prevProps->menu)) {
274
+ _view.menuItems = PCMenuItemsToArray(newProps.menu);
275
+ }
276
+
277
+ if (!prevProps || newProps.menuAccessibilityLabel != prevProps->menuAccessibilityLabel) {
278
+ _view.menuAccessibilityLabel = NSStringFromStd(newProps.menuAccessibilityLabel, @"");
279
+ }
280
+
281
+ if (!prevProps || newProps.haptics != prevProps->haptics) {
282
+ _view.haptics.kind = NSStringFromStd(newProps.haptics, @"");
283
+ }
284
+
218
285
  // androidRippleColor / androidStrokeColor / android: Android only
219
286
 
220
287
  [super updateProps:props oldProps:oldProps];