react-native-platform-components 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PlatformComponents.podspec +1 -1
- package/README.md +47 -51
- package/android/src/main/java/com/platformcomponents/PCButtonGroupView.kt +664 -0
- package/android/src/main/java/com/platformcomponents/PCButtonGroupViewManager.kt +241 -0
- package/android/src/main/java/com/platformcomponents/PCButtonSupport.kt +159 -0
- package/android/src/main/java/com/platformcomponents/PCButtonView.kt +527 -0
- package/android/src/main/java/com/platformcomponents/PCButtonViewManager.kt +204 -0
- 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 +112 -0
- 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 +247 -0
- package/android/src/main/java/com/platformcomponents/PCFloatingToolbarViewManager.kt +73 -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 +35 -17
- package/android/src/main/java/com/platformcomponents/PCSegmentedControlViewManager.kt +20 -3
- 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 +1393 -0
- package/android/src/main/java/com/platformcomponents/PCTextFieldViewManager.kt +354 -0
- package/android/src/main/java/com/platformcomponents/PCThemeSupport.kt +37 -0
- package/android/src/main/java/com/platformcomponents/PlatformComponentsPackage.kt +8 -0
- package/android/src/main/res/drawable/pc_ic_search.xml +12 -0
- package/android/src/main/res/values/attrs.xml +13 -0
- package/android/src/main/res/values/ids.xml +5 -0
- package/android/src/main/res/values/styles.xml +207 -0
- package/ios/PCButton.h +10 -0
- package/ios/PCButton.mm +311 -0
- package/ios/PCButtonGroup.h +10 -0
- package/ios/PCButtonGroup.mm +323 -0
- package/ios/PCButtonGroupView.swift +473 -0
- package/ios/PCButtonSupport.swift +312 -0
- package/ios/PCButtonView.swift +438 -0
- 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.h +10 -0
- package/ios/PCFloatingToolbar.mm +103 -0
- package/ios/PCFloatingToolbarView.swift +336 -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.h +10 -0
- package/ios/PCTextField.mm +546 -0
- package/ios/PCTextFieldView.swift +1558 -0
- package/lib/commonjs/Button.js +149 -0
- package/lib/commonjs/Button.js.map +1 -0
- package/lib/commonjs/ButtonGroup.js +109 -0
- package/lib/commonjs/ButtonGroup.js.map +1 -0
- package/lib/commonjs/ButtonGroupNativeComponent.ts +191 -0
- package/lib/commonjs/ButtonNativeComponent.ts +192 -0
- 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 +77 -0
- package/lib/commonjs/FloatingToolbar.js.map +1 -0
- package/lib/commonjs/FloatingToolbarNativeComponent.ts +47 -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 +18 -85
- package/lib/commonjs/SegmentedControl.js.map +1 -1
- package/lib/commonjs/SegmentedControlNativeComponent.ts +14 -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 +358 -0
- package/lib/commonjs/TextField.js.map +1 -0
- package/lib/commonjs/TextFieldNativeComponent.ts +324 -0
- package/lib/commonjs/focusRegistry.js +79 -0
- package/lib/commonjs/focusRegistry.js.map +1 -0
- package/lib/commonjs/haptics.js +2 -0
- package/lib/commonjs/haptics.js.map +1 -0
- package/lib/commonjs/icons.js +106 -0
- package/lib/commonjs/icons.js.map +1 -0
- package/lib/commonjs/index.js +143 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +157 -63
- 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/labelStyle.js +27 -0
- package/lib/commonjs/labelStyle.js.map +1 -0
- package/lib/commonjs/menuItems.js +68 -0
- package/lib/commonjs/menuItems.js.map +1 -0
- package/lib/commonjs/reactNativeInternals.d.js +2 -0
- package/lib/commonjs/reactNativeInternals.d.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 +142 -0
- package/lib/module/Button.js.map +1 -0
- package/lib/module/ButtonGroup.js +102 -0
- package/lib/module/ButtonGroup.js.map +1 -0
- package/lib/module/ButtonGroupNativeComponent.ts +191 -0
- package/lib/module/ButtonNativeComponent.ts +192 -0
- 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 +70 -0
- package/lib/module/FloatingToolbar.js.map +1 -0
- package/lib/module/FloatingToolbarNativeComponent.ts +47 -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 +18 -85
- package/lib/module/SegmentedControl.js.map +1 -1
- package/lib/module/SegmentedControlNativeComponent.ts +14 -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 +352 -0
- package/lib/module/TextField.js.map +1 -0
- package/lib/module/TextFieldNativeComponent.ts +324 -0
- package/lib/module/focusRegistry.js +75 -0
- package/lib/module/focusRegistry.js.map +1 -0
- package/lib/module/haptics.js +2 -0
- package/lib/module/haptics.js.map +1 -0
- package/lib/module/icons.js +101 -0
- package/lib/module/icons.js.map +1 -0
- package/lib/module/index.js +13 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +12 -59
- 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/labelStyle.js +23 -0
- package/lib/module/labelStyle.js.map +1 -0
- package/lib/module/menuItems.js +65 -0
- package/lib/module/menuItems.js.map +1 -0
- package/lib/module/reactNativeInternals.d.js +2 -0
- package/lib/module/reactNativeInternals.d.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 +184 -0
- package/lib/typescript/commonjs/src/Button.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/ButtonGroup.d.ts +117 -0
- package/lib/typescript/commonjs/src/ButtonGroup.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts +154 -0
- package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts +148 -0
- package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts.map +1 -0
- 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 +75 -0
- package/lib/typescript/commonjs/src/FloatingToolbar.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts +36 -0
- package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts.map +1 -0
- 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 +35 -47
- package/lib/typescript/commonjs/src/SegmentedControl.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts +11 -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 +332 -0
- package/lib/typescript/commonjs/src/TextField.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts +240 -0
- package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/focusRegistry.d.ts +13 -0
- package/lib/typescript/commonjs/src/focusRegistry.d.ts.map +1 -0
- 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 +58 -0
- package/lib/typescript/commonjs/src/icons.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/index.d.ts +13 -0
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/index.web.d.ts +25 -133
- 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/labelStyle.d.ts +20 -0
- package/lib/typescript/commonjs/src/labelStyle.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/sharedTypes.d.ts +6 -1
- package/lib/typescript/commonjs/src/sharedTypes.d.ts.map +1 -1
- 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 +184 -0
- package/lib/typescript/module/src/Button.d.ts.map +1 -0
- package/lib/typescript/module/src/ButtonGroup.d.ts +117 -0
- package/lib/typescript/module/src/ButtonGroup.d.ts.map +1 -0
- package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts +154 -0
- package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/ButtonNativeComponent.d.ts +148 -0
- package/lib/typescript/module/src/ButtonNativeComponent.d.ts.map +1 -0
- 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 +75 -0
- package/lib/typescript/module/src/FloatingToolbar.d.ts.map +1 -0
- package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts +36 -0
- package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts.map +1 -0
- 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 +35 -47
- package/lib/typescript/module/src/SegmentedControl.d.ts.map +1 -1
- package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts +11 -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 +332 -0
- package/lib/typescript/module/src/TextField.d.ts.map +1 -0
- package/lib/typescript/module/src/TextFieldNativeComponent.d.ts +240 -0
- package/lib/typescript/module/src/TextFieldNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/focusRegistry.d.ts +13 -0
- package/lib/typescript/module/src/focusRegistry.d.ts.map +1 -0
- 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 +58 -0
- package/lib/typescript/module/src/icons.d.ts.map +1 -0
- package/lib/typescript/module/src/index.d.ts +13 -0
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/index.web.d.ts +25 -133
- 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/labelStyle.d.ts +20 -0
- package/lib/typescript/module/src/labelStyle.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/sharedTypes.d.ts +6 -1
- package/lib/typescript/module/src/sharedTypes.d.ts.map +1 -1
- 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 +55 -4
- package/plugin/build/index.d.ts +3 -2
- package/plugin/build/index.d.ts.map +1 -1
- package/react-native.config.js +6 -0
- package/shared/PCButtonComponentDescriptors-custom.h +22 -0
- package/shared/PCButtonGroupComponentDescriptors-custom.h +22 -0
- package/shared/PCButtonGroupShadowNode-custom.cpp +48 -0
- package/shared/PCButtonGroupShadowNode-custom.h +55 -0
- package/shared/PCButtonGroupState-custom.h +61 -0
- package/shared/PCButtonShadowNode-custom.cpp +48 -0
- package/shared/PCButtonShadowNode-custom.h +55 -0
- package/shared/PCButtonState-custom.h +61 -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/PCTextFieldComponentDescriptors-custom.h +22 -0
- package/shared/PCTextFieldShadowNode-custom.cpp +47 -0
- package/shared/PCTextFieldShadowNode-custom.h +55 -0
- package/shared/PCTextFieldState-custom.h +61 -0
- package/shared/react/renderer/components/PlatformComponentsViewSpec/ComponentDescriptors.h +6 -0
- package/src/Button.tsx +359 -0
- package/src/ButtonGroup.tsx +251 -0
- package/src/ButtonGroupNativeComponent.ts +191 -0
- package/src/ButtonNativeComponent.ts +192 -0
- 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 +164 -0
- package/src/FloatingToolbarNativeComponent.ts +47 -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 +57 -119
- package/src/SegmentedControlNativeComponent.ts +14 -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 +908 -0
- package/src/TextFieldNativeComponent.ts +324 -0
- package/src/focusRegistry.ts +90 -0
- package/src/haptics.ts +31 -0
- package/src/icons.ts +143 -0
- package/src/index.tsx +13 -0
- package/src/index.web.tsx +53 -199
- package/src/jest.tsx +958 -0
- package/src/labelStyle.ts +36 -0
- package/src/menuItems.ts +152 -0
- package/src/reactNativeInternals.d.ts +22 -0
- package/src/selectionIdentifiers.ts +17 -0
- package/src/sharedTypes.ts +7 -1
- 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
package/src/Button.tsx
ADDED
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
// Button.tsx
|
|
2
|
+
import React, { useCallback, useMemo, useState } from 'react';
|
|
3
|
+
import type { ColorValue, NativeSyntheticEvent, ViewProps } from 'react-native';
|
|
4
|
+
|
|
5
|
+
import NativeButton, {
|
|
6
|
+
type ButtonMenuSelectEvent,
|
|
7
|
+
type ButtonSelectedChangeEvent,
|
|
8
|
+
} from './ButtonNativeComponent';
|
|
9
|
+
import { resolveIcon, type PlatformIcon } from './icons';
|
|
10
|
+
import { normalizeLabelStyle, type LabelStyle } from './labelStyle';
|
|
11
|
+
import { flattenMenuActions, type ContextMenuAction } from './menuItems';
|
|
12
|
+
import type { Haptics } from './haptics';
|
|
13
|
+
import type { AndroidMaterialStyle } from './sharedTypes';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Emphasis of the button, from highest to lowest.
|
|
17
|
+
*
|
|
18
|
+
* | Variant | Android (Material 3 Expressive) | iOS (`UIButton.Configuration`) |
|
|
19
|
+
* | ---------- | ------------------------------- | ------------------------------ |
|
|
20
|
+
* | `filled` | Filled button | `.filled()` |
|
|
21
|
+
* | `tonal` | Filled tonal button | `.tinted()` |
|
|
22
|
+
* | `outlined` | Outlined button | `.bordered()` |
|
|
23
|
+
* | `text` | Text button | `.plain()` |
|
|
24
|
+
* | `elevated` | Elevated button | `.gray()` |
|
|
25
|
+
* | `glass` | Filled tonal button | `.glass()` (iOS 26+), else `.gray()` |
|
|
26
|
+
* | `prominentGlass` | Filled button | `.prominentGlass()` (iOS 26+), else `.filled()` |
|
|
27
|
+
* | `clearGlass` | Filled tonal button | `.clearGlass()` (iOS 26+), else `.gray()` |
|
|
28
|
+
* | `prominentClearGlass` | Filled button | `.prominentClearGlass()` (iOS 26+), else `.filled()` |
|
|
29
|
+
*
|
|
30
|
+
* The glass variants are the iOS 26 Liquid Glass buttons; `color` tints
|
|
31
|
+
* the prominent glass and `tintColor` colors the label and icon. Clear glass
|
|
32
|
+
* is more transparent, for buttons over photos and other rich content.
|
|
33
|
+
*/
|
|
34
|
+
export type ButtonVariant =
|
|
35
|
+
| 'filled'
|
|
36
|
+
| 'tonal'
|
|
37
|
+
| 'outlined'
|
|
38
|
+
| 'text'
|
|
39
|
+
| 'elevated'
|
|
40
|
+
| 'glass'
|
|
41
|
+
| 'prominentGlass'
|
|
42
|
+
| 'clearGlass'
|
|
43
|
+
| 'prominentClearGlass';
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Button size. Material 3 Expressive defines five sizes; iOS maps them onto
|
|
47
|
+
* `UIButton.Configuration.Size` (`xsmall` → mini, `xlarge` → large).
|
|
48
|
+
*/
|
|
49
|
+
export type ButtonSize = 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Corner shape. `round` is a pill; `square` keeps rounded corners. Unset
|
|
53
|
+
* means the platform default (round on Android, dynamic on iOS).
|
|
54
|
+
*/
|
|
55
|
+
export type ButtonShape = 'round' | 'square';
|
|
56
|
+
|
|
57
|
+
/** Where the icon sits relative to the label. */
|
|
58
|
+
export type ButtonIconPosition = 'leading' | 'trailing' | 'top' | 'bottom';
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* An animated SF Symbol effect (iOS 17+). `wiggle`, `rotate` and `breathe`
|
|
62
|
+
* need iOS 18; on earlier versions they do nothing.
|
|
63
|
+
*/
|
|
64
|
+
export type ButtonSymbolEffect =
|
|
65
|
+
'bounce' | 'pulse' | 'variableColor' | 'wiggle' | 'rotate' | 'breathe';
|
|
66
|
+
|
|
67
|
+
export interface ButtonProps extends ViewProps {
|
|
68
|
+
/** Button text. Omit for an icon-only button. */
|
|
69
|
+
label?: string;
|
|
70
|
+
|
|
71
|
+
/** Icon shown next to the label, or alone when there is no label. */
|
|
72
|
+
icon?: PlatformIcon;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Where the icon sits relative to the label. Default: `'leading'`.
|
|
76
|
+
* iOS: `imagePlacement`. Android: `iconGravity` (`textEnd` for trailing,
|
|
77
|
+
* `textTop` for top). Material has no bottom gravity, so `'bottom'` puts the
|
|
78
|
+
* icon on top on Android.
|
|
79
|
+
*/
|
|
80
|
+
iconPosition?: ButtonIconPosition;
|
|
81
|
+
|
|
82
|
+
/** Emphasis. Default: `'filled'`. See {@link ButtonVariant}. */
|
|
83
|
+
variant?: ButtonVariant;
|
|
84
|
+
|
|
85
|
+
/** Size. Default: `'small'`, the Material 3 default. */
|
|
86
|
+
size?: ButtonSize;
|
|
87
|
+
|
|
88
|
+
/** Corner shape. Default: platform default. */
|
|
89
|
+
shape?: ButtonShape;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Corner radius in points (dp). Overrides `shape` when set.
|
|
93
|
+
* iOS: `background.cornerRadius` with the fixed corner style. Android: the
|
|
94
|
+
* `shapeAppearanceModel` corner size (the press morph is turned off).
|
|
95
|
+
*/
|
|
96
|
+
cornerRadius?: number;
|
|
97
|
+
|
|
98
|
+
/** Whether the button is disabled. */
|
|
99
|
+
disabled?: boolean;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Shows a native spinner in place of the label and icon, keeping the
|
|
103
|
+
* button's size, and ignores presses. Sets `accessibilityState.busy`.
|
|
104
|
+
* iOS: `UIButton.Configuration.showsActivityIndicator`. Android: a Material
|
|
105
|
+
* circular progress indicator drawn as the button icon.
|
|
106
|
+
*/
|
|
107
|
+
loading?: boolean;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Container (background) color.
|
|
111
|
+
* Android: `backgroundTint`. iOS: `baseBackgroundColor`.
|
|
112
|
+
*/
|
|
113
|
+
color?: ColorValue;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Label and icon color.
|
|
117
|
+
* Android: text color and `iconTint`. iOS: `baseForegroundColor`.
|
|
118
|
+
*/
|
|
119
|
+
tintColor?: ColorValue;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Container color while disabled. Unset keeps the platform's disabled look.
|
|
123
|
+
* iOS: a `configurationUpdateHandler` on `isEnabled`. Android: the disabled
|
|
124
|
+
* state of the `backgroundTint` color state list.
|
|
125
|
+
*/
|
|
126
|
+
disabledColor?: ColorValue;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Label and icon color while disabled. Unset keeps the platform's disabled
|
|
130
|
+
* look. iOS: a `configurationUpdateHandler` on `isEnabled`. Android: the
|
|
131
|
+
* disabled state of the text color and `iconTint` color state lists.
|
|
132
|
+
*/
|
|
133
|
+
disabledTintColor?: ColorValue;
|
|
134
|
+
|
|
135
|
+
/** Label font. */
|
|
136
|
+
labelStyle?: LabelStyle;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Largest scale the label's font can reach with the system text size
|
|
140
|
+
* (Dynamic Type / font scale), as on `Text`: `undefined` or `0` means no
|
|
141
|
+
* cap; values of 1 or more cap it.
|
|
142
|
+
*/
|
|
143
|
+
maxFontSizeMultiplier?: number;
|
|
144
|
+
|
|
145
|
+
/** Screen-reader label. Defaults to `label`. */
|
|
146
|
+
accessibilityLabel?: string;
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Haptic played when the user presses the button, flips a toggle or
|
|
150
|
+
* picks a menu item (not when a menu button opens its menu); not while
|
|
151
|
+
* `loading` or disabled. Default: none, like the native buttons. See
|
|
152
|
+
* {@link Haptics}.
|
|
153
|
+
*/
|
|
154
|
+
haptics?: Haptics;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Called when the button is pressed. A button with a `menu` opens the menu
|
|
158
|
+
* instead.
|
|
159
|
+
*/
|
|
160
|
+
onPress?: () => void;
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Makes the button a toggle, with this as its controlled state. A press
|
|
164
|
+
* calls `onSelectedChange` with the opposite value; the button shows the
|
|
165
|
+
* new state once `selected` changes, and goes back if it doesn't.
|
|
166
|
+
*
|
|
167
|
+
* iOS: `changesSelectionAsPrimaryAction` and `isSelected`, with the
|
|
168
|
+
* configuration's selected look. Android: a checkable `MaterialButton`
|
|
169
|
+
* (`isChecked`), with the Material toggle button colors and shape.
|
|
170
|
+
*/
|
|
171
|
+
selected?: boolean;
|
|
172
|
+
|
|
173
|
+
/** Called when a toggle button is pressed, with the state it asks for. */
|
|
174
|
+
onSelectedChange?: (selected: boolean) => void;
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* A menu the button opens when pressed, in place of `onPress`. Same items
|
|
178
|
+
* as ContextMenu: submenus, sections, icons, states and attributes.
|
|
179
|
+
*
|
|
180
|
+
* iOS: `UIButton.menu` with `showsMenuAsPrimaryAction`. Android: a
|
|
181
|
+
* `PopupMenu` anchored to the button.
|
|
182
|
+
*/
|
|
183
|
+
menu?: readonly ContextMenuAction[];
|
|
184
|
+
|
|
185
|
+
/** Called when a menu item is picked, with its id and title. */
|
|
186
|
+
onMenuSelect?: (id: string, title: string) => void;
|
|
187
|
+
|
|
188
|
+
/** Called when the menu opens. */
|
|
189
|
+
onMenuOpen?: () => void;
|
|
190
|
+
|
|
191
|
+
/** Called when the menu closes. */
|
|
192
|
+
onMenuClose?: () => void;
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* iOS-specific configuration
|
|
196
|
+
*/
|
|
197
|
+
ios?: {
|
|
198
|
+
/**
|
|
199
|
+
* Animates the SF Symbol icon (`UIImageView.addSymbolEffect`, iOS 17+;
|
|
200
|
+
* `wiggle`, `rotate` and `breathe` need iOS 18). Without
|
|
201
|
+
* `symbolEffectTrigger` the effect repeats until it is unset. Ignored
|
|
202
|
+
* for image icons and on Android.
|
|
203
|
+
*/
|
|
204
|
+
symbolEffect?: ButtonSymbolEffect;
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Plays `symbolEffect` once each time this value changes, instead of
|
|
208
|
+
* repeating it. The first value doesn't play.
|
|
209
|
+
*/
|
|
210
|
+
symbolEffectTrigger?: number | string;
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Android-specific configuration
|
|
215
|
+
*/
|
|
216
|
+
android?: {
|
|
217
|
+
/** Ripple color shown while pressing. */
|
|
218
|
+
rippleColor?: ColorValue;
|
|
219
|
+
|
|
220
|
+
/** Outline color (outlined variant). */
|
|
221
|
+
strokeColor?: ColorValue;
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Material style: Material 3 Expressive (default), or the classic
|
|
225
|
+
* Material 3 button, which has one size and shape (`size` and `shape`
|
|
226
|
+
* are ignored).
|
|
227
|
+
*/
|
|
228
|
+
material?: AndroidMaterialStyle;
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
/** Test identifier */
|
|
232
|
+
testID?: string;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export function Button(props: ButtonProps): React.ReactElement {
|
|
236
|
+
const {
|
|
237
|
+
label,
|
|
238
|
+
icon,
|
|
239
|
+
iconPosition,
|
|
240
|
+
variant,
|
|
241
|
+
size,
|
|
242
|
+
shape,
|
|
243
|
+
cornerRadius,
|
|
244
|
+
disabled,
|
|
245
|
+
loading,
|
|
246
|
+
color,
|
|
247
|
+
tintColor,
|
|
248
|
+
disabledColor,
|
|
249
|
+
disabledTintColor,
|
|
250
|
+
labelStyle,
|
|
251
|
+
maxFontSizeMultiplier,
|
|
252
|
+
accessibilityLabel,
|
|
253
|
+
haptics,
|
|
254
|
+
onPress,
|
|
255
|
+
selected,
|
|
256
|
+
onSelectedChange,
|
|
257
|
+
menu,
|
|
258
|
+
onMenuSelect,
|
|
259
|
+
onMenuOpen,
|
|
260
|
+
onMenuClose,
|
|
261
|
+
ios,
|
|
262
|
+
android,
|
|
263
|
+
accessibilityState,
|
|
264
|
+
...viewProps
|
|
265
|
+
} = props;
|
|
266
|
+
|
|
267
|
+
const nativeIcon = useMemo(() => resolveIcon(icon), [icon]);
|
|
268
|
+
const nativeLabelStyle = useMemo(
|
|
269
|
+
() => normalizeLabelStyle(labelStyle),
|
|
270
|
+
[labelStyle]
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
const nativeMenu = useMemo(
|
|
274
|
+
() => (menu ? flattenMenuActions(menu) : []),
|
|
275
|
+
[menu]
|
|
276
|
+
);
|
|
277
|
+
|
|
278
|
+
const handlePress = useCallback(() => {
|
|
279
|
+
if (loading) return;
|
|
280
|
+
onPress?.();
|
|
281
|
+
}, [onPress, loading]);
|
|
282
|
+
|
|
283
|
+
// Controlled toggle, like React Native's Switch: every press re-renders
|
|
284
|
+
// with a new event count, so native applies `selected` again and a state
|
|
285
|
+
// the parent didn't take goes back.
|
|
286
|
+
const [selectedEventCount, setSelectedEventCount] = useState(0);
|
|
287
|
+
const handleSelectedChange = useCallback(
|
|
288
|
+
(e: NativeSyntheticEvent<ButtonSelectedChangeEvent>) => {
|
|
289
|
+
setSelectedEventCount((count) => count + 1);
|
|
290
|
+
onSelectedChange?.(e.nativeEvent.selected);
|
|
291
|
+
},
|
|
292
|
+
[onSelectedChange]
|
|
293
|
+
);
|
|
294
|
+
|
|
295
|
+
const handleMenuSelect = useCallback(
|
|
296
|
+
(e: NativeSyntheticEvent<ButtonMenuSelectEvent>) => {
|
|
297
|
+
onMenuSelect?.(e.nativeEvent.id, e.nativeEvent.title);
|
|
298
|
+
},
|
|
299
|
+
[onMenuSelect]
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
const handleMenuOpen = useCallback(() => onMenuOpen?.(), [onMenuOpen]);
|
|
303
|
+
const handleMenuClose = useCallback(() => onMenuClose?.(), [onMenuClose]);
|
|
304
|
+
|
|
305
|
+
const nativeIOS = useMemo(
|
|
306
|
+
() => ({
|
|
307
|
+
symbolEffect: ios?.symbolEffect ?? '',
|
|
308
|
+
symbolEffectTrigger:
|
|
309
|
+
ios?.symbolEffectTrigger === undefined
|
|
310
|
+
? ''
|
|
311
|
+
: String(ios.symbolEffectTrigger),
|
|
312
|
+
}),
|
|
313
|
+
[ios?.symbolEffect, ios?.symbolEffectTrigger]
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
const isToggle = selected !== undefined;
|
|
317
|
+
|
|
318
|
+
const mergedAccessibilityState = useMemo(
|
|
319
|
+
() =>
|
|
320
|
+
loading ? { ...accessibilityState, busy: true } : accessibilityState,
|
|
321
|
+
[loading, accessibilityState]
|
|
322
|
+
);
|
|
323
|
+
|
|
324
|
+
return (
|
|
325
|
+
<NativeButton
|
|
326
|
+
label={label ?? ''}
|
|
327
|
+
icon={nativeIcon}
|
|
328
|
+
iconPosition={iconPosition ?? 'leading'}
|
|
329
|
+
variant={variant ?? 'filled'}
|
|
330
|
+
size={size ?? 'small'}
|
|
331
|
+
shape={shape ?? ''}
|
|
332
|
+
cornerRadius={cornerRadius ?? -1}
|
|
333
|
+
interactivity={disabled ? 'disabled' : 'enabled'}
|
|
334
|
+
loading={loading ? 'true' : 'false'}
|
|
335
|
+
color={color}
|
|
336
|
+
foregroundColor={tintColor}
|
|
337
|
+
disabledColor={disabledColor}
|
|
338
|
+
disabledForegroundColor={disabledTintColor}
|
|
339
|
+
androidRippleColor={android?.rippleColor}
|
|
340
|
+
androidStrokeColor={android?.strokeColor}
|
|
341
|
+
androidMaterial={android?.material ?? 'expressive'}
|
|
342
|
+
labelStyle={nativeLabelStyle}
|
|
343
|
+
maxFontSizeMultiplier={maxFontSizeMultiplier ?? 0}
|
|
344
|
+
spokenLabel={accessibilityLabel ?? ''}
|
|
345
|
+
selected={isToggle ? (selected ? 'true' : 'false') : ''}
|
|
346
|
+
selectedEventCount={selectedEventCount}
|
|
347
|
+
menu={nativeMenu}
|
|
348
|
+
ios={nativeIOS}
|
|
349
|
+
haptics={haptics ?? ''}
|
|
350
|
+
onButtonPress={onPress ? handlePress : undefined}
|
|
351
|
+
onSelectedChange={isToggle ? handleSelectedChange : undefined}
|
|
352
|
+
onMenuSelect={onMenuSelect ? handleMenuSelect : undefined}
|
|
353
|
+
onMenuOpen={onMenuOpen ? handleMenuOpen : undefined}
|
|
354
|
+
onMenuClose={onMenuClose ? handleMenuClose : undefined}
|
|
355
|
+
accessibilityState={mergedAccessibilityState}
|
|
356
|
+
{...viewProps}
|
|
357
|
+
/>
|
|
358
|
+
);
|
|
359
|
+
}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
// ButtonGroup.tsx
|
|
2
|
+
import React, { useCallback, useMemo } from 'react';
|
|
3
|
+
import type { ColorValue, ViewProps } from 'react-native';
|
|
4
|
+
|
|
5
|
+
import type { ButtonShape, ButtonSize, ButtonVariant } from './Button';
|
|
6
|
+
import NativeButtonGroup, {
|
|
7
|
+
type ButtonGroupButton as NativeButton,
|
|
8
|
+
type ButtonGroupPressEvent,
|
|
9
|
+
type ButtonGroupSelectionEvent,
|
|
10
|
+
} from './ButtonGroupNativeComponent';
|
|
11
|
+
import { resolveIcon, type PlatformIcon } from './icons';
|
|
12
|
+
import { normalizeLabelStyle, type LabelStyle } from './labelStyle';
|
|
13
|
+
import type { Haptics } from './haptics';
|
|
14
|
+
import type { AndroidMaterialStyle } from './sharedTypes';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Selection behavior of the group.
|
|
18
|
+
*
|
|
19
|
+
* - `none` (default): the buttons are plain actions.
|
|
20
|
+
* - `single`: at most one button is selected at a time.
|
|
21
|
+
* - `multiple`: any number of buttons can be selected.
|
|
22
|
+
*/
|
|
23
|
+
export type ButtonGroupSelection = 'none' | 'single' | 'multiple';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* What happens to buttons that don't fit the group's width.
|
|
27
|
+
*
|
|
28
|
+
* - `none` (default): they are clipped.
|
|
29
|
+
* - `menu`: the trailing ones move into an overflow menu. Android: the
|
|
30
|
+
* `MaterialButtonGroup` overflow menu. iOS: a "…" button with a `UIMenu`.
|
|
31
|
+
* - `wrap`: they wrap onto more rows (Android only; iOS clips them).
|
|
32
|
+
*/
|
|
33
|
+
export type ButtonGroupOverflow = 'none' | 'menu' | 'wrap';
|
|
34
|
+
|
|
35
|
+
export interface ButtonGroupButtonProps {
|
|
36
|
+
/** Button text. Omit for an icon-only button. */
|
|
37
|
+
label?: string;
|
|
38
|
+
|
|
39
|
+
/** Unique value identifier for the button */
|
|
40
|
+
value: string;
|
|
41
|
+
|
|
42
|
+
/** Whether this specific button is disabled */
|
|
43
|
+
disabled?: boolean;
|
|
44
|
+
|
|
45
|
+
/** Optional icon. See {@link PlatformIcon}. */
|
|
46
|
+
icon?: PlatformIcon;
|
|
47
|
+
|
|
48
|
+
/** Screen-reader label. Defaults to `label`. */
|
|
49
|
+
accessibilityLabel?: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface ButtonGroupProps extends ViewProps {
|
|
53
|
+
/** Buttons to display */
|
|
54
|
+
buttons: readonly ButtonGroupButtonProps[];
|
|
55
|
+
|
|
56
|
+
/** Emphasis of every button. Default: `'outlined'`. */
|
|
57
|
+
variant?: ButtonVariant;
|
|
58
|
+
|
|
59
|
+
/** Size of every button. Default: `'small'`. */
|
|
60
|
+
size?: ButtonSize;
|
|
61
|
+
|
|
62
|
+
/** Corner shape of every button. Default: platform default. */
|
|
63
|
+
shape?: ButtonShape;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Connected group: the buttons share one outline with small inner corners
|
|
67
|
+
* (Material 3 "connected button group"). Default: `true` when `selection`
|
|
68
|
+
* is `'single'` or `'multiple'`, `false` otherwise.
|
|
69
|
+
*/
|
|
70
|
+
connected?: boolean;
|
|
71
|
+
|
|
72
|
+
/** Gap between buttons in points. Default: the platform's group spacing. */
|
|
73
|
+
spacing?: number;
|
|
74
|
+
|
|
75
|
+
/** Selection behavior. Default: `'none'`. See {@link ButtonGroupSelection}. */
|
|
76
|
+
selection?: ButtonGroupSelection;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Values of the selected buttons (controlled). Only the first value is
|
|
80
|
+
* used with `selection: 'single'`.
|
|
81
|
+
*/
|
|
82
|
+
selectedValues?: readonly string[];
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Whether at least one button must stay selected. Default: `true` for
|
|
86
|
+
* `single`, `false` for `multiple`.
|
|
87
|
+
*/
|
|
88
|
+
selectionRequired?: boolean;
|
|
89
|
+
|
|
90
|
+
/** Whether the entire group is disabled */
|
|
91
|
+
disabled?: boolean;
|
|
92
|
+
|
|
93
|
+
/** Container (background) color of the buttons. */
|
|
94
|
+
color?: ColorValue;
|
|
95
|
+
|
|
96
|
+
/** Label and icon color of the buttons. */
|
|
97
|
+
tintColor?: ColorValue;
|
|
98
|
+
|
|
99
|
+
/** Label font. */
|
|
100
|
+
labelStyle?: LabelStyle;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* What happens to buttons that don't fit the group's width. Default:
|
|
104
|
+
* `'none'`. See {@link ButtonGroupOverflow}. A pick from the overflow menu
|
|
105
|
+
* counts as a press of its button (`onPress`, and the selection).
|
|
106
|
+
*/
|
|
107
|
+
overflow?: ButtonGroupOverflow;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Haptic played when a button is pressed, in every selection mode.
|
|
111
|
+
* Default: none, like the native buttons. See {@link Haptics}.
|
|
112
|
+
*/
|
|
113
|
+
haptics?: Haptics;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Called when a button is pressed, in every selection mode.
|
|
117
|
+
* @param value - The button's value
|
|
118
|
+
* @param index - The button's index
|
|
119
|
+
*/
|
|
120
|
+
onPress?: (value: string, index: number) => void;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Called when the selection changes (`single` / `multiple` selection).
|
|
124
|
+
* @param values - Values of the selected buttons, in button order
|
|
125
|
+
*/
|
|
126
|
+
onSelectionChange?: (values: string[]) => void;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Android-specific configuration
|
|
130
|
+
*/
|
|
131
|
+
android?: {
|
|
132
|
+
/** @deprecated Use the cross-platform `overflow` prop. */
|
|
133
|
+
overflow?: ButtonGroupOverflow;
|
|
134
|
+
|
|
135
|
+
/** Ripple color shown while pressing a button. */
|
|
136
|
+
rippleColor?: ColorValue;
|
|
137
|
+
|
|
138
|
+
/** Outline color (outlined variant). */
|
|
139
|
+
strokeColor?: ColorValue;
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Material style: Material 3 Expressive (default), or the classic
|
|
143
|
+
* Material 3 group, which has one size and shape (`size` and `shape`
|
|
144
|
+
* are ignored).
|
|
145
|
+
*/
|
|
146
|
+
material?: AndroidMaterialStyle;
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
/** Test identifier */
|
|
150
|
+
testID?: string;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function ButtonGroup(props: ButtonGroupProps): React.ReactElement {
|
|
154
|
+
const {
|
|
155
|
+
buttons,
|
|
156
|
+
variant,
|
|
157
|
+
size,
|
|
158
|
+
shape,
|
|
159
|
+
connected,
|
|
160
|
+
spacing,
|
|
161
|
+
selection,
|
|
162
|
+
selectedValues,
|
|
163
|
+
selectionRequired,
|
|
164
|
+
disabled,
|
|
165
|
+
color,
|
|
166
|
+
tintColor,
|
|
167
|
+
labelStyle,
|
|
168
|
+
overflow,
|
|
169
|
+
haptics,
|
|
170
|
+
onPress,
|
|
171
|
+
onSelectionChange,
|
|
172
|
+
android,
|
|
173
|
+
...viewProps
|
|
174
|
+
} = props;
|
|
175
|
+
|
|
176
|
+
const selectionMode = selection ?? 'none';
|
|
177
|
+
|
|
178
|
+
const nativeButtons = useMemo((): NativeButton[] => {
|
|
179
|
+
return buttons.map((button) => ({
|
|
180
|
+
label: button.label ?? '',
|
|
181
|
+
value: button.value,
|
|
182
|
+
disabled: button.disabled ? 'disabled' : 'enabled',
|
|
183
|
+
accessibilityLabel: button.accessibilityLabel ?? '',
|
|
184
|
+
...resolveIcon(button.icon),
|
|
185
|
+
}));
|
|
186
|
+
}, [buttons]);
|
|
187
|
+
|
|
188
|
+
const nativeSelectedValues = useMemo((): string[] => {
|
|
189
|
+
if (selectionMode === 'none' || !selectedValues) return [];
|
|
190
|
+
return selectionMode === 'single'
|
|
191
|
+
? selectedValues.slice(0, 1)
|
|
192
|
+
: [...selectedValues];
|
|
193
|
+
}, [selectionMode, selectedValues]);
|
|
194
|
+
|
|
195
|
+
const nativeLabelStyle = useMemo(
|
|
196
|
+
() => normalizeLabelStyle(labelStyle),
|
|
197
|
+
[labelStyle]
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
const handlePress = useCallback(
|
|
201
|
+
(e: { nativeEvent: ButtonGroupPressEvent }) => {
|
|
202
|
+
const { index, value } = e.nativeEvent;
|
|
203
|
+
onPress?.(value, index);
|
|
204
|
+
},
|
|
205
|
+
[onPress]
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
const handleSelectionChange = useCallback(
|
|
209
|
+
(e: { nativeEvent: ButtonGroupSelectionEvent }) => {
|
|
210
|
+
onSelectionChange?.([...e.nativeEvent.values]);
|
|
211
|
+
},
|
|
212
|
+
[onSelectionChange]
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
const nativeAndroid = useMemo(
|
|
216
|
+
() => ({ material: android?.material ?? 'expressive' }),
|
|
217
|
+
[android?.material]
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
const isConnected = connected ?? selectionMode !== 'none';
|
|
221
|
+
const isSelectionRequired =
|
|
222
|
+
selectionRequired ?? (selectionMode === 'single' ? true : false);
|
|
223
|
+
|
|
224
|
+
return (
|
|
225
|
+
<NativeButtonGroup
|
|
226
|
+
buttons={nativeButtons}
|
|
227
|
+
variant={variant ?? 'outlined'}
|
|
228
|
+
size={size ?? 'small'}
|
|
229
|
+
shape={shape ?? ''}
|
|
230
|
+
connected={isConnected ? 'true' : 'false'}
|
|
231
|
+
spacing={spacing ?? -1}
|
|
232
|
+
selection={selectionMode}
|
|
233
|
+
selectedValues={nativeSelectedValues}
|
|
234
|
+
selectionRequired={isSelectionRequired ? 'true' : 'false'}
|
|
235
|
+
interactivity={disabled ? 'disabled' : 'enabled'}
|
|
236
|
+
color={color}
|
|
237
|
+
foregroundColor={tintColor}
|
|
238
|
+
androidRippleColor={android?.rippleColor}
|
|
239
|
+
androidStrokeColor={android?.strokeColor}
|
|
240
|
+
labelStyle={nativeLabelStyle}
|
|
241
|
+
overflow={overflow ?? android?.overflow ?? 'none'}
|
|
242
|
+
haptics={haptics ?? ''}
|
|
243
|
+
onButtonPress={onPress ? handlePress : undefined}
|
|
244
|
+
onGroupSelectionChange={
|
|
245
|
+
onSelectionChange ? handleSelectionChange : undefined
|
|
246
|
+
}
|
|
247
|
+
android={nativeAndroid}
|
|
248
|
+
{...viewProps}
|
|
249
|
+
/>
|
|
250
|
+
);
|
|
251
|
+
}
|