react-native-platform-components 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/PlatformComponents.podspec +1 -1
  2. package/README.md +47 -51
  3. package/android/src/main/java/com/platformcomponents/PCButtonGroupView.kt +664 -0
  4. package/android/src/main/java/com/platformcomponents/PCButtonGroupViewManager.kt +241 -0
  5. package/android/src/main/java/com/platformcomponents/PCButtonSupport.kt +159 -0
  6. package/android/src/main/java/com/platformcomponents/PCButtonView.kt +527 -0
  7. package/android/src/main/java/com/platformcomponents/PCButtonViewManager.kt +204 -0
  8. package/android/src/main/java/com/platformcomponents/PCContextMenuView.kt +41 -151
  9. package/android/src/main/java/com/platformcomponents/PCContextMenuViewManager.kt +7 -63
  10. package/android/src/main/java/com/platformcomponents/PCDatePickerView.kt +310 -115
  11. package/android/src/main/java/com/platformcomponents/PCDatePickerViewManager.kt +23 -3
  12. package/android/src/main/java/com/platformcomponents/PCExpressive.kt +112 -0
  13. package/android/src/main/java/com/platformcomponents/PCFloatingActionButtonView.kt +485 -0
  14. package/android/src/main/java/com/platformcomponents/PCFloatingActionButtonViewManager.kt +109 -0
  15. package/android/src/main/java/com/platformcomponents/PCFloatingToolbarView.kt +247 -0
  16. package/android/src/main/java/com/platformcomponents/PCFloatingToolbarViewManager.kt +73 -0
  17. package/android/src/main/java/com/platformcomponents/PCHaptics.kt +46 -0
  18. package/android/src/main/java/com/platformcomponents/PCImageLoader.kt +42 -7
  19. package/android/src/main/java/com/platformcomponents/PCLiquidGlassContainerView.kt +32 -0
  20. package/android/src/main/java/com/platformcomponents/PCLiquidGlassContainerViewManager.kt +31 -0
  21. package/android/src/main/java/com/platformcomponents/PCLiquidGlassView.kt +32 -6
  22. package/android/src/main/java/com/platformcomponents/PCLiquidGlassViewManager.kt +4 -0
  23. package/android/src/main/java/com/platformcomponents/PCMenuSupport.kt +280 -0
  24. package/android/src/main/java/com/platformcomponents/PCNavigationBarSupport.kt +332 -0
  25. package/android/src/main/java/com/platformcomponents/PCNavigationRailView.kt +448 -0
  26. package/android/src/main/java/com/platformcomponents/PCNavigationRailViewManager.kt +176 -0
  27. package/android/src/main/java/com/platformcomponents/PCSegmentedControlView.kt +35 -17
  28. package/android/src/main/java/com/platformcomponents/PCSegmentedControlViewManager.kt +20 -3
  29. package/android/src/main/java/com/platformcomponents/PCSelectionMenuView.kt +371 -39
  30. package/android/src/main/java/com/platformcomponents/PCSelectionMenuViewManager.kt +18 -4
  31. package/android/src/main/java/com/platformcomponents/PCTabBarView.kt +397 -0
  32. package/android/src/main/java/com/platformcomponents/PCTabBarViewManager.kt +182 -0
  33. package/android/src/main/java/com/platformcomponents/PCTextFieldView.kt +1393 -0
  34. package/android/src/main/java/com/platformcomponents/PCTextFieldViewManager.kt +354 -0
  35. package/android/src/main/java/com/platformcomponents/PCThemeSupport.kt +37 -0
  36. package/android/src/main/java/com/platformcomponents/PlatformComponentsPackage.kt +8 -0
  37. package/android/src/main/res/drawable/pc_ic_search.xml +12 -0
  38. package/android/src/main/res/values/attrs.xml +13 -0
  39. package/android/src/main/res/values/ids.xml +5 -0
  40. package/android/src/main/res/values/styles.xml +207 -0
  41. package/ios/PCButton.h +10 -0
  42. package/ios/PCButton.mm +311 -0
  43. package/ios/PCButtonGroup.h +10 -0
  44. package/ios/PCButtonGroup.mm +323 -0
  45. package/ios/PCButtonGroupView.swift +473 -0
  46. package/ios/PCButtonSupport.swift +312 -0
  47. package/ios/PCButtonView.swift +438 -0
  48. package/ios/PCConstants.swift +23 -2
  49. package/ios/PCContextMenu.mm +28 -110
  50. package/ios/PCContextMenu.swift +106 -167
  51. package/ios/PCDatePicker.mm +21 -9
  52. package/ios/PCDatePickerView.swift +94 -20
  53. package/ios/PCFloatingActionButton.h +10 -0
  54. package/ios/PCFloatingActionButton.mm +177 -0
  55. package/ios/PCFloatingActionButtonView.swift +426 -0
  56. package/ios/PCFloatingToolbar.h +10 -0
  57. package/ios/PCFloatingToolbar.mm +103 -0
  58. package/ios/PCFloatingToolbarView.swift +336 -0
  59. package/ios/PCHaptics.swift +91 -0
  60. package/ios/PCImageLoader.swift +76 -12
  61. package/ios/PCLiquidGlass.mm +36 -0
  62. package/ios/PCLiquidGlass.swift +221 -114
  63. package/ios/PCLiquidGlassContainer.h +10 -0
  64. package/ios/PCLiquidGlassContainer.mm +84 -0
  65. package/ios/PCLiquidGlassContainer.swift +69 -0
  66. package/ios/PCMenuItems.h +76 -0
  67. package/ios/PCMenuSupport.swift +350 -0
  68. package/ios/PCNavigationRail.h +10 -0
  69. package/ios/PCNavigationRail.mm +270 -0
  70. package/ios/PCNavigationRailView.swift +415 -0
  71. package/ios/PCSegmentedControl.mm +17 -2
  72. package/ios/PCSegmentedControl.swift +57 -7
  73. package/ios/PCSelectionMenu.mm +36 -8
  74. package/ios/PCSelectionMenu.swift +224 -48
  75. package/ios/PCTabBar.h +10 -0
  76. package/ios/PCTabBar.mm +285 -0
  77. package/ios/PCTabBarAccessory.h +10 -0
  78. package/ios/PCTabBarAccessory.mm +93 -0
  79. package/ios/PCTabBarAccessoryView.swift +96 -0
  80. package/ios/PCTabBarView.swift +671 -0
  81. package/ios/PCTextField.h +10 -0
  82. package/ios/PCTextField.mm +546 -0
  83. package/ios/PCTextFieldView.swift +1558 -0
  84. package/lib/commonjs/Button.js +149 -0
  85. package/lib/commonjs/Button.js.map +1 -0
  86. package/lib/commonjs/ButtonGroup.js +109 -0
  87. package/lib/commonjs/ButtonGroup.js.map +1 -0
  88. package/lib/commonjs/ButtonGroupNativeComponent.ts +191 -0
  89. package/lib/commonjs/ButtonNativeComponent.ts +192 -0
  90. package/lib/commonjs/ContextMenu.js +9 -48
  91. package/lib/commonjs/ContextMenu.js.map +1 -1
  92. package/lib/commonjs/ContextMenuNativeComponent.ts +47 -49
  93. package/lib/commonjs/DatePicker.js +98 -2
  94. package/lib/commonjs/DatePicker.js.map +1 -1
  95. package/lib/commonjs/DatePickerNativeComponent.ts +19 -2
  96. package/lib/commonjs/FloatingActionButton.js +60 -0
  97. package/lib/commonjs/FloatingActionButton.js.map +1 -0
  98. package/lib/commonjs/FloatingActionButtonNativeComponent.ts +58 -0
  99. package/lib/commonjs/FloatingToolbar.js +77 -0
  100. package/lib/commonjs/FloatingToolbar.js.map +1 -0
  101. package/lib/commonjs/FloatingToolbarNativeComponent.ts +47 -0
  102. package/lib/commonjs/LiquidGlass.js +7 -1
  103. package/lib/commonjs/LiquidGlass.js.map +1 -1
  104. package/lib/commonjs/LiquidGlassContainer.js +32 -0
  105. package/lib/commonjs/LiquidGlassContainer.js.map +1 -0
  106. package/lib/commonjs/LiquidGlassContainerNativeComponent.ts +17 -0
  107. package/lib/commonjs/LiquidGlassNativeComponent.ts +8 -0
  108. package/lib/commonjs/NavigationRail.js +104 -0
  109. package/lib/commonjs/NavigationRail.js.map +1 -0
  110. package/lib/commonjs/NavigationRailNativeComponent.ts +107 -0
  111. package/lib/commonjs/PlatformComponentsProvider.js +18 -0
  112. package/lib/commonjs/PlatformComponentsProvider.js.map +1 -0
  113. package/lib/commonjs/SegmentedControl.js +18 -85
  114. package/lib/commonjs/SegmentedControl.js.map +1 -1
  115. package/lib/commonjs/SegmentedControlNativeComponent.ts +14 -0
  116. package/lib/commonjs/SelectionMenu.js +27 -3
  117. package/lib/commonjs/SelectionMenu.js.map +1 -1
  118. package/lib/commonjs/SelectionMenuNativeComponent.ts +26 -4
  119. package/lib/commonjs/SplitButton.js +98 -0
  120. package/lib/commonjs/SplitButton.js.map +1 -0
  121. package/lib/commonjs/TabBar.js +203 -0
  122. package/lib/commonjs/TabBar.js.map +1 -0
  123. package/lib/commonjs/TabBarAccessoryNativeComponent.ts +19 -0
  124. package/lib/commonjs/TabBarNativeComponent.ts +145 -0
  125. package/lib/commonjs/TextField.js +358 -0
  126. package/lib/commonjs/TextField.js.map +1 -0
  127. package/lib/commonjs/TextFieldNativeComponent.ts +324 -0
  128. package/lib/commonjs/focusRegistry.js +79 -0
  129. package/lib/commonjs/focusRegistry.js.map +1 -0
  130. package/lib/commonjs/haptics.js +2 -0
  131. package/lib/commonjs/haptics.js.map +1 -0
  132. package/lib/commonjs/icons.js +106 -0
  133. package/lib/commonjs/icons.js.map +1 -0
  134. package/lib/commonjs/index.js +143 -0
  135. package/lib/commonjs/index.js.map +1 -1
  136. package/lib/commonjs/index.web.js +157 -63
  137. package/lib/commonjs/index.web.js.map +1 -1
  138. package/lib/commonjs/jest.js +910 -0
  139. package/lib/commonjs/jest.js.map +1 -0
  140. package/lib/commonjs/labelStyle.js +27 -0
  141. package/lib/commonjs/labelStyle.js.map +1 -0
  142. package/lib/commonjs/menuItems.js +68 -0
  143. package/lib/commonjs/menuItems.js.map +1 -0
  144. package/lib/commonjs/reactNativeInternals.d.js +2 -0
  145. package/lib/commonjs/reactNativeInternals.d.js.map +1 -0
  146. package/lib/commonjs/selectionIdentifiers.js +18 -0
  147. package/lib/commonjs/selectionIdentifiers.js.map +1 -0
  148. package/lib/commonjs/submitBehavior.js +19 -0
  149. package/lib/commonjs/submitBehavior.js.map +1 -0
  150. package/lib/commonjs/tabItems.js +49 -0
  151. package/lib/commonjs/tabItems.js.map +1 -0
  152. package/lib/commonjs/web/Button.js +170 -0
  153. package/lib/commonjs/web/Button.js.map +1 -0
  154. package/lib/commonjs/web/ButtonGroup.js +119 -0
  155. package/lib/commonjs/web/ButtonGroup.js.map +1 -0
  156. package/lib/commonjs/web/DatePicker.js +168 -0
  157. package/lib/commonjs/web/DatePicker.js.map +1 -0
  158. package/lib/commonjs/web/DateRangePicker.js +137 -0
  159. package/lib/commonjs/web/DateRangePicker.js.map +1 -0
  160. package/lib/commonjs/web/Dialog.js +54 -0
  161. package/lib/commonjs/web/Dialog.js.map +1 -0
  162. package/lib/commonjs/web/FloatingActionButton.js +98 -0
  163. package/lib/commonjs/web/FloatingActionButton.js.map +1 -0
  164. package/lib/commonjs/web/Icon.js +34 -0
  165. package/lib/commonjs/web/Icon.js.map +1 -0
  166. package/lib/commonjs/web/NativeTheme.js +28 -0
  167. package/lib/commonjs/web/NativeTheme.js.map +1 -0
  168. package/lib/commonjs/web/NavigationRail.js +139 -0
  169. package/lib/commonjs/web/NavigationRail.js.map +1 -0
  170. package/lib/commonjs/web/PlatformComponentsProvider.js +51 -0
  171. package/lib/commonjs/web/PlatformComponentsProvider.js.map +1 -0
  172. package/lib/commonjs/web/SegmentedControl.js +117 -0
  173. package/lib/commonjs/web/SegmentedControl.js.map +1 -0
  174. package/lib/commonjs/web/SelectionMenu.js +142 -0
  175. package/lib/commonjs/web/SelectionMenu.js.map +1 -0
  176. package/lib/commonjs/web/SplitButton.js +35 -0
  177. package/lib/commonjs/web/SplitButton.js.map +1 -0
  178. package/lib/commonjs/web/TabBar.js +131 -0
  179. package/lib/commonjs/web/TabBar.js.map +1 -0
  180. package/lib/commonjs/web/TextField.js +322 -0
  181. package/lib/commonjs/web/TextField.js.map +1 -0
  182. package/lib/commonjs/web/components.js +36 -0
  183. package/lib/commonjs/web/components.js.map +1 -0
  184. package/lib/commonjs/web/containers.js +121 -0
  185. package/lib/commonjs/web/containers.js.map +1 -0
  186. package/lib/commonjs/web/dateInput.js +116 -0
  187. package/lib/commonjs/web/dateInput.js.map +1 -0
  188. package/lib/commonjs/web/shared.js +192 -0
  189. package/lib/commonjs/web/shared.js.map +1 -0
  190. package/lib/commonjs/webComponents.js +6 -0
  191. package/lib/commonjs/webComponents.js.map +1 -0
  192. package/lib/module/Button.js +142 -0
  193. package/lib/module/Button.js.map +1 -0
  194. package/lib/module/ButtonGroup.js +102 -0
  195. package/lib/module/ButtonGroup.js.map +1 -0
  196. package/lib/module/ButtonGroupNativeComponent.ts +191 -0
  197. package/lib/module/ButtonNativeComponent.ts +192 -0
  198. package/lib/module/ContextMenu.js +9 -48
  199. package/lib/module/ContextMenu.js.map +1 -1
  200. package/lib/module/ContextMenuNativeComponent.ts +47 -49
  201. package/lib/module/DatePicker.js +98 -4
  202. package/lib/module/DatePicker.js.map +1 -1
  203. package/lib/module/DatePickerNativeComponent.ts +19 -2
  204. package/lib/module/FloatingActionButton.js +53 -0
  205. package/lib/module/FloatingActionButton.js.map +1 -0
  206. package/lib/module/FloatingActionButtonNativeComponent.ts +58 -0
  207. package/lib/module/FloatingToolbar.js +70 -0
  208. package/lib/module/FloatingToolbar.js.map +1 -0
  209. package/lib/module/FloatingToolbarNativeComponent.ts +47 -0
  210. package/lib/module/LiquidGlass.js +7 -1
  211. package/lib/module/LiquidGlass.js.map +1 -1
  212. package/lib/module/LiquidGlassContainer.js +26 -0
  213. package/lib/module/LiquidGlassContainer.js.map +1 -0
  214. package/lib/module/LiquidGlassContainerNativeComponent.ts +17 -0
  215. package/lib/module/LiquidGlassNativeComponent.ts +8 -0
  216. package/lib/module/NavigationRail.js +99 -0
  217. package/lib/module/NavigationRail.js.map +1 -0
  218. package/lib/module/NavigationRailNativeComponent.ts +107 -0
  219. package/lib/module/PlatformComponentsProvider.js +13 -0
  220. package/lib/module/PlatformComponentsProvider.js.map +1 -0
  221. package/lib/module/SegmentedControl.js +18 -85
  222. package/lib/module/SegmentedControl.js.map +1 -1
  223. package/lib/module/SegmentedControlNativeComponent.ts +14 -0
  224. package/lib/module/SelectionMenu.js +27 -3
  225. package/lib/module/SelectionMenu.js.map +1 -1
  226. package/lib/module/SelectionMenuNativeComponent.ts +26 -4
  227. package/lib/module/SplitButton.js +91 -0
  228. package/lib/module/SplitButton.js.map +1 -0
  229. package/lib/module/TabBar.js +196 -0
  230. package/lib/module/TabBar.js.map +1 -0
  231. package/lib/module/TabBarAccessoryNativeComponent.ts +19 -0
  232. package/lib/module/TabBarNativeComponent.ts +145 -0
  233. package/lib/module/TextField.js +352 -0
  234. package/lib/module/TextField.js.map +1 -0
  235. package/lib/module/TextFieldNativeComponent.ts +324 -0
  236. package/lib/module/focusRegistry.js +75 -0
  237. package/lib/module/focusRegistry.js.map +1 -0
  238. package/lib/module/haptics.js +2 -0
  239. package/lib/module/haptics.js.map +1 -0
  240. package/lib/module/icons.js +101 -0
  241. package/lib/module/icons.js.map +1 -0
  242. package/lib/module/index.js +13 -0
  243. package/lib/module/index.js.map +1 -1
  244. package/lib/module/index.web.js +12 -59
  245. package/lib/module/index.web.js.map +1 -1
  246. package/lib/module/jest.js +840 -0
  247. package/lib/module/jest.js.map +1 -0
  248. package/lib/module/labelStyle.js +23 -0
  249. package/lib/module/labelStyle.js.map +1 -0
  250. package/lib/module/menuItems.js +65 -0
  251. package/lib/module/menuItems.js.map +1 -0
  252. package/lib/module/reactNativeInternals.d.js +2 -0
  253. package/lib/module/reactNativeInternals.d.js.map +1 -0
  254. package/lib/module/selectionIdentifiers.js +14 -0
  255. package/lib/module/selectionIdentifiers.js.map +1 -0
  256. package/lib/module/submitBehavior.js +15 -0
  257. package/lib/module/submitBehavior.js.map +1 -0
  258. package/lib/module/tabItems.js +45 -0
  259. package/lib/module/tabItems.js.map +1 -0
  260. package/lib/module/web/Button.js +164 -0
  261. package/lib/module/web/Button.js.map +1 -0
  262. package/lib/module/web/ButtonGroup.js +113 -0
  263. package/lib/module/web/ButtonGroup.js.map +1 -0
  264. package/lib/module/web/DatePicker.js +162 -0
  265. package/lib/module/web/DatePicker.js.map +1 -0
  266. package/lib/module/web/DateRangePicker.js +131 -0
  267. package/lib/module/web/DateRangePicker.js.map +1 -0
  268. package/lib/module/web/Dialog.js +48 -0
  269. package/lib/module/web/Dialog.js.map +1 -0
  270. package/lib/module/web/FloatingActionButton.js +94 -0
  271. package/lib/module/web/FloatingActionButton.js.map +1 -0
  272. package/lib/module/web/Icon.js +29 -0
  273. package/lib/module/web/Icon.js.map +1 -0
  274. package/lib/module/web/NativeTheme.js +23 -0
  275. package/lib/module/web/NativeTheme.js.map +1 -0
  276. package/lib/module/web/NavigationRail.js +133 -0
  277. package/lib/module/web/NavigationRail.js.map +1 -0
  278. package/lib/module/web/PlatformComponentsProvider.js +44 -0
  279. package/lib/module/web/PlatformComponentsProvider.js.map +1 -0
  280. package/lib/module/web/SegmentedControl.js +112 -0
  281. package/lib/module/web/SegmentedControl.js.map +1 -0
  282. package/lib/module/web/SelectionMenu.js +137 -0
  283. package/lib/module/web/SelectionMenu.js.map +1 -0
  284. package/lib/module/web/SplitButton.js +30 -0
  285. package/lib/module/web/SplitButton.js.map +1 -0
  286. package/lib/module/web/TabBar.js +126 -0
  287. package/lib/module/web/TabBar.js.map +1 -0
  288. package/lib/module/web/TextField.js +316 -0
  289. package/lib/module/web/TextField.js.map +1 -0
  290. package/lib/module/web/components.js +33 -0
  291. package/lib/module/web/components.js.map +1 -0
  292. package/lib/module/web/containers.js +112 -0
  293. package/lib/module/web/containers.js.map +1 -0
  294. package/lib/module/web/dateInput.js +109 -0
  295. package/lib/module/web/dateInput.js.map +1 -0
  296. package/lib/module/web/shared.js +179 -0
  297. package/lib/module/web/shared.js.map +1 -0
  298. package/lib/module/webComponents.js +4 -0
  299. package/lib/module/webComponents.js.map +1 -0
  300. package/lib/typescript/commonjs/docs/sidebars.d.ts.map +1 -1
  301. package/lib/typescript/commonjs/src/Button.d.ts +184 -0
  302. package/lib/typescript/commonjs/src/Button.d.ts.map +1 -0
  303. package/lib/typescript/commonjs/src/ButtonGroup.d.ts +117 -0
  304. package/lib/typescript/commonjs/src/ButtonGroup.d.ts.map +1 -0
  305. package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts +154 -0
  306. package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts.map +1 -0
  307. package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts +148 -0
  308. package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts.map +1 -0
  309. package/lib/typescript/commonjs/src/ContextMenu.d.ts +20 -33
  310. package/lib/typescript/commonjs/src/ContextMenu.d.ts.map +1 -1
  311. package/lib/typescript/commonjs/src/ContextMenuNativeComponent.d.ts +45 -47
  312. package/lib/typescript/commonjs/src/ContextMenuNativeComponent.d.ts.map +1 -1
  313. package/lib/typescript/commonjs/src/DatePicker.d.ts +74 -1
  314. package/lib/typescript/commonjs/src/DatePicker.d.ts.map +1 -1
  315. package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts +16 -1
  316. package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts.map +1 -1
  317. package/lib/typescript/commonjs/src/FloatingActionButton.d.ts +67 -0
  318. package/lib/typescript/commonjs/src/FloatingActionButton.d.ts.map +1 -0
  319. package/lib/typescript/commonjs/src/FloatingActionButtonNativeComponent.d.ts +43 -0
  320. package/lib/typescript/commonjs/src/FloatingActionButtonNativeComponent.d.ts.map +1 -0
  321. package/lib/typescript/commonjs/src/FloatingToolbar.d.ts +75 -0
  322. package/lib/typescript/commonjs/src/FloatingToolbar.d.ts.map +1 -0
  323. package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts +36 -0
  324. package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts.map +1 -0
  325. package/lib/typescript/commonjs/src/LiquidGlass.d.ts +17 -0
  326. package/lib/typescript/commonjs/src/LiquidGlass.d.ts.map +1 -1
  327. package/lib/typescript/commonjs/src/LiquidGlassContainer.d.ts +27 -0
  328. package/lib/typescript/commonjs/src/LiquidGlassContainer.d.ts.map +1 -0
  329. package/lib/typescript/commonjs/src/LiquidGlassContainerNativeComponent.d.ts +13 -0
  330. package/lib/typescript/commonjs/src/LiquidGlassContainerNativeComponent.d.ts.map +1 -0
  331. package/lib/typescript/commonjs/src/LiquidGlassNativeComponent.d.ts +7 -0
  332. package/lib/typescript/commonjs/src/LiquidGlassNativeComponent.d.ts.map +1 -1
  333. package/lib/typescript/commonjs/src/NavigationRail.d.ts +86 -0
  334. package/lib/typescript/commonjs/src/NavigationRail.d.ts.map +1 -0
  335. package/lib/typescript/commonjs/src/NavigationRailNativeComponent.d.ts +81 -0
  336. package/lib/typescript/commonjs/src/NavigationRailNativeComponent.d.ts.map +1 -0
  337. package/lib/typescript/commonjs/src/PlatformComponentsProvider.d.ts +6 -0
  338. package/lib/typescript/commonjs/src/PlatformComponentsProvider.d.ts.map +1 -0
  339. package/lib/typescript/commonjs/src/SegmentedControl.d.ts +35 -47
  340. package/lib/typescript/commonjs/src/SegmentedControl.d.ts.map +1 -1
  341. package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts +11 -0
  342. package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts.map +1 -1
  343. package/lib/typescript/commonjs/src/SelectionMenu.d.ts +44 -2
  344. package/lib/typescript/commonjs/src/SelectionMenu.d.ts.map +1 -1
  345. package/lib/typescript/commonjs/src/SelectionMenuNativeComponent.d.ts +20 -4
  346. package/lib/typescript/commonjs/src/SelectionMenuNativeComponent.d.ts.map +1 -1
  347. package/lib/typescript/commonjs/src/SplitButton.d.ts +83 -0
  348. package/lib/typescript/commonjs/src/SplitButton.d.ts.map +1 -0
  349. package/lib/typescript/commonjs/src/TabBar.d.ts +144 -0
  350. package/lib/typescript/commonjs/src/TabBar.d.ts.map +1 -0
  351. package/lib/typescript/commonjs/src/TabBarAccessoryNativeComponent.d.ts +13 -0
  352. package/lib/typescript/commonjs/src/TabBarAccessoryNativeComponent.d.ts.map +1 -0
  353. package/lib/typescript/commonjs/src/TabBarNativeComponent.d.ts +110 -0
  354. package/lib/typescript/commonjs/src/TabBarNativeComponent.d.ts.map +1 -0
  355. package/lib/typescript/commonjs/src/TextField.d.ts +332 -0
  356. package/lib/typescript/commonjs/src/TextField.d.ts.map +1 -0
  357. package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts +240 -0
  358. package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts.map +1 -0
  359. package/lib/typescript/commonjs/src/focusRegistry.d.ts +13 -0
  360. package/lib/typescript/commonjs/src/focusRegistry.d.ts.map +1 -0
  361. package/lib/typescript/commonjs/src/haptics.d.ts +20 -0
  362. package/lib/typescript/commonjs/src/haptics.d.ts.map +1 -0
  363. package/lib/typescript/commonjs/src/icons.d.ts +58 -0
  364. package/lib/typescript/commonjs/src/icons.d.ts.map +1 -0
  365. package/lib/typescript/commonjs/src/index.d.ts +13 -0
  366. package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
  367. package/lib/typescript/commonjs/src/index.web.d.ts +25 -133
  368. package/lib/typescript/commonjs/src/index.web.d.ts.map +1 -1
  369. package/lib/typescript/commonjs/src/jest.d.ts +139 -0
  370. package/lib/typescript/commonjs/src/jest.d.ts.map +1 -0
  371. package/lib/typescript/commonjs/src/labelStyle.d.ts +20 -0
  372. package/lib/typescript/commonjs/src/labelStyle.d.ts.map +1 -0
  373. package/lib/typescript/commonjs/src/menuItems.d.ts +100 -0
  374. package/lib/typescript/commonjs/src/menuItems.d.ts.map +1 -0
  375. package/lib/typescript/commonjs/src/selectionIdentifiers.d.ts +3 -0
  376. package/lib/typescript/commonjs/src/selectionIdentifiers.d.ts.map +1 -0
  377. package/lib/typescript/commonjs/src/sharedTypes.d.ts +6 -1
  378. package/lib/typescript/commonjs/src/sharedTypes.d.ts.map +1 -1
  379. package/lib/typescript/commonjs/src/submitBehavior.d.ts +9 -0
  380. package/lib/typescript/commonjs/src/submitBehavior.d.ts.map +1 -0
  381. package/lib/typescript/commonjs/src/tabItems.d.ts +55 -0
  382. package/lib/typescript/commonjs/src/tabItems.d.ts.map +1 -0
  383. package/lib/typescript/commonjs/src/web/Button.d.ts +9 -0
  384. package/lib/typescript/commonjs/src/web/Button.d.ts.map +1 -0
  385. package/lib/typescript/commonjs/src/web/ButtonGroup.d.ts +11 -0
  386. package/lib/typescript/commonjs/src/web/ButtonGroup.d.ts.map +1 -0
  387. package/lib/typescript/commonjs/src/web/DatePicker.d.ts +14 -0
  388. package/lib/typescript/commonjs/src/web/DatePicker.d.ts.map +1 -0
  389. package/lib/typescript/commonjs/src/web/DateRangePicker.d.ts +11 -0
  390. package/lib/typescript/commonjs/src/web/DateRangePicker.d.ts.map +1 -0
  391. package/lib/typescript/commonjs/src/web/Dialog.d.ts +12 -0
  392. package/lib/typescript/commonjs/src/web/Dialog.d.ts.map +1 -0
  393. package/lib/typescript/commonjs/src/web/FloatingActionButton.d.ts +8 -0
  394. package/lib/typescript/commonjs/src/web/FloatingActionButton.d.ts.map +1 -0
  395. package/lib/typescript/commonjs/src/web/Icon.d.ts +12 -0
  396. package/lib/typescript/commonjs/src/web/Icon.d.ts.map +1 -0
  397. package/lib/typescript/commonjs/src/web/NativeTheme.d.ts +10 -0
  398. package/lib/typescript/commonjs/src/web/NativeTheme.d.ts.map +1 -0
  399. package/lib/typescript/commonjs/src/web/NavigationRail.d.ts +8 -0
  400. package/lib/typescript/commonjs/src/web/NavigationRail.d.ts.map +1 -0
  401. package/lib/typescript/commonjs/src/web/PlatformComponentsProvider.d.ts +10 -0
  402. package/lib/typescript/commonjs/src/web/PlatformComponentsProvider.d.ts.map +1 -0
  403. package/lib/typescript/commonjs/src/web/SegmentedControl.d.ts +8 -0
  404. package/lib/typescript/commonjs/src/web/SegmentedControl.d.ts.map +1 -0
  405. package/lib/typescript/commonjs/src/web/SelectionMenu.d.ts +10 -0
  406. package/lib/typescript/commonjs/src/web/SelectionMenu.d.ts.map +1 -0
  407. package/lib/typescript/commonjs/src/web/SplitButton.d.ts +9 -0
  408. package/lib/typescript/commonjs/src/web/SplitButton.d.ts.map +1 -0
  409. package/lib/typescript/commonjs/src/web/TabBar.d.ts +9 -0
  410. package/lib/typescript/commonjs/src/web/TabBar.d.ts.map +1 -0
  411. package/lib/typescript/commonjs/src/web/TextField.d.ts +9 -0
  412. package/lib/typescript/commonjs/src/web/TextField.d.ts.map +1 -0
  413. package/lib/typescript/commonjs/src/web/components.d.ts +17 -0
  414. package/lib/typescript/commonjs/src/web/components.d.ts.map +1 -0
  415. package/lib/typescript/commonjs/src/web/containers.d.ts +24 -0
  416. package/lib/typescript/commonjs/src/web/containers.d.ts.map +1 -0
  417. package/lib/typescript/commonjs/src/web/dateInput.d.ts +20 -0
  418. package/lib/typescript/commonjs/src/web/dateInput.d.ts.map +1 -0
  419. package/lib/typescript/commonjs/src/web/shared.d.ts +43 -0
  420. package/lib/typescript/commonjs/src/web/shared.d.ts.map +1 -0
  421. package/lib/typescript/commonjs/src/webComponents.d.ts +43 -0
  422. package/lib/typescript/commonjs/src/webComponents.d.ts.map +1 -0
  423. package/lib/typescript/module/docs/sidebars.d.ts.map +1 -1
  424. package/lib/typescript/module/src/Button.d.ts +184 -0
  425. package/lib/typescript/module/src/Button.d.ts.map +1 -0
  426. package/lib/typescript/module/src/ButtonGroup.d.ts +117 -0
  427. package/lib/typescript/module/src/ButtonGroup.d.ts.map +1 -0
  428. package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts +154 -0
  429. package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts.map +1 -0
  430. package/lib/typescript/module/src/ButtonNativeComponent.d.ts +148 -0
  431. package/lib/typescript/module/src/ButtonNativeComponent.d.ts.map +1 -0
  432. package/lib/typescript/module/src/ContextMenu.d.ts +20 -33
  433. package/lib/typescript/module/src/ContextMenu.d.ts.map +1 -1
  434. package/lib/typescript/module/src/ContextMenuNativeComponent.d.ts +45 -47
  435. package/lib/typescript/module/src/ContextMenuNativeComponent.d.ts.map +1 -1
  436. package/lib/typescript/module/src/DatePicker.d.ts +74 -1
  437. package/lib/typescript/module/src/DatePicker.d.ts.map +1 -1
  438. package/lib/typescript/module/src/DatePickerNativeComponent.d.ts +16 -1
  439. package/lib/typescript/module/src/DatePickerNativeComponent.d.ts.map +1 -1
  440. package/lib/typescript/module/src/FloatingActionButton.d.ts +67 -0
  441. package/lib/typescript/module/src/FloatingActionButton.d.ts.map +1 -0
  442. package/lib/typescript/module/src/FloatingActionButtonNativeComponent.d.ts +43 -0
  443. package/lib/typescript/module/src/FloatingActionButtonNativeComponent.d.ts.map +1 -0
  444. package/lib/typescript/module/src/FloatingToolbar.d.ts +75 -0
  445. package/lib/typescript/module/src/FloatingToolbar.d.ts.map +1 -0
  446. package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts +36 -0
  447. package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts.map +1 -0
  448. package/lib/typescript/module/src/LiquidGlass.d.ts +17 -0
  449. package/lib/typescript/module/src/LiquidGlass.d.ts.map +1 -1
  450. package/lib/typescript/module/src/LiquidGlassContainer.d.ts +27 -0
  451. package/lib/typescript/module/src/LiquidGlassContainer.d.ts.map +1 -0
  452. package/lib/typescript/module/src/LiquidGlassContainerNativeComponent.d.ts +13 -0
  453. package/lib/typescript/module/src/LiquidGlassContainerNativeComponent.d.ts.map +1 -0
  454. package/lib/typescript/module/src/LiquidGlassNativeComponent.d.ts +7 -0
  455. package/lib/typescript/module/src/LiquidGlassNativeComponent.d.ts.map +1 -1
  456. package/lib/typescript/module/src/NavigationRail.d.ts +86 -0
  457. package/lib/typescript/module/src/NavigationRail.d.ts.map +1 -0
  458. package/lib/typescript/module/src/NavigationRailNativeComponent.d.ts +81 -0
  459. package/lib/typescript/module/src/NavigationRailNativeComponent.d.ts.map +1 -0
  460. package/lib/typescript/module/src/PlatformComponentsProvider.d.ts +6 -0
  461. package/lib/typescript/module/src/PlatformComponentsProvider.d.ts.map +1 -0
  462. package/lib/typescript/module/src/SegmentedControl.d.ts +35 -47
  463. package/lib/typescript/module/src/SegmentedControl.d.ts.map +1 -1
  464. package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts +11 -0
  465. package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts.map +1 -1
  466. package/lib/typescript/module/src/SelectionMenu.d.ts +44 -2
  467. package/lib/typescript/module/src/SelectionMenu.d.ts.map +1 -1
  468. package/lib/typescript/module/src/SelectionMenuNativeComponent.d.ts +20 -4
  469. package/lib/typescript/module/src/SelectionMenuNativeComponent.d.ts.map +1 -1
  470. package/lib/typescript/module/src/SplitButton.d.ts +83 -0
  471. package/lib/typescript/module/src/SplitButton.d.ts.map +1 -0
  472. package/lib/typescript/module/src/TabBar.d.ts +144 -0
  473. package/lib/typescript/module/src/TabBar.d.ts.map +1 -0
  474. package/lib/typescript/module/src/TabBarAccessoryNativeComponent.d.ts +13 -0
  475. package/lib/typescript/module/src/TabBarAccessoryNativeComponent.d.ts.map +1 -0
  476. package/lib/typescript/module/src/TabBarNativeComponent.d.ts +110 -0
  477. package/lib/typescript/module/src/TabBarNativeComponent.d.ts.map +1 -0
  478. package/lib/typescript/module/src/TextField.d.ts +332 -0
  479. package/lib/typescript/module/src/TextField.d.ts.map +1 -0
  480. package/lib/typescript/module/src/TextFieldNativeComponent.d.ts +240 -0
  481. package/lib/typescript/module/src/TextFieldNativeComponent.d.ts.map +1 -0
  482. package/lib/typescript/module/src/focusRegistry.d.ts +13 -0
  483. package/lib/typescript/module/src/focusRegistry.d.ts.map +1 -0
  484. package/lib/typescript/module/src/haptics.d.ts +20 -0
  485. package/lib/typescript/module/src/haptics.d.ts.map +1 -0
  486. package/lib/typescript/module/src/icons.d.ts +58 -0
  487. package/lib/typescript/module/src/icons.d.ts.map +1 -0
  488. package/lib/typescript/module/src/index.d.ts +13 -0
  489. package/lib/typescript/module/src/index.d.ts.map +1 -1
  490. package/lib/typescript/module/src/index.web.d.ts +25 -133
  491. package/lib/typescript/module/src/index.web.d.ts.map +1 -1
  492. package/lib/typescript/module/src/jest.d.ts +139 -0
  493. package/lib/typescript/module/src/jest.d.ts.map +1 -0
  494. package/lib/typescript/module/src/labelStyle.d.ts +20 -0
  495. package/lib/typescript/module/src/labelStyle.d.ts.map +1 -0
  496. package/lib/typescript/module/src/menuItems.d.ts +100 -0
  497. package/lib/typescript/module/src/menuItems.d.ts.map +1 -0
  498. package/lib/typescript/module/src/selectionIdentifiers.d.ts +3 -0
  499. package/lib/typescript/module/src/selectionIdentifiers.d.ts.map +1 -0
  500. package/lib/typescript/module/src/sharedTypes.d.ts +6 -1
  501. package/lib/typescript/module/src/sharedTypes.d.ts.map +1 -1
  502. package/lib/typescript/module/src/submitBehavior.d.ts +9 -0
  503. package/lib/typescript/module/src/submitBehavior.d.ts.map +1 -0
  504. package/lib/typescript/module/src/tabItems.d.ts +55 -0
  505. package/lib/typescript/module/src/tabItems.d.ts.map +1 -0
  506. package/lib/typescript/module/src/web/Button.d.ts +9 -0
  507. package/lib/typescript/module/src/web/Button.d.ts.map +1 -0
  508. package/lib/typescript/module/src/web/ButtonGroup.d.ts +11 -0
  509. package/lib/typescript/module/src/web/ButtonGroup.d.ts.map +1 -0
  510. package/lib/typescript/module/src/web/DatePicker.d.ts +14 -0
  511. package/lib/typescript/module/src/web/DatePicker.d.ts.map +1 -0
  512. package/lib/typescript/module/src/web/DateRangePicker.d.ts +11 -0
  513. package/lib/typescript/module/src/web/DateRangePicker.d.ts.map +1 -0
  514. package/lib/typescript/module/src/web/Dialog.d.ts +12 -0
  515. package/lib/typescript/module/src/web/Dialog.d.ts.map +1 -0
  516. package/lib/typescript/module/src/web/FloatingActionButton.d.ts +8 -0
  517. package/lib/typescript/module/src/web/FloatingActionButton.d.ts.map +1 -0
  518. package/lib/typescript/module/src/web/Icon.d.ts +12 -0
  519. package/lib/typescript/module/src/web/Icon.d.ts.map +1 -0
  520. package/lib/typescript/module/src/web/NativeTheme.d.ts +10 -0
  521. package/lib/typescript/module/src/web/NativeTheme.d.ts.map +1 -0
  522. package/lib/typescript/module/src/web/NavigationRail.d.ts +8 -0
  523. package/lib/typescript/module/src/web/NavigationRail.d.ts.map +1 -0
  524. package/lib/typescript/module/src/web/PlatformComponentsProvider.d.ts +10 -0
  525. package/lib/typescript/module/src/web/PlatformComponentsProvider.d.ts.map +1 -0
  526. package/lib/typescript/module/src/web/SegmentedControl.d.ts +8 -0
  527. package/lib/typescript/module/src/web/SegmentedControl.d.ts.map +1 -0
  528. package/lib/typescript/module/src/web/SelectionMenu.d.ts +10 -0
  529. package/lib/typescript/module/src/web/SelectionMenu.d.ts.map +1 -0
  530. package/lib/typescript/module/src/web/SplitButton.d.ts +9 -0
  531. package/lib/typescript/module/src/web/SplitButton.d.ts.map +1 -0
  532. package/lib/typescript/module/src/web/TabBar.d.ts +9 -0
  533. package/lib/typescript/module/src/web/TabBar.d.ts.map +1 -0
  534. package/lib/typescript/module/src/web/TextField.d.ts +9 -0
  535. package/lib/typescript/module/src/web/TextField.d.ts.map +1 -0
  536. package/lib/typescript/module/src/web/components.d.ts +17 -0
  537. package/lib/typescript/module/src/web/components.d.ts.map +1 -0
  538. package/lib/typescript/module/src/web/containers.d.ts +24 -0
  539. package/lib/typescript/module/src/web/containers.d.ts.map +1 -0
  540. package/lib/typescript/module/src/web/dateInput.d.ts +20 -0
  541. package/lib/typescript/module/src/web/dateInput.d.ts.map +1 -0
  542. package/lib/typescript/module/src/web/shared.d.ts +43 -0
  543. package/lib/typescript/module/src/web/shared.d.ts.map +1 -0
  544. package/lib/typescript/module/src/webComponents.d.ts +43 -0
  545. package/lib/typescript/module/src/webComponents.d.ts.map +1 -0
  546. package/package.json +55 -4
  547. package/plugin/build/index.d.ts +3 -2
  548. package/plugin/build/index.d.ts.map +1 -1
  549. package/react-native.config.js +6 -0
  550. package/shared/PCButtonComponentDescriptors-custom.h +22 -0
  551. package/shared/PCButtonGroupComponentDescriptors-custom.h +22 -0
  552. package/shared/PCButtonGroupShadowNode-custom.cpp +48 -0
  553. package/shared/PCButtonGroupShadowNode-custom.h +55 -0
  554. package/shared/PCButtonGroupState-custom.h +61 -0
  555. package/shared/PCButtonShadowNode-custom.cpp +48 -0
  556. package/shared/PCButtonShadowNode-custom.h +55 -0
  557. package/shared/PCButtonState-custom.h +61 -0
  558. package/shared/PCFloatingActionButtonComponentDescriptors-custom.h +22 -0
  559. package/shared/PCFloatingActionButtonShadowNode-custom.cpp +48 -0
  560. package/shared/PCFloatingActionButtonShadowNode-custom.h +54 -0
  561. package/shared/PCFloatingActionButtonState-custom.h +61 -0
  562. package/shared/PCNavigationRailComponentDescriptors-custom.h +47 -0
  563. package/shared/PCNavigationRailShadowNode-custom.h +42 -0
  564. package/shared/PCNavigationRailState-custom.h +62 -0
  565. package/shared/PCTabBarComponentDescriptors-custom.h +22 -0
  566. package/shared/PCTabBarShadowNode-custom.cpp +54 -0
  567. package/shared/PCTabBarShadowNode-custom.h +54 -0
  568. package/shared/PCTabBarState-custom.h +62 -0
  569. package/shared/PCTextFieldComponentDescriptors-custom.h +22 -0
  570. package/shared/PCTextFieldShadowNode-custom.cpp +47 -0
  571. package/shared/PCTextFieldShadowNode-custom.h +55 -0
  572. package/shared/PCTextFieldState-custom.h +61 -0
  573. package/shared/react/renderer/components/PlatformComponentsViewSpec/ComponentDescriptors.h +6 -0
  574. package/src/Button.tsx +359 -0
  575. package/src/ButtonGroup.tsx +251 -0
  576. package/src/ButtonGroupNativeComponent.ts +191 -0
  577. package/src/ButtonNativeComponent.ts +192 -0
  578. package/src/ContextMenu.tsx +34 -81
  579. package/src/ContextMenuNativeComponent.ts +47 -49
  580. package/src/DatePicker.tsx +182 -4
  581. package/src/DatePickerNativeComponent.ts +19 -2
  582. package/src/FloatingActionButton.tsx +121 -0
  583. package/src/FloatingActionButtonNativeComponent.ts +58 -0
  584. package/src/FloatingToolbar.tsx +164 -0
  585. package/src/FloatingToolbarNativeComponent.ts +47 -0
  586. package/src/LiquidGlass.tsx +24 -1
  587. package/src/LiquidGlassContainer.tsx +42 -0
  588. package/src/LiquidGlassContainerNativeComponent.ts +17 -0
  589. package/src/LiquidGlassNativeComponent.ts +8 -0
  590. package/src/NavigationRail.tsx +203 -0
  591. package/src/NavigationRailNativeComponent.ts +107 -0
  592. package/src/PlatformComponentsProvider.tsx +15 -0
  593. package/src/SegmentedControl.tsx +57 -119
  594. package/src/SegmentedControlNativeComponent.ts +14 -0
  595. package/src/SelectionMenu.tsx +81 -6
  596. package/src/SelectionMenuNativeComponent.ts +26 -4
  597. package/src/SplitButton.tsx +198 -0
  598. package/src/TabBar.tsx +373 -0
  599. package/src/TabBarAccessoryNativeComponent.ts +19 -0
  600. package/src/TabBarNativeComponent.ts +145 -0
  601. package/src/TextField.tsx +908 -0
  602. package/src/TextFieldNativeComponent.ts +324 -0
  603. package/src/focusRegistry.ts +90 -0
  604. package/src/haptics.ts +31 -0
  605. package/src/icons.ts +143 -0
  606. package/src/index.tsx +13 -0
  607. package/src/index.web.tsx +53 -199
  608. package/src/jest.tsx +958 -0
  609. package/src/labelStyle.ts +36 -0
  610. package/src/menuItems.ts +152 -0
  611. package/src/reactNativeInternals.d.ts +22 -0
  612. package/src/selectionIdentifiers.ts +17 -0
  613. package/src/sharedTypes.ts +7 -1
  614. package/src/submitBehavior.ts +16 -0
  615. package/src/tabItems.ts +113 -0
  616. package/src/web/Button.tsx +201 -0
  617. package/src/web/ButtonGroup.tsx +154 -0
  618. package/src/web/DatePicker.tsx +204 -0
  619. package/src/web/DateRangePicker.tsx +135 -0
  620. package/src/web/Dialog.tsx +54 -0
  621. package/src/web/FloatingActionButton.tsx +76 -0
  622. package/src/web/Icon.tsx +33 -0
  623. package/src/web/NativeTheme.ts +23 -0
  624. package/src/web/NavigationRail.tsx +148 -0
  625. package/src/web/PlatformComponentsProvider.tsx +48 -0
  626. package/src/web/SegmentedControl.tsx +127 -0
  627. package/src/web/SelectionMenu.tsx +149 -0
  628. package/src/web/SplitButton.tsx +32 -0
  629. package/src/web/TabBar.tsx +150 -0
  630. package/src/web/TextField.tsx +361 -0
  631. package/src/web/components.tsx +71 -0
  632. package/src/web/containers.tsx +130 -0
  633. package/src/web/dateInput.ts +137 -0
  634. package/src/web/shared.ts +176 -0
  635. package/src/webComponents.ts +45 -0
  636. package/android/src/main/java/com/platformcomponents/DateConstraints.kt +0 -83
