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.
- package/PlatformComponents.podspec +1 -1
- package/README.md +33 -31
- package/android/src/main/java/com/platformcomponents/PCButtonGroupView.kt +175 -9
- package/android/src/main/java/com/platformcomponents/PCButtonGroupViewManager.kt +52 -2
- package/android/src/main/java/com/platformcomponents/PCButtonSupport.kt +44 -12
- package/android/src/main/java/com/platformcomponents/PCButtonView.kt +187 -5
- package/android/src/main/java/com/platformcomponents/PCButtonViewManager.kt +85 -7
- package/android/src/main/java/com/platformcomponents/PCContextMenuView.kt +41 -151
- package/android/src/main/java/com/platformcomponents/PCContextMenuViewManager.kt +7 -63
- package/android/src/main/java/com/platformcomponents/PCDatePickerView.kt +310 -115
- package/android/src/main/java/com/platformcomponents/PCDatePickerViewManager.kt +23 -3
- package/android/src/main/java/com/platformcomponents/PCExpressive.kt +6 -1
- package/android/src/main/java/com/platformcomponents/PCFloatingActionButtonView.kt +485 -0
- package/android/src/main/java/com/platformcomponents/PCFloatingActionButtonViewManager.kt +109 -0
- package/android/src/main/java/com/platformcomponents/PCFloatingToolbarView.kt +132 -0
- package/android/src/main/java/com/platformcomponents/PCFloatingToolbarViewManager.kt +8 -0
- package/android/src/main/java/com/platformcomponents/PCHaptics.kt +46 -0
- package/android/src/main/java/com/platformcomponents/PCImageLoader.kt +42 -7
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassContainerView.kt +32 -0
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassContainerViewManager.kt +31 -0
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassView.kt +32 -6
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassViewManager.kt +4 -0
- package/android/src/main/java/com/platformcomponents/PCMenuSupport.kt +280 -0
- package/android/src/main/java/com/platformcomponents/PCNavigationBarSupport.kt +332 -0
- package/android/src/main/java/com/platformcomponents/PCNavigationRailView.kt +448 -0
- package/android/src/main/java/com/platformcomponents/PCNavigationRailViewManager.kt +176 -0
- package/android/src/main/java/com/platformcomponents/PCSegmentedControlView.kt +24 -14
- package/android/src/main/java/com/platformcomponents/PCSegmentedControlViewManager.kt +14 -2
- package/android/src/main/java/com/platformcomponents/PCSelectionMenuView.kt +371 -39
- package/android/src/main/java/com/platformcomponents/PCSelectionMenuViewManager.kt +18 -4
- package/android/src/main/java/com/platformcomponents/PCTabBarView.kt +397 -0
- package/android/src/main/java/com/platformcomponents/PCTabBarViewManager.kt +182 -0
- package/android/src/main/java/com/platformcomponents/PCTextFieldView.kt +415 -40
- package/android/src/main/java/com/platformcomponents/PCTextFieldViewManager.kt +109 -3
- package/android/src/main/java/com/platformcomponents/PCThemeSupport.kt +37 -0
- package/android/src/main/java/com/platformcomponents/PlatformComponentsPackage.kt +4 -0
- package/android/src/main/res/drawable/pc_ic_search.xml +12 -0
- package/android/src/main/res/values/ids.xml +5 -0
- package/android/src/main/res/values/styles.xml +24 -0
- package/ios/PCButton.mm +122 -7
- package/ios/PCButtonGroup.mm +68 -1
- package/ios/PCButtonGroupView.swift +225 -6
- package/ios/PCButtonSupport.swift +181 -10
- package/ios/PCButtonView.swift +297 -14
- package/ios/PCConstants.swift +23 -2
- package/ios/PCContextMenu.mm +28 -110
- package/ios/PCContextMenu.swift +106 -167
- package/ios/PCDatePicker.mm +21 -9
- package/ios/PCDatePickerView.swift +94 -20
- package/ios/PCFloatingActionButton.h +10 -0
- package/ios/PCFloatingActionButton.mm +177 -0
- package/ios/PCFloatingActionButtonView.swift +426 -0
- package/ios/PCFloatingToolbar.mm +27 -0
- package/ios/PCFloatingToolbarView.swift +241 -0
- package/ios/PCHaptics.swift +91 -0
- package/ios/PCImageLoader.swift +76 -12
- package/ios/PCLiquidGlass.mm +36 -0
- package/ios/PCLiquidGlass.swift +221 -114
- package/ios/PCLiquidGlassContainer.h +10 -0
- package/ios/PCLiquidGlassContainer.mm +84 -0
- package/ios/PCLiquidGlassContainer.swift +69 -0
- package/ios/PCMenuItems.h +76 -0
- package/ios/PCMenuSupport.swift +350 -0
- package/ios/PCNavigationRail.h +10 -0
- package/ios/PCNavigationRail.mm +270 -0
- package/ios/PCNavigationRailView.swift +415 -0
- package/ios/PCSegmentedControl.mm +17 -2
- package/ios/PCSegmentedControl.swift +57 -7
- package/ios/PCSelectionMenu.mm +36 -8
- package/ios/PCSelectionMenu.swift +224 -48
- package/ios/PCTabBar.h +10 -0
- package/ios/PCTabBar.mm +285 -0
- package/ios/PCTabBarAccessory.h +10 -0
- package/ios/PCTabBarAccessory.mm +93 -0
- package/ios/PCTabBarAccessoryView.swift +96 -0
- package/ios/PCTabBarView.swift +671 -0
- package/ios/PCTextField.mm +159 -4
- package/ios/PCTextFieldView.swift +603 -57
- package/lib/commonjs/Button.js +73 -1
- package/lib/commonjs/Button.js.map +1 -1
- package/lib/commonjs/ButtonGroup.js +13 -3
- package/lib/commonjs/ButtonGroup.js.map +1 -1
- package/lib/commonjs/ButtonGroupNativeComponent.ts +74 -4
- package/lib/commonjs/ButtonNativeComponent.ts +119 -3
- package/lib/commonjs/ContextMenu.js +9 -48
- package/lib/commonjs/ContextMenu.js.map +1 -1
- package/lib/commonjs/ContextMenuNativeComponent.ts +47 -49
- package/lib/commonjs/DatePicker.js +98 -2
- package/lib/commonjs/DatePicker.js.map +1 -1
- package/lib/commonjs/DatePickerNativeComponent.ts +19 -2
- package/lib/commonjs/FloatingActionButton.js +60 -0
- package/lib/commonjs/FloatingActionButton.js.map +1 -0
- package/lib/commonjs/FloatingActionButtonNativeComponent.ts +58 -0
- package/lib/commonjs/FloatingToolbar.js +9 -1
- package/lib/commonjs/FloatingToolbar.js.map +1 -1
- package/lib/commonjs/FloatingToolbarNativeComponent.ts +16 -0
- package/lib/commonjs/LiquidGlass.js +7 -1
- package/lib/commonjs/LiquidGlass.js.map +1 -1
- package/lib/commonjs/LiquidGlassContainer.js +32 -0
- package/lib/commonjs/LiquidGlassContainer.js.map +1 -0
- package/lib/commonjs/LiquidGlassContainerNativeComponent.ts +17 -0
- package/lib/commonjs/LiquidGlassNativeComponent.ts +8 -0
- package/lib/commonjs/NavigationRail.js +104 -0
- package/lib/commonjs/NavigationRail.js.map +1 -0
- package/lib/commonjs/NavigationRailNativeComponent.ts +107 -0
- package/lib/commonjs/PlatformComponentsProvider.js +18 -0
- package/lib/commonjs/PlatformComponentsProvider.js.map +1 -0
- package/lib/commonjs/SegmentedControl.js +7 -0
- package/lib/commonjs/SegmentedControl.js.map +1 -1
- package/lib/commonjs/SegmentedControlNativeComponent.ts +11 -0
- package/lib/commonjs/SelectionMenu.js +27 -3
- package/lib/commonjs/SelectionMenu.js.map +1 -1
- package/lib/commonjs/SelectionMenuNativeComponent.ts +26 -4
- package/lib/commonjs/SplitButton.js +98 -0
- package/lib/commonjs/SplitButton.js.map +1 -0
- package/lib/commonjs/TabBar.js +203 -0
- package/lib/commonjs/TabBar.js.map +1 -0
- package/lib/commonjs/TabBarAccessoryNativeComponent.ts +19 -0
- package/lib/commonjs/TabBarNativeComponent.ts +145 -0
- package/lib/commonjs/TextField.js +171 -8
- package/lib/commonjs/TextField.js.map +1 -1
- package/lib/commonjs/TextFieldNativeComponent.ts +110 -4
- package/lib/commonjs/focusRegistry.js +2 -1
- package/lib/commonjs/focusRegistry.js.map +1 -1
- package/lib/commonjs/haptics.js +2 -0
- package/lib/commonjs/haptics.js.map +1 -0
- package/lib/commonjs/icons.js +15 -1
- package/lib/commonjs/icons.js.map +1 -1
- package/lib/commonjs/index.js +77 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +156 -92
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/jest.js +910 -0
- package/lib/commonjs/jest.js.map +1 -0
- package/lib/commonjs/menuItems.js +68 -0
- package/lib/commonjs/menuItems.js.map +1 -0
- package/lib/commonjs/selectionIdentifiers.js +18 -0
- package/lib/commonjs/selectionIdentifiers.js.map +1 -0
- package/lib/commonjs/submitBehavior.js +19 -0
- package/lib/commonjs/submitBehavior.js.map +1 -0
- package/lib/commonjs/tabItems.js +49 -0
- package/lib/commonjs/tabItems.js.map +1 -0
- package/lib/commonjs/web/Button.js +170 -0
- package/lib/commonjs/web/Button.js.map +1 -0
- package/lib/commonjs/web/ButtonGroup.js +119 -0
- package/lib/commonjs/web/ButtonGroup.js.map +1 -0
- package/lib/commonjs/web/DatePicker.js +168 -0
- package/lib/commonjs/web/DatePicker.js.map +1 -0
- package/lib/commonjs/web/DateRangePicker.js +137 -0
- package/lib/commonjs/web/DateRangePicker.js.map +1 -0
- package/lib/commonjs/web/Dialog.js +54 -0
- package/lib/commonjs/web/Dialog.js.map +1 -0
- package/lib/commonjs/web/FloatingActionButton.js +98 -0
- package/lib/commonjs/web/FloatingActionButton.js.map +1 -0
- package/lib/commonjs/web/Icon.js +34 -0
- package/lib/commonjs/web/Icon.js.map +1 -0
- package/lib/commonjs/web/NativeTheme.js +28 -0
- package/lib/commonjs/web/NativeTheme.js.map +1 -0
- package/lib/commonjs/web/NavigationRail.js +139 -0
- package/lib/commonjs/web/NavigationRail.js.map +1 -0
- package/lib/commonjs/web/PlatformComponentsProvider.js +51 -0
- package/lib/commonjs/web/PlatformComponentsProvider.js.map +1 -0
- package/lib/commonjs/web/SegmentedControl.js +117 -0
- package/lib/commonjs/web/SegmentedControl.js.map +1 -0
- package/lib/commonjs/web/SelectionMenu.js +142 -0
- package/lib/commonjs/web/SelectionMenu.js.map +1 -0
- package/lib/commonjs/web/SplitButton.js +35 -0
- package/lib/commonjs/web/SplitButton.js.map +1 -0
- package/lib/commonjs/web/TabBar.js +131 -0
- package/lib/commonjs/web/TabBar.js.map +1 -0
- package/lib/commonjs/web/TextField.js +322 -0
- package/lib/commonjs/web/TextField.js.map +1 -0
- package/lib/commonjs/web/components.js +36 -0
- package/lib/commonjs/web/components.js.map +1 -0
- package/lib/commonjs/web/containers.js +121 -0
- package/lib/commonjs/web/containers.js.map +1 -0
- package/lib/commonjs/web/dateInput.js +116 -0
- package/lib/commonjs/web/dateInput.js.map +1 -0
- package/lib/commonjs/web/shared.js +192 -0
- package/lib/commonjs/web/shared.js.map +1 -0
- package/lib/commonjs/webComponents.js +6 -0
- package/lib/commonjs/webComponents.js.map +1 -0
- package/lib/module/Button.js +74 -2
- package/lib/module/Button.js.map +1 -1
- package/lib/module/ButtonGroup.js +13 -3
- package/lib/module/ButtonGroup.js.map +1 -1
- package/lib/module/ButtonGroupNativeComponent.ts +74 -4
- package/lib/module/ButtonNativeComponent.ts +119 -3
- package/lib/module/ContextMenu.js +9 -48
- package/lib/module/ContextMenu.js.map +1 -1
- package/lib/module/ContextMenuNativeComponent.ts +47 -49
- package/lib/module/DatePicker.js +98 -4
- package/lib/module/DatePicker.js.map +1 -1
- package/lib/module/DatePickerNativeComponent.ts +19 -2
- package/lib/module/FloatingActionButton.js +53 -0
- package/lib/module/FloatingActionButton.js.map +1 -0
- package/lib/module/FloatingActionButtonNativeComponent.ts +58 -0
- package/lib/module/FloatingToolbar.js +9 -1
- package/lib/module/FloatingToolbar.js.map +1 -1
- package/lib/module/FloatingToolbarNativeComponent.ts +16 -0
- package/lib/module/LiquidGlass.js +7 -1
- package/lib/module/LiquidGlass.js.map +1 -1
- package/lib/module/LiquidGlassContainer.js +26 -0
- package/lib/module/LiquidGlassContainer.js.map +1 -0
- package/lib/module/LiquidGlassContainerNativeComponent.ts +17 -0
- package/lib/module/LiquidGlassNativeComponent.ts +8 -0
- package/lib/module/NavigationRail.js +99 -0
- package/lib/module/NavigationRail.js.map +1 -0
- package/lib/module/NavigationRailNativeComponent.ts +107 -0
- package/lib/module/PlatformComponentsProvider.js +13 -0
- package/lib/module/PlatformComponentsProvider.js.map +1 -0
- package/lib/module/SegmentedControl.js +9 -1
- package/lib/module/SegmentedControl.js.map +1 -1
- package/lib/module/SegmentedControlNativeComponent.ts +11 -0
- package/lib/module/SelectionMenu.js +27 -3
- package/lib/module/SelectionMenu.js.map +1 -1
- package/lib/module/SelectionMenuNativeComponent.ts +26 -4
- package/lib/module/SplitButton.js +91 -0
- package/lib/module/SplitButton.js.map +1 -0
- package/lib/module/TabBar.js +196 -0
- package/lib/module/TabBar.js.map +1 -0
- package/lib/module/TabBarAccessoryNativeComponent.ts +19 -0
- package/lib/module/TabBarNativeComponent.ts +145 -0
- package/lib/module/TextField.js +172 -9
- package/lib/module/TextField.js.map +1 -1
- package/lib/module/TextFieldNativeComponent.ts +110 -4
- package/lib/module/focusRegistry.js +1 -0
- package/lib/module/focusRegistry.js.map +1 -1
- package/lib/module/haptics.js +2 -0
- package/lib/module/haptics.js.map +1 -0
- package/lib/module/icons.js +15 -1
- package/lib/module/icons.js.map +1 -1
- package/lib/module/index.js +7 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +12 -87
- package/lib/module/index.web.js.map +1 -1
- package/lib/module/jest.js +840 -0
- package/lib/module/jest.js.map +1 -0
- package/lib/module/menuItems.js +65 -0
- package/lib/module/menuItems.js.map +1 -0
- package/lib/module/selectionIdentifiers.js +14 -0
- package/lib/module/selectionIdentifiers.js.map +1 -0
- package/lib/module/submitBehavior.js +15 -0
- package/lib/module/submitBehavior.js.map +1 -0
- package/lib/module/tabItems.js +45 -0
- package/lib/module/tabItems.js.map +1 -0
- package/lib/module/web/Button.js +164 -0
- package/lib/module/web/Button.js.map +1 -0
- package/lib/module/web/ButtonGroup.js +113 -0
- package/lib/module/web/ButtonGroup.js.map +1 -0
- package/lib/module/web/DatePicker.js +162 -0
- package/lib/module/web/DatePicker.js.map +1 -0
- package/lib/module/web/DateRangePicker.js +131 -0
- package/lib/module/web/DateRangePicker.js.map +1 -0
- package/lib/module/web/Dialog.js +48 -0
- package/lib/module/web/Dialog.js.map +1 -0
- package/lib/module/web/FloatingActionButton.js +94 -0
- package/lib/module/web/FloatingActionButton.js.map +1 -0
- package/lib/module/web/Icon.js +29 -0
- package/lib/module/web/Icon.js.map +1 -0
- package/lib/module/web/NativeTheme.js +23 -0
- package/lib/module/web/NativeTheme.js.map +1 -0
- package/lib/module/web/NavigationRail.js +133 -0
- package/lib/module/web/NavigationRail.js.map +1 -0
- package/lib/module/web/PlatformComponentsProvider.js +44 -0
- package/lib/module/web/PlatformComponentsProvider.js.map +1 -0
- package/lib/module/web/SegmentedControl.js +112 -0
- package/lib/module/web/SegmentedControl.js.map +1 -0
- package/lib/module/web/SelectionMenu.js +137 -0
- package/lib/module/web/SelectionMenu.js.map +1 -0
- package/lib/module/web/SplitButton.js +30 -0
- package/lib/module/web/SplitButton.js.map +1 -0
- package/lib/module/web/TabBar.js +126 -0
- package/lib/module/web/TabBar.js.map +1 -0
- package/lib/module/web/TextField.js +316 -0
- package/lib/module/web/TextField.js.map +1 -0
- package/lib/module/web/components.js +33 -0
- package/lib/module/web/components.js.map +1 -0
- package/lib/module/web/containers.js +112 -0
- package/lib/module/web/containers.js.map +1 -0
- package/lib/module/web/dateInput.js +109 -0
- package/lib/module/web/dateInput.js.map +1 -0
- package/lib/module/web/shared.js +179 -0
- package/lib/module/web/shared.js.map +1 -0
- package/lib/module/webComponents.js +4 -0
- package/lib/module/webComponents.js.map +1 -0
- package/lib/typescript/commonjs/docs/sidebars.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/Button.d.ts +111 -3
- package/lib/typescript/commonjs/src/Button.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ButtonGroup.d.ts +21 -6
- package/lib/typescript/commonjs/src/ButtonGroup.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts +64 -3
- package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts +94 -3
- package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ContextMenu.d.ts +20 -33
- package/lib/typescript/commonjs/src/ContextMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ContextMenuNativeComponent.d.ts +45 -47
- package/lib/typescript/commonjs/src/ContextMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/DatePicker.d.ts +74 -1
- package/lib/typescript/commonjs/src/DatePicker.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts +16 -1
- package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/FloatingActionButton.d.ts +67 -0
- package/lib/typescript/commonjs/src/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/FloatingActionButtonNativeComponent.d.ts +43 -0
- package/lib/typescript/commonjs/src/FloatingActionButtonNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/FloatingToolbar.d.ts +30 -0
- package/lib/typescript/commonjs/src/FloatingToolbar.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts +12 -0
- package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/LiquidGlass.d.ts +17 -0
- package/lib/typescript/commonjs/src/LiquidGlass.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/LiquidGlassContainer.d.ts +27 -0
- package/lib/typescript/commonjs/src/LiquidGlassContainer.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/LiquidGlassContainerNativeComponent.d.ts +13 -0
- package/lib/typescript/commonjs/src/LiquidGlassContainerNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/LiquidGlassNativeComponent.d.ts +7 -0
- package/lib/typescript/commonjs/src/LiquidGlassNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/NavigationRail.d.ts +86 -0
- package/lib/typescript/commonjs/src/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/NavigationRailNativeComponent.d.ts +81 -0
- package/lib/typescript/commonjs/src/NavigationRailNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/PlatformComponentsProvider.d.ts +6 -0
- package/lib/typescript/commonjs/src/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/SegmentedControl.d.ts +18 -1
- package/lib/typescript/commonjs/src/SegmentedControl.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts +9 -0
- package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SelectionMenu.d.ts +44 -2
- package/lib/typescript/commonjs/src/SelectionMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SelectionMenuNativeComponent.d.ts +20 -4
- package/lib/typescript/commonjs/src/SelectionMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SplitButton.d.ts +83 -0
- package/lib/typescript/commonjs/src/SplitButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TabBar.d.ts +144 -0
- package/lib/typescript/commonjs/src/TabBar.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TabBarAccessoryNativeComponent.d.ts +13 -0
- package/lib/typescript/commonjs/src/TabBarAccessoryNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TabBarNativeComponent.d.ts +110 -0
- package/lib/typescript/commonjs/src/TabBarNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TextField.d.ts +166 -8
- package/lib/typescript/commonjs/src/TextField.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts +81 -3
- package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/focusRegistry.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/haptics.d.ts +20 -0
- package/lib/typescript/commonjs/src/haptics.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/icons.d.ts +7 -1
- package/lib/typescript/commonjs/src/icons.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/index.d.ts +7 -0
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/index.web.d.ts +25 -254
- package/lib/typescript/commonjs/src/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/jest.d.ts +139 -0
- package/lib/typescript/commonjs/src/jest.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/menuItems.d.ts +100 -0
- package/lib/typescript/commonjs/src/menuItems.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/selectionIdentifiers.d.ts +3 -0
- package/lib/typescript/commonjs/src/selectionIdentifiers.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/submitBehavior.d.ts +9 -0
- package/lib/typescript/commonjs/src/submitBehavior.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/tabItems.d.ts +55 -0
- package/lib/typescript/commonjs/src/tabItems.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/Button.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/Button.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/ButtonGroup.d.ts +11 -0
- package/lib/typescript/commonjs/src/web/ButtonGroup.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/DatePicker.d.ts +14 -0
- package/lib/typescript/commonjs/src/web/DatePicker.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/DateRangePicker.d.ts +11 -0
- package/lib/typescript/commonjs/src/web/DateRangePicker.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/Dialog.d.ts +12 -0
- package/lib/typescript/commonjs/src/web/Dialog.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/FloatingActionButton.d.ts +8 -0
- package/lib/typescript/commonjs/src/web/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/Icon.d.ts +12 -0
- package/lib/typescript/commonjs/src/web/Icon.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/NativeTheme.d.ts +10 -0
- package/lib/typescript/commonjs/src/web/NativeTheme.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/NavigationRail.d.ts +8 -0
- package/lib/typescript/commonjs/src/web/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/PlatformComponentsProvider.d.ts +10 -0
- package/lib/typescript/commonjs/src/web/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/SegmentedControl.d.ts +8 -0
- package/lib/typescript/commonjs/src/web/SegmentedControl.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/SelectionMenu.d.ts +10 -0
- package/lib/typescript/commonjs/src/web/SelectionMenu.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/SplitButton.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/SplitButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/TabBar.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/TabBar.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/TextField.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/TextField.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/components.d.ts +17 -0
- package/lib/typescript/commonjs/src/web/components.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/containers.d.ts +24 -0
- package/lib/typescript/commonjs/src/web/containers.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/dateInput.d.ts +20 -0
- package/lib/typescript/commonjs/src/web/dateInput.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/shared.d.ts +43 -0
- package/lib/typescript/commonjs/src/web/shared.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/webComponents.d.ts +43 -0
- package/lib/typescript/commonjs/src/webComponents.d.ts.map +1 -0
- package/lib/typescript/module/docs/sidebars.d.ts.map +1 -1
- package/lib/typescript/module/src/Button.d.ts +111 -3
- package/lib/typescript/module/src/Button.d.ts.map +1 -1
- package/lib/typescript/module/src/ButtonGroup.d.ts +21 -6
- package/lib/typescript/module/src/ButtonGroup.d.ts.map +1 -1
- package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts +64 -3
- package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/ButtonNativeComponent.d.ts +94 -3
- package/lib/typescript/module/src/ButtonNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/ContextMenu.d.ts +20 -33
- package/lib/typescript/module/src/ContextMenu.d.ts.map +1 -1
- package/lib/typescript/module/src/ContextMenuNativeComponent.d.ts +45 -47
- package/lib/typescript/module/src/ContextMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/DatePicker.d.ts +74 -1
- package/lib/typescript/module/src/DatePicker.d.ts.map +1 -1
- package/lib/typescript/module/src/DatePickerNativeComponent.d.ts +16 -1
- package/lib/typescript/module/src/DatePickerNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/FloatingActionButton.d.ts +67 -0
- package/lib/typescript/module/src/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/module/src/FloatingActionButtonNativeComponent.d.ts +43 -0
- package/lib/typescript/module/src/FloatingActionButtonNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/FloatingToolbar.d.ts +30 -0
- package/lib/typescript/module/src/FloatingToolbar.d.ts.map +1 -1
- package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts +12 -0
- package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/LiquidGlass.d.ts +17 -0
- package/lib/typescript/module/src/LiquidGlass.d.ts.map +1 -1
- package/lib/typescript/module/src/LiquidGlassContainer.d.ts +27 -0
- package/lib/typescript/module/src/LiquidGlassContainer.d.ts.map +1 -0
- package/lib/typescript/module/src/LiquidGlassContainerNativeComponent.d.ts +13 -0
- package/lib/typescript/module/src/LiquidGlassContainerNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/LiquidGlassNativeComponent.d.ts +7 -0
- package/lib/typescript/module/src/LiquidGlassNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/NavigationRail.d.ts +86 -0
- package/lib/typescript/module/src/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/module/src/NavigationRailNativeComponent.d.ts +81 -0
- package/lib/typescript/module/src/NavigationRailNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/PlatformComponentsProvider.d.ts +6 -0
- package/lib/typescript/module/src/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/module/src/SegmentedControl.d.ts +18 -1
- package/lib/typescript/module/src/SegmentedControl.d.ts.map +1 -1
- package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts +9 -0
- package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/SelectionMenu.d.ts +44 -2
- package/lib/typescript/module/src/SelectionMenu.d.ts.map +1 -1
- package/lib/typescript/module/src/SelectionMenuNativeComponent.d.ts +20 -4
- package/lib/typescript/module/src/SelectionMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/SplitButton.d.ts +83 -0
- package/lib/typescript/module/src/SplitButton.d.ts.map +1 -0
- package/lib/typescript/module/src/TabBar.d.ts +144 -0
- package/lib/typescript/module/src/TabBar.d.ts.map +1 -0
- package/lib/typescript/module/src/TabBarAccessoryNativeComponent.d.ts +13 -0
- package/lib/typescript/module/src/TabBarAccessoryNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/TabBarNativeComponent.d.ts +110 -0
- package/lib/typescript/module/src/TabBarNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/TextField.d.ts +166 -8
- package/lib/typescript/module/src/TextField.d.ts.map +1 -1
- package/lib/typescript/module/src/TextFieldNativeComponent.d.ts +81 -3
- package/lib/typescript/module/src/TextFieldNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/focusRegistry.d.ts.map +1 -1
- package/lib/typescript/module/src/haptics.d.ts +20 -0
- package/lib/typescript/module/src/haptics.d.ts.map +1 -0
- package/lib/typescript/module/src/icons.d.ts +7 -1
- package/lib/typescript/module/src/icons.d.ts.map +1 -1
- package/lib/typescript/module/src/index.d.ts +7 -0
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/index.web.d.ts +25 -254
- package/lib/typescript/module/src/index.web.d.ts.map +1 -1
- package/lib/typescript/module/src/jest.d.ts +139 -0
- package/lib/typescript/module/src/jest.d.ts.map +1 -0
- package/lib/typescript/module/src/menuItems.d.ts +100 -0
- package/lib/typescript/module/src/menuItems.d.ts.map +1 -0
- package/lib/typescript/module/src/selectionIdentifiers.d.ts +3 -0
- package/lib/typescript/module/src/selectionIdentifiers.d.ts.map +1 -0
- package/lib/typescript/module/src/submitBehavior.d.ts +9 -0
- package/lib/typescript/module/src/submitBehavior.d.ts.map +1 -0
- package/lib/typescript/module/src/tabItems.d.ts +55 -0
- package/lib/typescript/module/src/tabItems.d.ts.map +1 -0
- package/lib/typescript/module/src/web/Button.d.ts +9 -0
- package/lib/typescript/module/src/web/Button.d.ts.map +1 -0
- package/lib/typescript/module/src/web/ButtonGroup.d.ts +11 -0
- package/lib/typescript/module/src/web/ButtonGroup.d.ts.map +1 -0
- package/lib/typescript/module/src/web/DatePicker.d.ts +14 -0
- package/lib/typescript/module/src/web/DatePicker.d.ts.map +1 -0
- package/lib/typescript/module/src/web/DateRangePicker.d.ts +11 -0
- package/lib/typescript/module/src/web/DateRangePicker.d.ts.map +1 -0
- package/lib/typescript/module/src/web/Dialog.d.ts +12 -0
- package/lib/typescript/module/src/web/Dialog.d.ts.map +1 -0
- package/lib/typescript/module/src/web/FloatingActionButton.d.ts +8 -0
- package/lib/typescript/module/src/web/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/module/src/web/Icon.d.ts +12 -0
- package/lib/typescript/module/src/web/Icon.d.ts.map +1 -0
- package/lib/typescript/module/src/web/NativeTheme.d.ts +10 -0
- package/lib/typescript/module/src/web/NativeTheme.d.ts.map +1 -0
- package/lib/typescript/module/src/web/NavigationRail.d.ts +8 -0
- package/lib/typescript/module/src/web/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/module/src/web/PlatformComponentsProvider.d.ts +10 -0
- package/lib/typescript/module/src/web/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/module/src/web/SegmentedControl.d.ts +8 -0
- package/lib/typescript/module/src/web/SegmentedControl.d.ts.map +1 -0
- package/lib/typescript/module/src/web/SelectionMenu.d.ts +10 -0
- package/lib/typescript/module/src/web/SelectionMenu.d.ts.map +1 -0
- package/lib/typescript/module/src/web/SplitButton.d.ts +9 -0
- package/lib/typescript/module/src/web/SplitButton.d.ts.map +1 -0
- package/lib/typescript/module/src/web/TabBar.d.ts +9 -0
- package/lib/typescript/module/src/web/TabBar.d.ts.map +1 -0
- package/lib/typescript/module/src/web/TextField.d.ts +9 -0
- package/lib/typescript/module/src/web/TextField.d.ts.map +1 -0
- package/lib/typescript/module/src/web/components.d.ts +17 -0
- package/lib/typescript/module/src/web/components.d.ts.map +1 -0
- package/lib/typescript/module/src/web/containers.d.ts +24 -0
- package/lib/typescript/module/src/web/containers.d.ts.map +1 -0
- package/lib/typescript/module/src/web/dateInput.d.ts +20 -0
- package/lib/typescript/module/src/web/dateInput.d.ts.map +1 -0
- package/lib/typescript/module/src/web/shared.d.ts +43 -0
- package/lib/typescript/module/src/web/shared.d.ts.map +1 -0
- package/lib/typescript/module/src/webComponents.d.ts +43 -0
- package/lib/typescript/module/src/webComponents.d.ts.map +1 -0
- package/package.json +32 -2
- package/plugin/build/index.cjs +79 -6
- package/plugin/build/index.d.ts +27 -2
- package/plugin/build/index.d.ts.map +1 -1
- package/plugin/tsconfig.json +2 -1
- package/react-native.config.js +3 -0
- package/shared/PCFloatingActionButtonComponentDescriptors-custom.h +22 -0
- package/shared/PCFloatingActionButtonShadowNode-custom.cpp +48 -0
- package/shared/PCFloatingActionButtonShadowNode-custom.h +54 -0
- package/shared/PCFloatingActionButtonState-custom.h +61 -0
- package/shared/PCNavigationRailComponentDescriptors-custom.h +47 -0
- package/shared/PCNavigationRailShadowNode-custom.h +42 -0
- package/shared/PCNavigationRailState-custom.h +62 -0
- package/shared/PCTabBarComponentDescriptors-custom.h +22 -0
- package/shared/PCTabBarShadowNode-custom.cpp +54 -0
- package/shared/PCTabBarShadowNode-custom.h +54 -0
- package/shared/PCTabBarState-custom.h +62 -0
- package/shared/react/renderer/components/PlatformComponentsViewSpec/ComponentDescriptors.h +3 -0
- package/src/Button.tsx +222 -7
- package/src/ButtonGroup.tsx +29 -11
- package/src/ButtonGroupNativeComponent.ts +74 -4
- package/src/ButtonNativeComponent.ts +119 -3
- package/src/ContextMenu.tsx +34 -81
- package/src/ContextMenuNativeComponent.ts +47 -49
- package/src/DatePicker.tsx +182 -4
- package/src/DatePickerNativeComponent.ts +19 -2
- package/src/FloatingActionButton.tsx +121 -0
- package/src/FloatingActionButtonNativeComponent.ts +58 -0
- package/src/FloatingToolbar.tsx +54 -3
- package/src/FloatingToolbarNativeComponent.ts +16 -0
- package/src/LiquidGlass.tsx +24 -1
- package/src/LiquidGlassContainer.tsx +42 -0
- package/src/LiquidGlassContainerNativeComponent.ts +17 -0
- package/src/LiquidGlassNativeComponent.ts +8 -0
- package/src/NavigationRail.tsx +203 -0
- package/src/NavigationRailNativeComponent.ts +107 -0
- package/src/PlatformComponentsProvider.tsx +15 -0
- package/src/SegmentedControl.tsx +31 -1
- package/src/SegmentedControlNativeComponent.ts +11 -0
- package/src/SelectionMenu.tsx +81 -6
- package/src/SelectionMenuNativeComponent.ts +26 -4
- package/src/SplitButton.tsx +198 -0
- package/src/TabBar.tsx +373 -0
- package/src/TabBarAccessoryNativeComponent.ts +19 -0
- package/src/TabBarNativeComponent.ts +145 -0
- package/src/TextField.tsx +428 -14
- package/src/TextFieldNativeComponent.ts +110 -4
- package/src/focusRegistry.ts +1 -0
- package/src/haptics.ts +31 -0
- package/src/icons.ts +28 -1
- package/src/index.tsx +7 -0
- package/src/index.web.tsx +51 -391
- package/src/jest.tsx +958 -0
- package/src/menuItems.ts +152 -0
- package/src/selectionIdentifiers.ts +17 -0
- package/src/submitBehavior.ts +16 -0
- package/src/tabItems.ts +113 -0
- package/src/web/Button.tsx +201 -0
- package/src/web/ButtonGroup.tsx +154 -0
- package/src/web/DatePicker.tsx +204 -0
- package/src/web/DateRangePicker.tsx +135 -0
- package/src/web/Dialog.tsx +54 -0
- package/src/web/FloatingActionButton.tsx +76 -0
- package/src/web/Icon.tsx +33 -0
- package/src/web/NativeTheme.ts +23 -0
- package/src/web/NavigationRail.tsx +148 -0
- package/src/web/PlatformComponentsProvider.tsx +48 -0
- package/src/web/SegmentedControl.tsx +127 -0
- package/src/web/SelectionMenu.tsx +149 -0
- package/src/web/SplitButton.tsx +32 -0
- package/src/web/TabBar.tsx +150 -0
- package/src/web/TextField.tsx +361 -0
- package/src/web/components.tsx +71 -0
- package/src/web/containers.tsx +130 -0
- package/src/web/dateInput.ts +137 -0
- package/src/web/shared.ts +176 -0
- package/src/webComponents.ts +45 -0
- 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
|
-
|
|
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
|
}
|
|
@@ -17,9 +17,14 @@ import com.google.android.material.button.MaterialButton
|
|
|
17
17
|
object PCExpressive {
|
|
18
18
|
enum class Variant { FILLED, TONAL, OUTLINED, TEXT, ELEVATED }
|
|
19
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
|
+
*/
|
|
20
25
|
fun parseVariant(value: String?): Variant =
|
|
21
26
|
when (value) {
|
|
22
|
-
"tonal" -> Variant.TONAL
|
|
27
|
+
"tonal", "glass", "clearGlass" -> Variant.TONAL
|
|
23
28
|
"outlined" -> Variant.OUTLINED
|
|
24
29
|
"text" -> Variant.TEXT
|
|
25
30
|
"elevated" -> Variant.ELEVATED
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
package com.platformcomponents
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Arguments
|
|
4
|
+
import com.facebook.react.bridge.ReadableMap
|
|
5
|
+
import com.facebook.react.bridge.WritableMap
|
|
6
|
+
import com.facebook.react.uimanager.ReactStylesDiffMap
|
|
7
|
+
import com.facebook.react.uimanager.SimpleViewManager
|
|
8
|
+
import com.facebook.react.uimanager.StateWrapper
|
|
9
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
10
|
+
import com.facebook.react.uimanager.UIManagerHelper
|
|
11
|
+
import com.facebook.react.uimanager.ViewManagerDelegate
|
|
12
|
+
import com.facebook.react.uimanager.events.Event
|
|
13
|
+
import com.facebook.react.viewmanagers.PCFloatingActionButtonManagerDelegate
|
|
14
|
+
import com.facebook.react.viewmanagers.PCFloatingActionButtonManagerInterface
|
|
15
|
+
|
|
16
|
+
class PCFloatingActionButtonViewManager :
|
|
17
|
+
SimpleViewManager<PCFloatingActionButtonView>(),
|
|
18
|
+
PCFloatingActionButtonManagerInterface<PCFloatingActionButtonView> {
|
|
19
|
+
|
|
20
|
+
private val delegate: ViewManagerDelegate<PCFloatingActionButtonView> =
|
|
21
|
+
PCFloatingActionButtonManagerDelegate(this)
|
|
22
|
+
|
|
23
|
+
override fun getName(): String = "PCFloatingActionButton"
|
|
24
|
+
|
|
25
|
+
override fun getDelegate(): ViewManagerDelegate<PCFloatingActionButtonView> = delegate
|
|
26
|
+
|
|
27
|
+
override fun createViewInstance(reactContext: ThemedReactContext): PCFloatingActionButtonView =
|
|
28
|
+
PCFloatingActionButtonView(reactContext)
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Pass the StateWrapper to the view so it can update Fabric state with its
|
|
32
|
+
* size, and report it right away so the first layout already fits.
|
|
33
|
+
*/
|
|
34
|
+
override fun updateState(
|
|
35
|
+
view: PCFloatingActionButtonView,
|
|
36
|
+
props: ReactStylesDiffMap,
|
|
37
|
+
stateWrapper: StateWrapper
|
|
38
|
+
): Any? {
|
|
39
|
+
view.stateWrapper = stateWrapper
|
|
40
|
+
view.reportIntrinsicSize()
|
|
41
|
+
return null
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
override fun addEventEmitters(reactContext: ThemedReactContext, view: PCFloatingActionButtonView) {
|
|
45
|
+
view.onPress = {
|
|
46
|
+
PCHaptics.perform(view, view.haptics)
|
|
47
|
+
UIManagerHelper.getEventDispatcherForReactTag(reactContext, view.id)?.dispatchEvent(
|
|
48
|
+
PressEvent(UIManagerHelper.getSurfaceId(view), view.id)
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// icon: {iconType, iconName, iconUri, iconScale, iconTinted}
|
|
54
|
+
override fun setIcon(view: PCFloatingActionButtonView, value: ReadableMap?) {
|
|
55
|
+
view.applyIcon(PCButtonSupport.parseIcon(value))
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
override fun setLabel(view: PCFloatingActionButtonView, value: String?) {
|
|
59
|
+
view.applyLabel(value ?: "")
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// "small" | "regular" | "medium" | "large"
|
|
63
|
+
override fun setSize(view: PCFloatingActionButtonView, value: String?) {
|
|
64
|
+
view.applySize(value)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// "true" | "false"
|
|
68
|
+
override fun setExtended(view: PCFloatingActionButtonView, value: String?) {
|
|
69
|
+
view.applyExtended(value != "false")
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Colors arrive already processed by React Native (ARGB ints)
|
|
73
|
+
override fun setColor(view: PCFloatingActionButtonView, value: Int?) {
|
|
74
|
+
view.applyColors(value, view.foregroundColor)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
override fun setForegroundColor(view: PCFloatingActionButtonView, value: Int?) {
|
|
78
|
+
view.applyColors(view.containerColor, value)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
override fun setInteractivity(view: PCFloatingActionButtonView, value: String?) {
|
|
82
|
+
view.applyInteractivity(value)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
override fun setSpokenLabel(view: PCFloatingActionButtonView, value: String?) {
|
|
86
|
+
view.applySpokenLabel(value ?: "")
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// "" (none added) | "none" | "selection" | "light" | "medium" | "heavy" | "success" | "warning" | "error"
|
|
90
|
+
override fun setHaptics(view: PCFloatingActionButtonView, value: String?) {
|
|
91
|
+
view.haptics = PCHaptics.configure(view, value)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
override fun setScrollViewNativeID(view: PCFloatingActionButtonView, value: String?) {
|
|
95
|
+
view.applyScrollViewNativeID(value ?: "")
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// --- Events ---
|
|
99
|
+
|
|
100
|
+
private class PressEvent(surfaceId: Int, viewTag: Int) : Event<PressEvent>(surfaceId, viewTag) {
|
|
101
|
+
// Every press counts; two quick presses must not merge into one
|
|
102
|
+
override fun canCoalesce(): Boolean = false
|
|
103
|
+
|
|
104
|
+
override fun getEventName(): String = "topFabPress"
|
|
105
|
+
|
|
106
|
+
// Fabric reads the payload from here
|
|
107
|
+
override fun getEventData(): WritableMap = Arguments.createMap()
|
|
108
|
+
}
|
|
109
|
+
}
|