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