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,42 @@
|
|
|
1
|
+
// LiquidGlassContainer.tsx
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import type { ViewProps } from 'react-native';
|
|
4
|
+
|
|
5
|
+
import NativeLiquidGlassContainer from './LiquidGlassContainerNativeComponent';
|
|
6
|
+
|
|
7
|
+
export interface LiquidGlassContainerProps extends ViewProps {
|
|
8
|
+
/**
|
|
9
|
+
* How far apart the `LiquidGlass` views inside can be and still merge
|
|
10
|
+
* (`UIGlassContainerEffect.spacing`); larger values blend glass across
|
|
11
|
+
* wider gaps. iOS 26 only.
|
|
12
|
+
*
|
|
13
|
+
* Default: the system's, 0 on iOS 26, where glass doesn't merge across
|
|
14
|
+
* gaps.
|
|
15
|
+
*/
|
|
16
|
+
spacing?: number;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Content, with the `LiquidGlass` views that merge. They don't have to be
|
|
20
|
+
* direct children.
|
|
21
|
+
*/
|
|
22
|
+
children?: React.ReactNode;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Groups `LiquidGlass` views so they render as one glass on iOS 26
|
|
27
|
+
* (`UIVisualEffectView` with a `UIGlassContainerEffect`): neighbours within
|
|
28
|
+
* `spacing` blend together, and glass that appears, disappears or changes
|
|
29
|
+
* frame morphs in and out of its neighbours. A plain container on Android,
|
|
30
|
+
* on older iOS and on web.
|
|
31
|
+
*/
|
|
32
|
+
export function LiquidGlassContainer(
|
|
33
|
+
props: LiquidGlassContainerProps
|
|
34
|
+
): React.ReactElement {
|
|
35
|
+
const { spacing, children, ...viewProps } = props;
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<NativeLiquidGlassContainer spacing={spacing ?? -1} {...viewProps}>
|
|
39
|
+
{children}
|
|
40
|
+
</NativeLiquidGlassContainer>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// LiquidGlassContainerNativeComponent.ts
|
|
2
|
+
import type { HostComponent, ViewProps } from 'react-native';
|
|
3
|
+
import { codegenNativeComponent } from 'react-native';
|
|
4
|
+
import type { Float, WithDefault } from './codegenTypes';
|
|
5
|
+
|
|
6
|
+
export interface LiquidGlassContainerNativeProps extends ViewProps {
|
|
7
|
+
/**
|
|
8
|
+
* Distance between glass elements at which they begin to merge
|
|
9
|
+
* (UIGlassContainerEffect.spacing). Negative keeps the system default.
|
|
10
|
+
* @default -1
|
|
11
|
+
*/
|
|
12
|
+
spacing?: WithDefault<Float, -1>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export default codegenNativeComponent<LiquidGlassContainerNativeProps>(
|
|
16
|
+
'PCLiquidGlassContainer'
|
|
17
|
+
) as HostComponent<LiquidGlassContainerNativeProps>;
|
|
@@ -78,6 +78,14 @@ export interface LiquidGlassNativeProps extends ViewProps {
|
|
|
78
78
|
*/
|
|
79
79
|
cornerRadius?: WithDefault<Float, 0>;
|
|
80
80
|
|
|
81
|
+
/**
|
|
82
|
+
* Corner shape: 'capsule' | 'concentric' | '' (the cornerRadius).
|
|
83
|
+
* On iOS 26 it maps to UIView.cornerConfiguration; elsewhere 'capsule'
|
|
84
|
+
* rounds to half the shorter side and 'concentric' uses cornerRadius.
|
|
85
|
+
* @default ''
|
|
86
|
+
*/
|
|
87
|
+
cornerStyle?: WithDefault<string, ''>;
|
|
88
|
+
|
|
81
89
|
/**
|
|
82
90
|
* iOS-specific props.
|
|
83
91
|
*/
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// NavigationRail.tsx
|
|
2
|
+
import React, { useCallback, useMemo } from 'react';
|
|
3
|
+
import {
|
|
4
|
+
StyleSheet,
|
|
5
|
+
View,
|
|
6
|
+
type ColorValue,
|
|
7
|
+
type NativeSyntheticEvent,
|
|
8
|
+
type ViewProps,
|
|
9
|
+
} from 'react-native';
|
|
10
|
+
|
|
11
|
+
import NativeNavigationRail, {
|
|
12
|
+
type NavigationRailSelectEvent,
|
|
13
|
+
} from './NavigationRailNativeComponent';
|
|
14
|
+
import type { Haptics } from './haptics';
|
|
15
|
+
import { normalizeLabelStyle, type LabelStyle } from './labelStyle';
|
|
16
|
+
import type { TabBarBadgeStyle, TabBarLabelVisibility } from './TabBar';
|
|
17
|
+
import { toNativeTabItems, type TabBarItemProps } from './tabItems';
|
|
18
|
+
|
|
19
|
+
/** The collapsed Material rail shows at most seven destinations. */
|
|
20
|
+
const MAX_COLLAPSED_ITEMS = 7;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* A destination: the same item as a TabBar tab. `role: 'search'` gives a
|
|
24
|
+
* destination without an icon the search icon; `systemItem` is TabBar only.
|
|
25
|
+
*/
|
|
26
|
+
export type NavigationRailItemProps = TabBarItemProps;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Where the destinations sit in the rail's height, below the header.
|
|
30
|
+
* Android: `NavigationRailView.setMenuGravity`.
|
|
31
|
+
*/
|
|
32
|
+
export type NavigationRailMenuGravity = 'top' | 'center' | 'bottom';
|
|
33
|
+
|
|
34
|
+
export interface NavigationRailProps extends ViewProps {
|
|
35
|
+
/**
|
|
36
|
+
* The destinations. The collapsed Android rail shows seven; the expanded
|
|
37
|
+
* rail and the iOS fallback show all of them.
|
|
38
|
+
*/
|
|
39
|
+
items: readonly NavigationRailItemProps[];
|
|
40
|
+
|
|
41
|
+
/** Selected destination's `value`; `null` for none. */
|
|
42
|
+
selectedValue: string | null;
|
|
43
|
+
|
|
44
|
+
/** Called when the user selects a destination. */
|
|
45
|
+
onSelect?: (value: string, index: number) => void;
|
|
46
|
+
|
|
47
|
+
/** Called when the user presses the destination that is already selected. */
|
|
48
|
+
onReselect?: (value: string, index: number) => void;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Haptic played when the user presses a destination, including the
|
|
52
|
+
* selected one (a reselect), as on TabBar. Default: none, like the native
|
|
53
|
+
* rail. See {@link Haptics}.
|
|
54
|
+
*/
|
|
55
|
+
haptics?: Haptics;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* How labels show. Default: `'auto'`, which labels every destination;
|
|
59
|
+
* `'selected'` labels only the selected one, `'unlabeled'` none.
|
|
60
|
+
*/
|
|
61
|
+
labelVisibility?: TabBarLabelVisibility;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Where the destinations sit: at the top below the header (default), in
|
|
65
|
+
* the middle, or at the bottom.
|
|
66
|
+
*/
|
|
67
|
+
menuGravity?: NavigationRailMenuGravity;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The expanded rail: wider, with the labels beside the icons. Changing it
|
|
71
|
+
* animates. Android: `NavigationRailView.expand()` / `collapse()`, the
|
|
72
|
+
* Material 3 Expressive expanded rail. iOS: the buttons put the icon
|
|
73
|
+
* before the label.
|
|
74
|
+
*/
|
|
75
|
+
expanded?: boolean;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Shown above the destinations, usually a FloatingActionButton or a
|
|
79
|
+
* Button. Android: the rail's header view (`addHeaderView`).
|
|
80
|
+
*/
|
|
81
|
+
header?: React.ReactNode;
|
|
82
|
+
|
|
83
|
+
/** Icon and label color of the selected destination. */
|
|
84
|
+
activeTintColor?: ColorValue;
|
|
85
|
+
|
|
86
|
+
/** Icon and label color of the other destinations. */
|
|
87
|
+
inactiveTintColor?: ColorValue;
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Background of the rail. Default: the Material surface on Android, none
|
|
91
|
+
* on iOS.
|
|
92
|
+
*/
|
|
93
|
+
railColor?: ColorValue;
|
|
94
|
+
|
|
95
|
+
/** Colors for the badges. */
|
|
96
|
+
badgeStyle?: TabBarBadgeStyle;
|
|
97
|
+
|
|
98
|
+
/** Label font. */
|
|
99
|
+
labelStyle?: LabelStyle;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Largest scale the labels may reach with the system font scale, as on
|
|
103
|
+
* `Text`. Unset or `0`: no cap.
|
|
104
|
+
*/
|
|
105
|
+
maxFontSizeMultiplier?: number;
|
|
106
|
+
|
|
107
|
+
/** Android-specific configuration. */
|
|
108
|
+
android?: {
|
|
109
|
+
/** Color of the active indicator behind the selected icon. */
|
|
110
|
+
indicatorColor?: ColorValue;
|
|
111
|
+
|
|
112
|
+
/** Ripple shown while pressing a destination. */
|
|
113
|
+
rippleColor?: ColorValue;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/** Test identifier of the rail. */
|
|
117
|
+
testID?: string;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function NavigationRail(props: NavigationRailProps): React.ReactElement {
|
|
121
|
+
const {
|
|
122
|
+
items,
|
|
123
|
+
selectedValue,
|
|
124
|
+
onSelect,
|
|
125
|
+
onReselect,
|
|
126
|
+
haptics,
|
|
127
|
+
labelVisibility,
|
|
128
|
+
menuGravity,
|
|
129
|
+
expanded,
|
|
130
|
+
header,
|
|
131
|
+
activeTintColor,
|
|
132
|
+
inactiveTintColor,
|
|
133
|
+
railColor,
|
|
134
|
+
badgeStyle,
|
|
135
|
+
labelStyle,
|
|
136
|
+
maxFontSizeMultiplier,
|
|
137
|
+
android,
|
|
138
|
+
...viewProps
|
|
139
|
+
} = props;
|
|
140
|
+
|
|
141
|
+
if (__DEV__ && items.length > MAX_COLLAPSED_ITEMS) {
|
|
142
|
+
console.warn(
|
|
143
|
+
`NavigationRail: ${items.length} destinations given; the collapsed Material rail shows at most ${MAX_COLLAPSED_ITEMS}.`
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// The expanded rail shows every destination
|
|
148
|
+
const nativeItems = useMemo(
|
|
149
|
+
() => toNativeTabItems(items, items.length),
|
|
150
|
+
[items]
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
const handleItemPress = useCallback(
|
|
154
|
+
(event: NativeSyntheticEvent<NavigationRailSelectEvent>) => {
|
|
155
|
+
const { index, value, reselected } = event.nativeEvent;
|
|
156
|
+
if (reselected === 'true') {
|
|
157
|
+
onReselect?.(value, index);
|
|
158
|
+
} else {
|
|
159
|
+
onSelect?.(value, index);
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
[onSelect, onReselect]
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
const nativeLabelStyle = useMemo(
|
|
166
|
+
() => normalizeLabelStyle(labelStyle),
|
|
167
|
+
[labelStyle]
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
return (
|
|
171
|
+
<NativeNavigationRail
|
|
172
|
+
items={nativeItems}
|
|
173
|
+
selectedValue={selectedValue ?? ''}
|
|
174
|
+
labelVisibility={labelVisibility ?? 'auto'}
|
|
175
|
+
menuGravity={menuGravity ?? 'top'}
|
|
176
|
+
expanded={expanded ? 'true' : 'false'}
|
|
177
|
+
activeTintColor={activeTintColor}
|
|
178
|
+
inactiveTintColor={inactiveTintColor}
|
|
179
|
+
railColor={railColor}
|
|
180
|
+
badgeBackgroundColor={badgeStyle?.backgroundColor}
|
|
181
|
+
badgeTextColor={badgeStyle?.color}
|
|
182
|
+
labelStyle={nativeLabelStyle}
|
|
183
|
+
maxFontSizeMultiplier={maxFontSizeMultiplier ?? 0}
|
|
184
|
+
androidIndicatorColor={android?.indicatorColor}
|
|
185
|
+
androidRippleColor={android?.rippleColor}
|
|
186
|
+
haptics={haptics ?? ''}
|
|
187
|
+
onItemPress={onSelect || onReselect ? handleItemPress : undefined}
|
|
188
|
+
{...viewProps}
|
|
189
|
+
>
|
|
190
|
+
{header ? (
|
|
191
|
+
// Native places the header; out of the flow, it leaves the rail's
|
|
192
|
+
// width to native
|
|
193
|
+
<View collapsable={false} style={styles.header}>
|
|
194
|
+
{header}
|
|
195
|
+
</View>
|
|
196
|
+
) : null}
|
|
197
|
+
</NativeNavigationRail>
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const styles = StyleSheet.create({
|
|
202
|
+
header: { position: 'absolute', left: 0, top: 0 },
|
|
203
|
+
});
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// NavigationRailNativeComponent.ts
|
|
2
|
+
import type { ColorValue, HostComponent, ViewProps } from 'react-native';
|
|
3
|
+
import { codegenNativeComponent } from 'react-native';
|
|
4
|
+
import type {
|
|
5
|
+
BubblingEventHandler,
|
|
6
|
+
Double,
|
|
7
|
+
Int32,
|
|
8
|
+
WithDefault,
|
|
9
|
+
} from './codegenTypes';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A destination: the fields of a TabBar tab (see tabItems.ts). Icons are
|
|
13
|
+
* pre-resolved on the JS side (see icons.ts), the selected icon under the
|
|
14
|
+
* `selected…` fields; empty strings mean "none".
|
|
15
|
+
*/
|
|
16
|
+
export type NavigationRailItem = Readonly<{
|
|
17
|
+
label: string;
|
|
18
|
+
value: string;
|
|
19
|
+
disabled: string; // 'enabled' | 'disabled'
|
|
20
|
+
iconType: string; // '' | 'sfSymbol' | 'drawable' | 'image'
|
|
21
|
+
iconName: string;
|
|
22
|
+
iconRequest: string;
|
|
23
|
+
iconUri: string;
|
|
24
|
+
iconScale: Double;
|
|
25
|
+
iconTinted: string; // 'true' | 'false'
|
|
26
|
+
selectedIconType: string;
|
|
27
|
+
selectedIconName: string;
|
|
28
|
+
selectedIconRequest: string;
|
|
29
|
+
selectedIconUri: string;
|
|
30
|
+
selectedIconScale: Double;
|
|
31
|
+
selectedIconTinted: string;
|
|
32
|
+
badge: string; // badge text, '' = no badge, ' ' = a dot
|
|
33
|
+
accessibilityLabel: string; // '' = the label
|
|
34
|
+
testID: string; // '' = none
|
|
35
|
+
role: string; // '' | 'search'
|
|
36
|
+
systemItem: string; // TabBar only; ignored
|
|
37
|
+
}>;
|
|
38
|
+
|
|
39
|
+
/** A press on a destination. `reselected` is 'true' when it was already selected. */
|
|
40
|
+
export type NavigationRailSelectEvent = Readonly<{
|
|
41
|
+
index: Int32;
|
|
42
|
+
value: string;
|
|
43
|
+
reselected: string; // 'true' | 'false'
|
|
44
|
+
}>;
|
|
45
|
+
|
|
46
|
+
/** Label font. Empty strings / 0 mean "platform default". */
|
|
47
|
+
export type NavigationRailLabelStyleProps = Readonly<{
|
|
48
|
+
fontFamily?: string;
|
|
49
|
+
fontSize?: Double;
|
|
50
|
+
fontWeight?: string;
|
|
51
|
+
fontStyle?: string;
|
|
52
|
+
}>;
|
|
53
|
+
|
|
54
|
+
export interface NavigationRailNativeProps extends ViewProps {
|
|
55
|
+
/** The destinations. */
|
|
56
|
+
items: ReadonlyArray<NavigationRailItem>;
|
|
57
|
+
|
|
58
|
+
/** Selected destination by value; '' = none. */
|
|
59
|
+
selectedValue?: WithDefault<string, ''>;
|
|
60
|
+
|
|
61
|
+
/** 'auto' | 'labeled' | 'selected' | 'unlabeled' */
|
|
62
|
+
labelVisibility?: string;
|
|
63
|
+
|
|
64
|
+
/** 'top' | 'center' | 'bottom' */
|
|
65
|
+
menuGravity?: string;
|
|
66
|
+
|
|
67
|
+
/** 'true' | 'false': the expanded rail (Android). */
|
|
68
|
+
expanded?: string;
|
|
69
|
+
|
|
70
|
+
/** Icon and label color of the selected destination. */
|
|
71
|
+
activeTintColor?: ColorValue;
|
|
72
|
+
|
|
73
|
+
/** Icon and label color of the other destinations. */
|
|
74
|
+
inactiveTintColor?: ColorValue;
|
|
75
|
+
|
|
76
|
+
/** Rail background. */
|
|
77
|
+
railColor?: ColorValue;
|
|
78
|
+
|
|
79
|
+
/** Badge colors. */
|
|
80
|
+
badgeBackgroundColor?: ColorValue;
|
|
81
|
+
badgeTextColor?: ColorValue;
|
|
82
|
+
|
|
83
|
+
/** Label font. */
|
|
84
|
+
labelStyle?: NavigationRailLabelStyleProps;
|
|
85
|
+
|
|
86
|
+
/** Largest font scale the labels may reach; 0 = no cap. */
|
|
87
|
+
maxFontSizeMultiplier?: Double;
|
|
88
|
+
|
|
89
|
+
/** Android: the active indicator behind the selected icon. */
|
|
90
|
+
androidIndicatorColor?: ColorValue;
|
|
91
|
+
|
|
92
|
+
/** Android: ripple shown while pressing a destination. */
|
|
93
|
+
androidRippleColor?: ColorValue;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Haptic played when a destination is pressed: '' (none added) | 'none' | 'selection' |
|
|
97
|
+
* 'light' | 'medium' | 'heavy' | 'success' | 'warning' | 'error'
|
|
98
|
+
*/
|
|
99
|
+
haptics?: string;
|
|
100
|
+
|
|
101
|
+
/** Fired when a destination is pressed. */
|
|
102
|
+
onItemPress?: BubblingEventHandler<NavigationRailSelectEvent>;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export default codegenNativeComponent<NavigationRailNativeProps>(
|
|
106
|
+
'PCNavigationRail'
|
|
107
|
+
) as HostComponent<NavigationRailNativeProps>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { PlatformComponentsProviderProps } from './webComponents';
|
|
3
|
+
|
|
4
|
+
export type {
|
|
5
|
+
PlatformComponentsProviderProps,
|
|
6
|
+
WebComponents,
|
|
7
|
+
WebComponentProps,
|
|
8
|
+
} from './webComponents';
|
|
9
|
+
|
|
10
|
+
/** Web registrations do not replace native controls on iOS or Android. */
|
|
11
|
+
export function PlatformComponentsProvider({
|
|
12
|
+
children,
|
|
13
|
+
}: PlatformComponentsProviderProps): React.ReactElement {
|
|
14
|
+
return <>{children}</>;
|
|
15
|
+
}
|
package/src/SegmentedControl.tsx
CHANGED
|
@@ -19,7 +19,9 @@ import {
|
|
|
19
19
|
type PlatformIconSource,
|
|
20
20
|
} from './icons';
|
|
21
21
|
import { normalizeLabelStyle, type LabelStyle } from './labelStyle';
|
|
22
|
+
import type { Haptics } from './haptics';
|
|
22
23
|
import type { AndroidMaterialStyle } from './sharedTypes';
|
|
24
|
+
import { warnSelectionIdentifiers } from './selectionIdentifiers';
|
|
23
25
|
|
|
24
26
|
// Android: Minimum height to ensure visibility.
|
|
25
27
|
// Fabric's shadow node measurement isn't being called on initial render,
|
|
@@ -61,7 +63,7 @@ export interface SegmentedControlSegmentProps {
|
|
|
61
63
|
/** Display label for the segment */
|
|
62
64
|
label: string;
|
|
63
65
|
|
|
64
|
-
/** Unique value identifier for the segment */
|
|
66
|
+
/** Unique, non-empty value identifier for the segment. */
|
|
65
67
|
value: string;
|
|
66
68
|
|
|
67
69
|
/** Whether this specific segment is disabled */
|
|
@@ -82,6 +84,12 @@ export interface SegmentedControlSegmentProps {
|
|
|
82
84
|
* announced by their title.
|
|
83
85
|
*/
|
|
84
86
|
accessibilityLabel?: string;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Test identifier of the segment, for E2E taps. iOS: the segment's
|
|
90
|
+
* accessibility element. Android: the segment's button.
|
|
91
|
+
*/
|
|
92
|
+
testID?: string;
|
|
85
93
|
}
|
|
86
94
|
|
|
87
95
|
export interface SegmentedControlProps extends ViewProps {
|
|
@@ -111,6 +119,13 @@ export interface SegmentedControlProps extends ViewProps {
|
|
|
111
119
|
/** Whether the entire control is disabled */
|
|
112
120
|
disabled?: boolean;
|
|
113
121
|
|
|
122
|
+
/**
|
|
123
|
+
* Haptic played when the user changes the selection (a tap that selects or
|
|
124
|
+
* clears a segment), not when `selectedValue` changes. Default: none, like
|
|
125
|
+
* the native controls. See {@link Haptics}.
|
|
126
|
+
*/
|
|
127
|
+
haptics?: Haptics;
|
|
128
|
+
|
|
114
129
|
/**
|
|
115
130
|
* How labels and icons combine. Default: `'auto'`.
|
|
116
131
|
* See {@link SegmentedControlLabelVisibility}.
|
|
@@ -132,6 +147,12 @@ export interface SegmentedControlProps extends ViewProps {
|
|
|
132
147
|
/** Font for segment labels. See {@link SegmentedControlLabelStyle}. */
|
|
133
148
|
labelStyle?: SegmentedControlLabelStyle;
|
|
134
149
|
|
|
150
|
+
/**
|
|
151
|
+
* Largest scale the labels may reach with the system text size (Dynamic
|
|
152
|
+
* Type / font scale), as on React Native `Text`. Unset or `0`: no cap.
|
|
153
|
+
*/
|
|
154
|
+
maxFontSizeMultiplier?: number;
|
|
155
|
+
|
|
135
156
|
/** Colors for segment badges. See {@link SegmentedControlBadgeStyle}. */
|
|
136
157
|
badgeStyle?: SegmentedControlBadgeStyle;
|
|
137
158
|
|
|
@@ -205,7 +226,9 @@ export function SegmentedControl(
|
|
|
205
226
|
activeTintColor,
|
|
206
227
|
inactiveTintColor,
|
|
207
228
|
labelStyle,
|
|
229
|
+
maxFontSizeMultiplier,
|
|
208
230
|
badgeStyle,
|
|
231
|
+
haptics,
|
|
209
232
|
onSelect,
|
|
210
233
|
onDeselect,
|
|
211
234
|
ios,
|
|
@@ -215,6 +238,10 @@ export function SegmentedControl(
|
|
|
215
238
|
|
|
216
239
|
// Normalize segments for native
|
|
217
240
|
const nativeSegments = useMemo((): NativeSegment[] => {
|
|
241
|
+
warnSelectionIdentifiers(
|
|
242
|
+
'SegmentedControl',
|
|
243
|
+
segments.map((segment) => segment.value)
|
|
244
|
+
);
|
|
218
245
|
return segments.map((seg) => ({
|
|
219
246
|
label: seg.label,
|
|
220
247
|
value: seg.value,
|
|
@@ -222,6 +249,7 @@ export function SegmentedControl(
|
|
|
222
249
|
badge:
|
|
223
250
|
seg.badge === undefined || seg.badge === null ? '' : String(seg.badge),
|
|
224
251
|
accessibilityLabel: seg.accessibilityLabel ?? '',
|
|
252
|
+
testID: seg.testID ?? '',
|
|
225
253
|
...resolveSegmentIcon(seg.icon),
|
|
226
254
|
}));
|
|
227
255
|
}, [segments]);
|
|
@@ -296,8 +324,10 @@ export function SegmentedControl(
|
|
|
296
324
|
androidRippleColor={android?.rippleColor}
|
|
297
325
|
androidStrokeColor={android?.strokeColor}
|
|
298
326
|
labelStyle={nativeLabelStyle}
|
|
327
|
+
maxFontSizeMultiplier={maxFontSizeMultiplier ?? 0}
|
|
299
328
|
badgeBackgroundColor={badgeStyle?.backgroundColor}
|
|
300
329
|
badgeTextColor={badgeStyle?.color}
|
|
330
|
+
haptics={haptics ?? ''}
|
|
301
331
|
onSelect={onSelect || onDeselect ? handleSelect : undefined}
|
|
302
332
|
ios={nativeIos}
|
|
303
333
|
android={nativeAndroid}
|
|
@@ -21,11 +21,13 @@ export type SegmentedControlSegment = Readonly<{
|
|
|
21
21
|
disabled: string; // 'enabled' | 'disabled'
|
|
22
22
|
iconType: string; // '' | 'sfSymbol' | 'drawable' | 'image'
|
|
23
23
|
iconName: string; // SF Symbol (iOS) or drawable resource name (Android)
|
|
24
|
+
iconRequest: string;
|
|
24
25
|
iconUri: string; // Resolved image URI when iconType === 'image'
|
|
25
26
|
iconScale: Double; // Resolved image scale when iconType === 'image'
|
|
26
27
|
iconTinted: string; // 'true' | 'false' — draw the image as a tinted template
|
|
27
28
|
badge: string; // Badge text, empty = no badge
|
|
28
29
|
accessibilityLabel: string; // Screen-reader label, empty = use label
|
|
30
|
+
testID: string; // E2E identifier of the segment, empty = none
|
|
29
31
|
}>;
|
|
30
32
|
|
|
31
33
|
/**
|
|
@@ -117,12 +119,21 @@ export interface SegmentedControlProps extends ViewProps {
|
|
|
117
119
|
/** Label font. */
|
|
118
120
|
labelStyle?: LabelStyleProps;
|
|
119
121
|
|
|
122
|
+
/** Largest font scale the labels may reach; 0 = no cap. */
|
|
123
|
+
maxFontSizeMultiplier?: Double;
|
|
124
|
+
|
|
120
125
|
/** Badge background (default: system red). */
|
|
121
126
|
badgeBackgroundColor?: ColorValue;
|
|
122
127
|
|
|
123
128
|
/** Badge text color (default: white). */
|
|
124
129
|
badgeTextColor?: ColorValue;
|
|
125
130
|
|
|
131
|
+
/**
|
|
132
|
+
* Haptic played when the user changes the selection: '' (none added) | 'none' | 'selection' |
|
|
133
|
+
* 'light' | 'medium' | 'heavy' | 'success' | 'warning' | 'error'
|
|
134
|
+
*/
|
|
135
|
+
haptics?: string;
|
|
136
|
+
|
|
126
137
|
/**
|
|
127
138
|
* Fired when the user selects a segment.
|
|
128
139
|
*/
|
package/src/SelectionMenu.tsx
CHANGED
|
@@ -3,14 +3,44 @@ import React, { useCallback, useMemo } from 'react';
|
|
|
3
3
|
import { Platform, type ViewProps } from 'react-native';
|
|
4
4
|
|
|
5
5
|
import NativeSelectionMenu, {
|
|
6
|
-
type
|
|
6
|
+
type SelectionMenuNativeOption,
|
|
7
7
|
type SelectionMenuSelectEvent,
|
|
8
8
|
} from './SelectionMenuNativeComponent';
|
|
9
|
+
import { resolveIcon, type PlatformIcon } from './icons';
|
|
10
|
+
import { warnSelectionIdentifiers } from './selectionIdentifiers';
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
import type { Haptics } from './haptics';
|
|
12
13
|
import type { AndroidMaterialMode, Presentation } from './sharedTypes';
|
|
13
14
|
|
|
15
|
+
/**
|
|
16
|
+
* A single option: a label and its data payload, with an optional icon and
|
|
17
|
+
* second line.
|
|
18
|
+
*/
|
|
19
|
+
export interface SelectionMenuOption {
|
|
20
|
+
/** Display text */
|
|
21
|
+
label: string;
|
|
22
|
+
/** Unique, non-empty payload returned by `onSelect` and matched by `selected`. */
|
|
23
|
+
data: string;
|
|
24
|
+
/** Keeps the option visible but prevents the user from choosing it. */
|
|
25
|
+
disabled?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Secondary text under the label.
|
|
28
|
+
* - iOS: `UIAction.subtitle` in the system menu.
|
|
29
|
+
* - Android: a second line in the rows of the embedded `m3` dropdown.
|
|
30
|
+
* The modal `PopupMenu` and the `system` Spinner have one line per item,
|
|
31
|
+
* so it's not shown there.
|
|
32
|
+
*/
|
|
33
|
+
subtitle?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Icon next to the label. See {@link PlatformIcon}.
|
|
36
|
+
* - iOS: `UIAction.image`.
|
|
37
|
+
* - Android: the modal `PopupMenu` item icon and a leading icon in the
|
|
38
|
+
* rows of the embedded `m3` dropdown. The `system` Spinner shows labels
|
|
39
|
+
* only.
|
|
40
|
+
*/
|
|
41
|
+
icon?: PlatformIcon;
|
|
42
|
+
}
|
|
43
|
+
|
|
14
44
|
export interface SelectionMenuProps extends ViewProps {
|
|
15
45
|
/** Options are label + data (payload) */
|
|
16
46
|
options: readonly SelectionMenuOption[];
|
|
@@ -37,6 +67,12 @@ export interface SelectionMenuProps extends ViewProps {
|
|
|
37
67
|
*/
|
|
38
68
|
visible?: boolean;
|
|
39
69
|
|
|
70
|
+
/**
|
|
71
|
+
* Haptic played when the user picks an option. Default: none beyond the
|
|
72
|
+
* system menu's own feedback. See {@link Haptics}.
|
|
73
|
+
*/
|
|
74
|
+
haptics?: Haptics;
|
|
75
|
+
|
|
40
76
|
/**
|
|
41
77
|
* Called when the user selects an option.
|
|
42
78
|
* Receives the selected `data` payload, plus label/index for convenience.
|
|
@@ -56,12 +92,38 @@ export interface SelectionMenuProps extends ViewProps {
|
|
|
56
92
|
android?: {
|
|
57
93
|
/** Material preference ('system' | 'm3'). */
|
|
58
94
|
material?: AndroidMaterialMode;
|
|
95
|
+
/**
|
|
96
|
+
* Embedded `m3` dropdown only: the field accepts typing and filters the
|
|
97
|
+
* options by label (case-insensitive prefix of the label or of any word
|
|
98
|
+
* in it). Picking an option still goes through `onSelect`, and `selected`
|
|
99
|
+
* stays the source of truth: when the field loses focus, its text goes
|
|
100
|
+
* back to the selected option's label (or empty, showing the
|
|
101
|
+
* placeholder). Default `false`.
|
|
102
|
+
*/
|
|
103
|
+
searchable?: boolean;
|
|
59
104
|
};
|
|
60
105
|
|
|
61
106
|
/** Test identifier */
|
|
62
107
|
testID?: string;
|
|
63
108
|
}
|
|
64
109
|
|
|
110
|
+
/** Flattens options for native: icons resolved, every field set. */
|
|
111
|
+
function normalizeSelectionMenuOptions(
|
|
112
|
+
options: readonly SelectionMenuOption[]
|
|
113
|
+
): SelectionMenuNativeOption[] {
|
|
114
|
+
warnSelectionIdentifiers(
|
|
115
|
+
'SelectionMenu',
|
|
116
|
+
options.map((option) => option.data)
|
|
117
|
+
);
|
|
118
|
+
return options.map((option) => ({
|
|
119
|
+
label: option.label,
|
|
120
|
+
data: option.data,
|
|
121
|
+
disabled: option.disabled ? 'true' : 'false',
|
|
122
|
+
subtitle: option.subtitle ?? '',
|
|
123
|
+
...resolveIcon(option.icon),
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
|
|
65
127
|
function normalizeSelectedData(selected: string | null): string {
|
|
66
128
|
return selected ?? '';
|
|
67
129
|
}
|
|
@@ -84,6 +146,7 @@ export function SelectionMenu(props: SelectionMenuProps): React.ReactElement {
|
|
|
84
146
|
placeholder,
|
|
85
147
|
presentation = 'modal',
|
|
86
148
|
visible,
|
|
149
|
+
haptics,
|
|
87
150
|
onSelect,
|
|
88
151
|
onRequestClose,
|
|
89
152
|
ios,
|
|
@@ -96,6 +159,11 @@ export function SelectionMenu(props: SelectionMenuProps): React.ReactElement {
|
|
|
96
159
|
[selected]
|
|
97
160
|
);
|
|
98
161
|
|
|
162
|
+
const nativeOptions = useMemo(
|
|
163
|
+
() => normalizeSelectionMenuOptions(options),
|
|
164
|
+
[options]
|
|
165
|
+
);
|
|
166
|
+
|
|
99
167
|
const nativeVisible = useMemo(
|
|
100
168
|
() => normalizeNativeVisible(presentation, visible),
|
|
101
169
|
[presentation, visible]
|
|
@@ -104,9 +172,12 @@ export function SelectionMenu(props: SelectionMenuProps): React.ReactElement {
|
|
|
104
172
|
const handleSelect = useCallback(
|
|
105
173
|
(e: { nativeEvent: SelectionMenuSelectEvent }) => {
|
|
106
174
|
const { index, label, data } = e.nativeEvent;
|
|
175
|
+
const option = options[index];
|
|
176
|
+
if (disabled || !option || option.disabled || option.data !== data)
|
|
177
|
+
return;
|
|
107
178
|
onSelect?.(data, label, index);
|
|
108
179
|
},
|
|
109
|
-
[onSelect]
|
|
180
|
+
[disabled, onSelect, options]
|
|
110
181
|
);
|
|
111
182
|
|
|
112
183
|
const handleRequestClose = useCallback(() => {
|
|
@@ -116,7 +187,10 @@ export function SelectionMenu(props: SelectionMenuProps): React.ReactElement {
|
|
|
116
187
|
// Keep android prop stable and codegen-friendly (string unions live in native spec).
|
|
117
188
|
const nativeAndroid = useMemo(() => {
|
|
118
189
|
if (!android) return undefined;
|
|
119
|
-
return {
|
|
190
|
+
return {
|
|
191
|
+
material: android.material,
|
|
192
|
+
searchable: android.searchable ? 'true' : 'false',
|
|
193
|
+
};
|
|
120
194
|
}, [android]);
|
|
121
195
|
|
|
122
196
|
// On Android, force a fresh native view when structural props change so the
|
|
@@ -130,12 +204,13 @@ export function SelectionMenu(props: SelectionMenuProps): React.ReactElement {
|
|
|
130
204
|
<NativeSelectionMenu
|
|
131
205
|
key={remountKey}
|
|
132
206
|
style={style}
|
|
133
|
-
options={
|
|
207
|
+
options={nativeOptions}
|
|
134
208
|
selectedData={selectedData}
|
|
135
209
|
interactivity={disabled ? 'disabled' : 'enabled'}
|
|
136
210
|
placeholder={placeholder}
|
|
137
211
|
anchorMode={presentation === 'embedded' ? 'inline' : 'headless'}
|
|
138
212
|
visible={nativeVisible}
|
|
213
|
+
haptics={haptics ?? ''}
|
|
139
214
|
onSelect={onSelect ? handleSelect : undefined}
|
|
140
215
|
onRequestClose={onRequestClose ? handleRequestClose : undefined}
|
|
141
216
|
ios={ios}
|