@@ -47,6 +47,11 @@ class PCDatePickerViewManager :
47
47
 
48
48
  dispatcher?.dispatchEvent(CancelEvent(view.id))
49
49
  }
50
+ view.onConfirmRange = { startMs: Long, endMs: Long ->
51
+ dispatcher?.dispatchEvent(ConfirmEvent(view.id, startMs.toDouble(), endTs = endMs.toDouble()))
52
+
53
+ dispatcher?.dispatchEvent(CancelEvent(view.id))
54
+ }
50
55
  view.onCancel = {
51
56
  dispatcher?.dispatchEvent(CancelEvent(view.id))
52
57
  }
@@ -81,6 +86,14 @@ class PCDatePickerViewManager :
81
86
  view.applyDateMs(if (value > noDateSentinel) value.toLong() else null)
82
87
  }
83
88
 
89
+ override fun setEndDateMs(view: PCDatePickerView, value: Double) {
90
+ view.applyEndDateMs(if (value > noDateSentinel) value.toLong() else null)
91
+ }
92
+
93
+ override fun setHourFormat(view: PCDatePickerView, value: String?) {
94
+ view.applyHourFormat(value)
95
+ }
96
+
84
97
  override fun setMinDateMs(view: PCDatePickerView, value: Double) {
85
98
  view.applyMinDateMs(if (value > noDateSentinel) value.toLong() else null)
86
99
  }
@@ -93,7 +106,7 @@ class PCDatePickerViewManager :
93
106
 
94
107
  override fun setAndroid(view: PCDatePickerView, value: ReadableMap?) {
95
108
  if (value == null) {
96
- view.applyAndroidConfig(null, null, null, null, null)
109
+ view.applyAndroidConfig(null, null, null, null, null, null)
97
110
  return
98
111
  }
99
112
 
@@ -130,7 +143,12 @@ class PCDatePickerViewManager :
130
143
  value.getString("negativeButtonTitle")
131
144
  else null
132
145
 
133
- view.applyAndroidConfig(firstDay, material, title, pos, neg)
146
+ val inputMode =
147
+ if (value.hasKey("inputMode") && !value.isNull("inputMode"))
148
+ value.getString("inputMode")
149
+ else null
150
+
151
+ view.applyAndroidConfig(firstDay, material, title, pos, neg, inputMode)
134
152
  }
135
153
 
136
154
  override fun setIos(view: PCDatePickerView, value: ReadableMap?) {
@@ -142,13 +160,15 @@ class PCDatePickerViewManager :
142
160
  private class ConfirmEvent(
143
161
  surfaceId: Int,
144
162
  private val ts: Double,
145
- private val confirmed: Boolean = true
163
+ private val confirmed: Boolean = true,
164
+ private val endTs: Double = 0.0
146
165
  ) : Event<ConfirmEvent>(surfaceId) {
147
166
  override fun getEventName(): String = "topConfirm"
148
167
  override fun dispatch(rctEventEmitter: RCTEventEmitter) {
149
168
  val payload = com.facebook.react.bridge.Arguments.createMap().apply {
150
169
  putDouble("timestampMs", ts)
151
170
  putBoolean("confirmed", confirmed)
171
+ putDouble("endTimestampMs", endTs)
152
172
  }
153
173
  rctEventEmitter.receiveEvent(viewTag, eventName, payload)
154
174
  }
@@ -0,0 +1,112 @@
1
+ package com.platformcomponents
2
+
3
+ import android.content.Context
4
+ import android.view.ContextThemeWrapper
5
+ import androidx.appcompat.R as AppCompatR
6
+ import com.google.android.material.R as MaterialR
7
+ import com.google.android.material.button.MaterialButton
8
+
9
+ /**
10
+ * Material 3 Expressive contexts and styles for Button and ButtonGroup.
11
+ *
12
+ * The Expressive look is a set of widget styles (PCExpressiveOverlay in
13
+ * styles.xml) layered over the host theme, plus one of Material's size overlays,
14
+ * which the Expressive button styles read their padding, icon size, label style
15
+ * and shapes from.
16
+ */
17
+ object PCExpressive {
18
+ enum class Variant { FILLED, TONAL, OUTLINED, TEXT, ELEVATED }
19
+
20
+ /**
21
+ * The Liquid Glass variants are iOS 26 styles; Android takes the closest
22
+ * Material emphasis: `glass` and `clearGlass` are tonal, `prominentGlass`
23
+ * and `prominentClearGlass` are filled.
24
+ */
25
+ fun parseVariant(value: String?): Variant =
26
+ when (value) {
27
+ "tonal", "glass", "clearGlass" -> Variant.TONAL
28
+ "outlined" -> Variant.OUTLINED
29
+ "text" -> Variant.TEXT
30
+ "elevated" -> Variant.ELEVATED
31
+ else -> Variant.FILLED
32
+ }
33
+
34
+ /** "xsmall" | "small" | "medium" | "large" | "xlarge" */
35
+ fun parseSize(value: String?): String =
36
+ when (value) {
37
+ "xsmall", "medium", "large", "xlarge" -> value
38
+ else -> "small"
39
+ }
40
+
41
+ /** "round" | "square"; the spec's empty string is the Material default, round. */
42
+ fun parseShape(value: String?): String = if (value == "square") "square" else "round"
43
+
44
+ /**
45
+ * The theme overlay choosing the buttons' size and shape (PCSize.* in
46
+ * styles.xml): it sets the size overlay attributes the library's button
47
+ * styles read, for text buttons and for icon-only buttons, which use
48
+ * Material's square icon button sizes.
49
+ */
50
+ fun sizeOverlay(size: String, shape: String): Int {
51
+ val square = shape == "square"
52
+ return when (size) {
53
+ "xsmall" -> if (square) R.style.PCSize_Xsmall_Square else R.style.PCSize_Xsmall
54
+ "medium" -> if (square) R.style.PCSize_Medium_Square else R.style.PCSize_Medium
55
+ "large" -> if (square) R.style.PCSize_Large_Square else R.style.PCSize_Large
56
+ "xlarge" -> if (square) R.style.PCSize_Xlarge_Square else R.style.PCSize_Xlarge
57
+ else -> if (square) R.style.PCSize_Small_Square else R.style.PCSize_Small
58
+ }
59
+ }
60
+
61
+ /** The theme attribute naming the widget style for a variant. */
62
+ fun styleAttr(variant: Variant, iconOnly: Boolean): Int =
63
+ if (iconOnly) {
64
+ when (variant) {
65
+ Variant.FILLED -> MaterialR.attr.materialIconButtonFilledStyle
66
+ Variant.TONAL -> MaterialR.attr.materialIconButtonFilledTonalStyle
67
+ Variant.OUTLINED -> MaterialR.attr.materialIconButtonOutlinedStyle
68
+ Variant.TEXT, Variant.ELEVATED -> MaterialR.attr.materialIconButtonStyle
69
+ }
70
+ } else {
71
+ when (variant) {
72
+ Variant.FILLED -> MaterialR.attr.materialButtonStyle
73
+ Variant.TONAL -> MaterialR.attr.materialButtonTonalStyle
74
+ Variant.OUTLINED -> MaterialR.attr.materialButtonOutlinedStyle
75
+ Variant.TEXT -> AppCompatR.attr.borderlessButtonStyle
76
+ Variant.ELEVATED -> MaterialR.attr.materialButtonElevatedStyle
77
+ }
78
+ }
79
+
80
+ /** "expressive" (default) | "m3" */
81
+ fun parseExpressive(value: String?): Boolean = value != "m3"
82
+
83
+ /**
84
+ * Creates a button. [base] is a Material 3 context (see
85
+ * PCThemeSupport.materialContext); [toolbarOverlay] is the enclosing
86
+ * FloatingToolbar's button overlay, or 0 outside a toolbar.
87
+ *
88
+ * With [expressive] the Material 3 Expressive styles apply, sized by the
89
+ * size overlay; otherwise the theme's classic Material 3 button styles,
90
+ * which have one size and shape. The toolbar overlay replaces the filled,
91
+ * text and standard icon button styles with the toolbar's, as it does for
92
+ * XML children of a FloatingToolbarLayout; the toolbar itself is an
93
+ * Expressive component, so its buttons always are.
94
+ */
95
+ fun createButton(
96
+ base: Context,
97
+ variant: Variant,
98
+ size: String,
99
+ shape: String,
100
+ iconOnly: Boolean,
101
+ toolbarOverlay: Int,
102
+ expressive: Boolean = true
103
+ ): MaterialButton {
104
+ if (!expressive && toolbarOverlay == 0) {
105
+ return MaterialButton(base, null, styleAttr(variant, iconOnly))
106
+ }
107
+ val overlaid = ContextThemeWrapper(base, R.style.PCExpressiveOverlay)
108
+ val themed = if (toolbarOverlay != 0) ContextThemeWrapper(overlaid, toolbarOverlay) else overlaid
109
+ val sized = ContextThemeWrapper(themed, sizeOverlay(size, shape))
110
+ return MaterialButton(sized, null, styleAttr(variant, iconOnly))
111
+ }
112
+ }
@@ -0,0 +1,485 @@
1
+ package com.platformcomponents
2
+
3
+ import android.animation.Animator
4
+ import android.animation.AnimatorListenerAdapter
5
+ import android.content.Context
6
+ import android.content.res.ColorStateList
7
+ import android.graphics.drawable.BitmapDrawable
8
+ import android.graphics.drawable.Drawable
9
+ import android.view.Gravity
10
+ import android.view.View
11
+ import android.view.ViewTreeObserver
12
+ import android.widget.FrameLayout
13
+ import com.facebook.react.bridge.WritableNativeMap
14
+ import com.facebook.react.uimanager.PixelUtil
15
+ import com.facebook.react.uimanager.ReactCompoundViewGroup
16
+ import com.facebook.react.uimanager.StateWrapper
17
+ import com.facebook.react.uimanager.util.ReactFindViewUtil
18
+ import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper
19
+ import com.facebook.react.views.scroll.ReactScrollViewHelper
20
+ import com.google.android.material.R as MaterialR
21
+ import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
22
+ import com.google.android.material.floatingactionbutton.FloatingActionButton
23
+
24
+ /**
25
+ * A Material floating action button: a FloatingActionButton for an icon, an
26
+ * ExtendedFloatingActionButton with a label, which shrinks to its icon and
27
+ * extends again with Material's own animation (`shrink()` / `extend()`),
28
+ * driven by the `extended` prop or by a linked ScrollView.
29
+ *
30
+ * The widget sits at the end edge of this view, where Material places a FAB,
31
+ * so it shrinks toward that edge. The view reports the widget's size to
32
+ * Fabric: while the button shrinks it keeps the extended size, and it takes
33
+ * the extended size before the button extends, so an end-anchored button
34
+ * doesn't jump.
35
+ */
36
+ class PCFloatingActionButtonView(context: Context) :
37
+ FrameLayout(context),
38
+ ReactScrollViewHelper.HasStateWrapper,
39
+ ReactCompoundViewGroup {
40
+
41
+ // --- State Wrapper for Fabric state updates ---
42
+ override var stateWrapper: StateWrapper? = null
43
+ private var lastReportedWidth: Float = -1f
44
+ private var lastReportedHeight: Float = -1f
45
+
46
+ // --- Props ---
47
+ var icon: PCButtonSupport.Icon = PCButtonSupport.NO_ICON
48
+ var label: String = ""
49
+ var size: String = "regular" // "small" | "regular" | "medium" | "large"
50
+ var extended: Boolean = true
51
+ var containerColor: Int? = null
52
+ var foregroundColor: Int? = null
53
+ var interactivity: String = "enabled"
54
+ var spokenLabel: String = ""
55
+ var scrollViewNativeID: String = ""
56
+
57
+ /** The `haptics` prop; the manager plays it with the user's action (see PCHaptics). */
58
+ var haptics: String = ""
59
+
60
+ // --- Events ---
61
+ var onPress: (() -> Unit)? = null
62
+
63
+ // --- UI (declared before init: rebuildUI() runs from it) ---
64
+ private var fab: FloatingActionButton? = null
65
+ private var extendedFab: ExtendedFloatingActionButton? = null
66
+
67
+ /** The extended button's size with its label, measured when it is built. */
68
+ private var extendedWidth = 0
69
+ private var extendedHeight = 0
70
+
71
+ /** Shrunk by scrolling down the linked ScrollView. */
72
+ private var scrollShrunk = false
73
+
74
+ /** A shrink or extend animation is running. */
75
+ private var resizing = false
76
+
77
+ /** Bumped on every rebuild so late image loads can't touch a stale button. */
78
+ private var rebuildGeneration = 0
79
+
80
+ private val resizeListener = object : AnimatorListenerAdapter() {
81
+ override fun onAnimationStart(animation: Animator) {
82
+ resizing = true
83
+ }
84
+
85
+ // Also called after a cancel, when the opposite animation takes over
86
+ override fun onAnimationEnd(animation: Animator) {
87
+ resizing = false
88
+ reportSize()
89
+ }
90
+ }
91
+
92
+ // --- Native theme ---
93
+ // Widgets read theme colors when they are created, so the button is rebuilt
94
+ // when the native theme changes (brand color, light/dark switch).
95
+ private var builtThemeVersion = PCNativeTheme.version
96
+ private val nativeThemeListener = PCNativeTheme.Listener {
97
+ PCThemeSupport.clearColorStateListCaches(this)
98
+ rebuildUI()
99
+ }
100
+
101
+ init {
102
+ clipChildren = false
103
+ clipToPadding = false
104
+ rebuildUI()
105
+ }
106
+
107
+ // ---- Public apply* (called by manager) ----
108
+
109
+ fun applyIcon(value: PCButtonSupport.Icon) {
110
+ if (icon == value) return
111
+ icon = value
112
+ rebuildUI()
113
+ }
114
+
115
+ fun applyLabel(value: String) {
116
+ if (label == value) return
117
+ label = value
118
+ rebuildUI()
119
+ }
120
+
121
+ fun applySize(value: String?) {
122
+ val next = when (value) {
123
+ "small", "medium", "large" -> value
124
+ else -> "regular"
125
+ }
126
+ if (size == next) return
127
+ size = next
128
+ rebuildUI()
129
+ }
130
+
131
+ fun applyExtended(value: Boolean) {
132
+ if (extended == value) return
133
+ extended = value
134
+ syncExtended(animate = true)
135
+ }
136
+
137
+ fun applyColors(container: Int?, foreground: Int?) {
138
+ if (containerColor == container && foregroundColor == foreground) return
139
+ containerColor = container
140
+ foregroundColor = foreground
141
+ rebuildUI()
142
+ }
143
+
144
+ fun applyInteractivity(value: String?) {
145
+ val next = if (value == "disabled") "disabled" else "enabled"
146
+ if (interactivity == next) return
147
+ interactivity = next
148
+ fab?.isEnabled = next == "enabled"
149
+ extendedFab?.isEnabled = next == "enabled"
150
+ }
151
+
152
+ fun applySpokenLabel(value: String) {
153
+ if (spokenLabel == value) return
154
+ spokenLabel = value
155
+ fab?.contentDescription = spokenLabel.ifEmpty { null }
156
+ extendedFab?.contentDescription = spokenLabel.ifEmpty { null }
157
+ }
158
+
159
+ // ---- Shrink and extend ----
160
+
161
+ private val targetExtended: Boolean
162
+ get() = extended && !scrollShrunk
163
+
164
+ /**
165
+ * Brings the extended button to its target state. Material skips the change
166
+ * while the button has no icon yet; the icon load calls this again.
167
+ */
168
+ private fun syncExtended(animate: Boolean) {
169
+ val b = extendedFab ?: return
170
+ val target = targetExtended
171
+ if (b.isExtended == target) return
172
+ if (animate && b.isLaidOut && isAttachedToWindow) {
173
+ if (target) b.extend() else b.shrink()
174
+ } else {
175
+ b.isExtended = target
176
+ }
177
+ reportSize()
178
+ }
179
+
180
+ // ---- Scroll link ----
181
+ // A ViewTreeObserver listener rather than the ScrollView's own scroll
182
+ // listener, which has room for one: a TabBar may follow the same content.
183
+
184
+ private var watchedScrollView: View? = null
185
+ private var lastScrollY = 0
186
+ private val scrollViewFinder = object : ReactFindViewUtil.OnViewFoundListener {
187
+ override fun getNativeId(): String = scrollViewNativeID
188
+ override fun onViewFound(view: View) = watch(view)
189
+ }
190
+ private val scrollListener = ViewTreeObserver.OnScrollChangedListener {
191
+ val view = watchedScrollView ?: return@OnScrollChangedListener
192
+ val scrollY = view.scrollY
193
+ val dy = scrollY - lastScrollY
194
+ lastScrollY = scrollY
195
+ if (dy != 0) onContentScrolled(scrollY, dy)
196
+ }
197
+ private var observedTree: ViewTreeObserver? = null
198
+
199
+ fun applyScrollViewNativeID(value: String) {
200
+ if (scrollViewNativeID == value) return
201
+ scrollViewNativeID = value
202
+ findScrollView()
203
+ }
204
+
205
+ /** The ScrollView with scrollViewNativeID, now or once it mounts. */
206
+ private fun findScrollView() {
207
+ unwatch()
208
+ ReactFindViewUtil.removeViewListener(scrollViewFinder)
209
+ if (scrollViewNativeID.isEmpty() || !isAttachedToWindow) return
210
+ val found = ReactFindViewUtil.findView(rootView, scrollViewNativeID)
211
+ if (found != null) watch(found) else ReactFindViewUtil.addViewListener(scrollViewFinder)
212
+ }
213
+
214
+ private fun watch(view: View) {
215
+ ReactFindViewUtil.removeViewListener(scrollViewFinder)
216
+ unwatch()
217
+ watchedScrollView = view
218
+ lastScrollY = view.scrollY
219
+ observedTree = viewTreeObserver.also { it.addOnScrollChangedListener(scrollListener) }
220
+ }
221
+
222
+ /** Stops following the ScrollView; a button it shrank extends again. */
223
+ private fun unwatch(animate: Boolean = true) {
224
+ observedTree?.takeIf { it.isAlive }?.removeOnScrollChangedListener(scrollListener)
225
+ observedTree = null
226
+ watchedScrollView = null
227
+ if (scrollShrunk) {
228
+ scrollShrunk = false
229
+ syncExtended(animate)
230
+ }
231
+ }
232
+
233
+ private fun onContentScrolled(scrollY: Int, dy: Int) {
234
+ // Shrink scrolling down; extend scrolling up, and always at the top
235
+ val shrink = scrollY > 0 && dy > 0
236
+ if (scrollShrunk == shrink) return
237
+ scrollShrunk = shrink
238
+ syncExtended(animate = true)
239
+ }
240
+
241
+ // ---- Touch ----
242
+
243
+ // Claim the touch for this view in React Native's touch handling; the
244
+ // button still receives it natively.
245
+ override fun interceptsTouchEvent(touchX: Float, touchY: Float): Boolean = true
246
+
247
+ override fun reactTagForTouch(touchX: Float, touchY: Float): Int = id
248
+
249
+ // ---- Lifecycle ----
250
+
251
+ override fun onAttachedToWindow() {
252
+ super.onAttachedToWindow()
253
+ PCNativeTheme.addListener(nativeThemeListener)
254
+ PCNativeTheme.attach(context)
255
+ if (builtThemeVersion != PCNativeTheme.version) nativeThemeListener.onNativeThemeChanged()
256
+ if (watchedScrollView == null) findScrollView()
257
+ }
258
+
259
+ override fun onDetachedFromWindow() {
260
+ ReactFindViewUtil.removeViewListener(scrollViewFinder)
261
+ unwatch(animate = false)
262
+ PCNativeTheme.removeListener(nativeThemeListener)
263
+ super.onDetachedFromWindow()
264
+ }
265
+
266
+ // ---- UI Building ----
267
+
268
+ private fun rebuildUI() {
269
+ builtThemeVersion = PCNativeTheme.version
270
+ removeAllViews()
271
+ fab = null
272
+ extendedFab = null
273
+ resizing = false
274
+ rebuildGeneration += 1
275
+ val generation = rebuildGeneration
276
+
277
+ // Material widgets need a Material theme; fall back to Material 3 defaults instead of crashing.
278
+ val base = PCThemeSupport.materialContext(context, "FloatingActionButton")
279
+ if (label.isEmpty()) buildFab(base, generation) else buildExtendedFab(base, generation)
280
+ requestLayout()
281
+ reportSize()
282
+ }
283
+
284
+ private fun endLayoutParams() =
285
+ LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.END or Gravity.CENTER_VERTICAL)
286
+
287
+ /** The theme's FAB style for the size: Material 3 small, regular and large, the Expressive medium. */
288
+ private fun fabStyleAttr(): Int = when (size) {
289
+ "small" -> MaterialR.attr.floatingActionButtonSmallStyle
290
+ "medium" -> MaterialR.attr.floatingActionButtonMediumStyle
291
+ "large" -> MaterialR.attr.floatingActionButtonLargeStyle
292
+ else -> MaterialR.attr.floatingActionButtonStyle
293
+ }
294
+
295
+ /** Extended FABs come in three sizes; `small` and `regular` share the 56dp one. */
296
+ private fun extendedStyleAttr(): Int = when (size) {
297
+ "medium" -> MaterialR.attr.extendedFloatingActionButtonMediumStyle
298
+ "large" -> MaterialR.attr.extendedFloatingActionButtonLargeStyle
299
+ else -> MaterialR.attr.extendedFloatingActionButtonSmallStyle
300
+ }
301
+
302
+ private fun buildFab(base: Context, generation: Int) {
303
+ val f = FloatingActionButton(base, null, fabStyleAttr()).apply {
304
+ contentDescription = spokenLabel.ifEmpty { null }
305
+ isEnabled = interactivity == "enabled"
306
+ setOnClickListener { onPress?.invoke() }
307
+ }
308
+ containerColor?.let { f.backgroundTintList = keepDisabled(it, f.backgroundTintList) }
309
+ if (!icon.tinted) {
310
+ f.setSupportImageTintList(null)
311
+ } else {
312
+ foregroundColor?.let { f.setSupportImageTintList(keepDisabled(it, f.supportImageTintList)) }
313
+ }
314
+ loadIcon(icon) { drawable ->
315
+ if (generation != rebuildGeneration) return@loadIcon
316
+ f.setImageDrawable(drawable)
317
+ }
318
+ addView(f, endLayoutParams())
319
+ fab = f
320
+ }
321
+
322
+ private fun buildExtendedFab(base: Context, generation: Int) {
323
+ val b = ExtendedFloatingActionButton(base, null, extendedStyleAttr()).apply {
324
+ text = label
325
+ isAllCaps = false
326
+ maxLines = 1
327
+ contentDescription = spokenLabel.ifEmpty { null }
328
+ isEnabled = interactivity == "enabled"
329
+ setOnClickListener { onPress?.invoke() }
330
+ }
331
+ PCButtonSupport.applyIcon(b, icon, { generation == rebuildGeneration }) {
332
+ // A late icon: measure the label again, and shrink if that was waiting
333
+ if (b.isExtended && !resizing) measureExtended(b)
334
+ syncExtended(animate = false)
335
+ requestLayout()
336
+ reportSize()
337
+ }
338
+ PCButtonSupport.applyColors(b, containerColor, foregroundColor, null, null, icon.tinted)
339
+ // In its parent before Material changes the layout params to shrink it
340
+ addView(b, endLayoutParams())
341
+ measureExtended(b)
342
+ b.addOnShrinkAnimationListener(resizeListener)
343
+ b.addOnExtendAnimationListener(resizeListener)
344
+ extendedFab = b
345
+ // The built button is extended; shrink it now when it shouldn't be
346
+ if (!targetExtended) b.isExtended = false
347
+ }
348
+
349
+ /**
350
+ * The extended button's natural size. A detached TextView can't resolve an
351
+ * inherited layout direction, and then leaves its relative (start) icon out
352
+ * of the measured width, so it is measured with an explicit direction.
353
+ */
354
+ private fun measureExtended(b: ExtendedFloatingActionButton) {
355
+ val unspecified = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
356
+ val direction = b.layoutDirection
357
+ if (!b.isAttachedToWindow) b.layoutDirection = View.LAYOUT_DIRECTION_LOCALE
358
+ b.measure(unspecified, unspecified)
359
+ extendedWidth = b.measuredWidth
360
+ extendedHeight = b.measuredHeight
361
+ b.layoutDirection = direction
362
+ }
363
+
364
+ /** A color for the enabled state, keeping the style's disabled color. */
365
+ private fun keepDisabled(color: Int, theme: ColorStateList?): ColorStateList {
366
+ val disabled = intArrayOf(-android.R.attr.state_enabled)
367
+ return ColorStateList(
368
+ arrayOf(disabled, intArrayOf()),
369
+ intArrayOf(theme?.getColorForState(disabled, color) ?: color, color)
370
+ )
371
+ }
372
+
373
+ private fun loadIcon(icon: PCButtonSupport.Icon, onLoaded: (Drawable?) -> Unit) {
374
+ when (icon.type) {
375
+ "drawable" -> onLoaded(ResourceDrawableIdHelper.instance.getResourceDrawable(context, icon.name))
376
+ "image" -> {
377
+ val uri = icon.uri
378
+ if (!uri.contains(':')) {
379
+ onLoaded(ResourceDrawableIdHelper.instance.getResourceDrawable(context, uri))
380
+ } else {
381
+ PCImageLoader.load(context, uri, icon.scale, icon.request) { bitmap ->
382
+ onLoaded(bitmap?.let { BitmapDrawable(resources, it) })
383
+ }
384
+ }
385
+ }
386
+ else -> onLoaded(null)
387
+ }
388
+ }
389
+
390
+ // ---- Layout ----
391
+
392
+ private var manualLayoutPending = false
393
+
394
+ /**
395
+ * React Native's root view ignores requestLayout after the initial pass, so
396
+ * a native view that changes its own subtree later (a rebuild, the extended
397
+ * button animating its width) has to measure and lay itself out. Coalesced
398
+ * to one pass per frame.
399
+ */
400
+ override fun requestLayout() {
401
+ super.requestLayout()
402
+ if (!manualLayoutPending) {
403
+ manualLayoutPending = true
404
+ post { runManualLayout() }
405
+ }
406
+ }
407
+
408
+ private fun runManualLayout() {
409
+ manualLayoutPending = false
410
+ if (width == 0 || height == 0) return
411
+ measure(
412
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
413
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
414
+ )
415
+ layout(left, top, right, bottom)
416
+ }
417
+
418
+ /**
419
+ * The size the view takes: the button's own, except that while it shrinks
420
+ * the view keeps the extended size.
421
+ */
422
+ private fun naturalSize(): Pair<Int, Int> {
423
+ fab?.let { f ->
424
+ val unspecified = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
425
+ f.measure(unspecified, unspecified)
426
+ return f.measuredWidth to f.measuredHeight
427
+ }
428
+ val b = extendedFab ?: return 0 to 0
429
+ if (b.isExtended || resizing) return extendedWidth to extendedHeight
430
+ return b.collapsedSize to b.collapsedSize
431
+ }
432
+
433
+ override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
434
+ val child = fab ?: extendedFab
435
+ if (child == null) {
436
+ setMeasuredDimension(0, 0)
437
+ return
438
+ }
439
+ val (naturalWidth, naturalHeight) = naturalSize()
440
+ val width = resolveDimension(widthMeasureSpec, naturalWidth)
441
+ val height = resolveDimension(heightMeasureSpec, naturalHeight)
442
+ // The button by its own layout params, which Material animates
443
+ measureChild(
444
+ child,
445
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
446
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
447
+ )
448
+ setMeasuredDimension(width, height)
449
+ }
450
+
451
+ private fun resolveDimension(spec: Int, desired: Int): Int {
452
+ val size = MeasureSpec.getSize(spec)
453
+ return when (MeasureSpec.getMode(spec)) {
454
+ // Fabric may give us 0 before the state is applied; keep the natural size then.
455
+ MeasureSpec.EXACTLY -> if (size > 0) size else desired
456
+ MeasureSpec.AT_MOST -> minOf(desired, size)
457
+ else -> desired
458
+ }
459
+ }
460
+
461
+ override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
462
+ super.onLayout(changed, left, top, right, bottom)
463
+ reportSize()
464
+ }
465
+
466
+ /** Reports the size to Fabric; called as soon as the state wrapper is available. */
467
+ fun reportIntrinsicSize() = reportSize()
468
+
469
+ private fun reportSize() {
470
+ val wrapper = stateWrapper ?: return
471
+ if (fab == null && extendedFab == null) return
472
+ val (widthPx, heightPx) = naturalSize()
473
+ val widthDp = PixelUtil.toDIPFromPixel(widthPx.toFloat())
474
+ val heightDp = PixelUtil.toDIPFromPixel(heightPx.toFloat())
475
+ if (widthDp == lastReportedWidth && heightDp == lastReportedHeight) return
476
+ lastReportedWidth = widthDp
477
+ lastReportedHeight = heightDp
478
+ wrapper.updateState(
479
+ WritableNativeMap().apply {
480
+ putDouble("width", widthDp.toDouble())
481
+ putDouble("height", heightDp.toDouble())
482
+ }
483
+ )
484
+ }
485
+ }