Gathering detailed insights and metrics for react-native-curved-bottom-bar
Gathering detailed insights and metrics for react-native-curved-bottom-bar
Gathering detailed insights and metrics for react-native-curved-bottom-bar
Gathering detailed insights and metrics for react-native-curved-bottom-bar
react-native-curved-bottom-tabbar
React Native Reanimated Curve Tab Bar
react-native-curved-bottom-bar-bic
A high performance, beautiful and fully customizable curved bottom navigation bar for React Native.
@husam287/react-native-curved-bottom-bar
A high performance, beautiful and fully customizable curved bottom navigation bar for React Native.
@eavfw/react-native-curved-tab-bar
A beautiful animated curved tab bar for React Native apps with customizable floating action button
A high performance, beautiful and fully customizable curved bottom navigation bar for React Native.
npm install react-native-curved-bottom-bar
Typescript
Module System
Min. Node Version
Node Version
NPM Version
52.5
Supply Chain
59.4
Quality
70.5
Maintenance
50
Vulnerability
93.8
License
TypeScript (74.29%)
Java (12.47%)
Ruby (4.04%)
Objective-C (3.9%)
JavaScript (3.08%)
Objective-C++ (1.93%)
C (0.17%)
Swift (0.11%)
Built with Next.js • Fully responsive • SEO optimized • Open source ready
Total Downloads
240,700
Last Day
192
Last Week
3,100
Last Month
11,000
Last Year
88,088
MIT License
567 Stars
162 Commits
106 Forks
5 Watchers
1 Branches
3 Contributors
Updated on Sep 03, 2025
Latest Version
3.5.1
Package Id
react-native-curved-bottom-bar@3.5.1
Unpacked Size
249.68 kB
Size
30.71 kB
File Count
129
NPM Version
11.2.0
Node Version
23.9.0
Published on
Apr 24, 2025
Cumulative downloads
Total Downloads
Last Day
8.5%
192
Compared to previous day
Last Week
2.3%
3,100
Compared to previous week
Last Month
28.9%
11,000
Compared to previous month
Last Year
17.8%
88,088
Compared to previous year
2
4
25
A high performance, beautiful and fully customizable curved bottom navigation bar for React Native. Implemented using react-native-svg and @react-navigation/bottom-tabs.
1If you love this library, give us a star, you will be a ray of sunshine in our lives :)
React Native Template with a beautiful UI.
1npm install react-native-curved-bottom-bar --save
or
1yarn add react-native-curved-bottom-bar
Now we need to install react-native-svg and @react-navigation/bottom-tabs.
Props | Params | isRequire | Description |
---|---|---|---|
type | 'DOWN' or 'UP' | Yes | Type of the center tab item, downward curve or upward curve |
circlePosition | 'CENTER' or 'LEFT' or 'RIGHT' | No | Position of circle button |
initialRouteName | String | Yes | The name of the route to render on first load of the navigator |
tabBar | ({ routeName, selectedTab, navigate }) => JSX.Element | Yes | Function that returns a React element to display as the tab bar |
renderCircle | ({ routeName, selectedTab, navigate }) => JSX.Element | Yes | Function that returns a React element to display as the center tab item |
circleWidth | Number | No | Customize width of the center tab item. Minimum is 50px and Maximum is 60px |
style | ViewStyle | No | Styling for container view |
shadowStyle | ViewStyle | No | Styling for shadow view. |
width | Number | No | Customize width for container view |
height | Number | No | Customize height for container view, Minimum is 50px and Maximum is 90px |
borderTopLeftRight | Boolean | No | Border radius top left and top right of container view |
borderColor | String | No | Border color |
borderWidth | Number | No | Border width |
bgColor | String | No | Background color of container view |
Props | Params | isRequire | Description |
---|---|---|---|
name | String | Yes | Name of the route to jump to |
position | 'LEFT' or 'RIGHT' or 'CIRCLE' | Yes | Set position of tabbar icon to the left or right of the circle button. Use type "CIRCLE" only when you want the circle button is a tabview |
component | (props) => JSX.Element | Yes | Screen params to merge into the destination route |
Function | Params | Description |
---|---|---|
setVisible | Boolean | Used to hide/show the tab bar. Ex: ref.current.setVisible(false) |
1import React from 'react'; 2import { 3 Alert, 4 Animated, 5 StyleSheet, 6 TouchableOpacity, 7 View, 8} from 'react-native'; 9import { CurvedBottomBarExpo } from 'react-native-curved-bottom-bar'; 10import Ionicons from '@expo/vector-icons/Ionicons'; 11import { NavigationContainer } from '@react-navigation/native'; 12 13const Screen1 = () => { 14 return <View style={styles.screen1} />; 15}; 16 17const Screen2 = () => { 18 return <View style={styles.screen2} />; 19}; 20 21export default function App() { 22 const _renderIcon = (routeName, selectedTab) => { 23 let icon = ''; 24 25 switch (routeName) { 26 case 'title1': 27 icon = 'ios-home-outline'; 28 break; 29 case 'title2': 30 icon = 'settings-outline'; 31 break; 32 } 33 34 return ( 35 <Ionicons 36 name={icon} 37 size={25} 38 color={routeName === selectedTab ? 'black' : 'gray'} 39 /> 40 ); 41 }; 42 const renderTabBar = ({ routeName, selectedTab, navigate }) => { 43 return ( 44 <TouchableOpacity 45 onPress={() => navigate(routeName)} 46 style={styles.tabbarItem} 47 > 48 {_renderIcon(routeName, selectedTab)} 49 </TouchableOpacity> 50 ); 51 }; 52 53 return ( 54 <NavigationContainer> 55 <CurvedBottomBarExpo.Navigator 56 type="DOWN" 57 style={styles.bottomBar} 58 shadowStyle={styles.shawdow} 59 height={55} 60 circleWidth={50} 61 bgColor="white" 62 initialRouteName="title1" 63 borderTopLeftRight 64 renderCircle={({ selectedTab, navigate }) => ( 65 <Animated.View style={styles.btnCircleUp}> 66 <TouchableOpacity 67 style={styles.button} 68 onPress={() => Alert.alert('Click Action')} 69 > 70 <Ionicons name={'apps-sharp'} color="gray" size={25} /> 71 </TouchableOpacity> 72 </Animated.View> 73 )} 74 tabBar={renderTabBar} 75 > 76 <CurvedBottomBarExpo.Screen 77 name="title1" 78 position="LEFT" 79 component={() => <Screen1 />} 80 /> 81 <CurvedBottomBarExpo.Screen 82 name="title2" 83 component={() => <Screen2 />} 84 position="RIGHT" 85 /> 86 </CurvedBottomBarExpo.Navigator> 87 </NavigationContainer> 88 ); 89} 90 91export const styles = StyleSheet.create({ 92 container: { 93 flex: 1, 94 padding: 20, 95 }, 96 shawdow: { 97 shadowColor: '#DDDDDD', 98 shadowOffset: { 99 width: 0, 100 height: 0, 101 }, 102 shadowOpacity: 1, 103 shadowRadius: 5, 104 }, 105 button: { 106 flex: 1, 107 justifyContent: 'center', 108 }, 109 bottomBar: {}, 110 btnCircleUp: { 111 width: 60, 112 height: 60, 113 borderRadius: 30, 114 alignItems: 'center', 115 justifyContent: 'center', 116 backgroundColor: '#E8E8E8', 117 bottom: 30, 118 shadowColor: '#000', 119 shadowOffset: { 120 width: 0, 121 height: 1, 122 }, 123 shadowOpacity: 0.2, 124 shadowRadius: 1.41, 125 elevation: 1, 126 }, 127 imgCircle: { 128 width: 30, 129 height: 30, 130 tintColor: 'gray', 131 }, 132 tabbarItem: { 133 flex: 1, 134 alignItems: 'center', 135 justifyContent: 'center', 136 }, 137 img: { 138 width: 30, 139 height: 30, 140 }, 141 screen1: { 142 flex: 1, 143 backgroundColor: '#BFEFFF', 144 }, 145 screen2: { 146 flex: 1, 147 backgroundColor: '#FFEBCD', 148 }, 149}); 150
1import React from 'react'; 2import { 3 Alert, 4 Animated, 5 StyleSheet, 6 TouchableOpacity, 7 View, 8} from 'react-native'; 9import { CurvedBottomBar } from 'react-native-curved-bottom-bar'; 10import Ionicons from 'react-native-vector-icons/Ionicons'; 11import { NavigationContainer } from '@react-navigation/native'; 12 13const Screen1 = () => { 14 return <View style={styles.screen1} />; 15}; 16 17const Screen2 = () => { 18 return <View style={styles.screen2} />; 19}; 20 21export default function App() { 22 const _renderIcon = (routeName, selectedTab) => { 23 let icon = ''; 24 25 switch (routeName) { 26 case 'title1': 27 icon = 'ios-home-outline'; 28 break; 29 case 'title2': 30 icon = 'settings-outline'; 31 break; 32 } 33 34 return ( 35 <Ionicons 36 name={icon} 37 size={25} 38 color={routeName === selectedTab ? 'black' : 'gray'} 39 /> 40 ); 41 }; 42 const renderTabBar = ({ routeName, selectedTab, navigate }) => { 43 return ( 44 <TouchableOpacity 45 onPress={() => navigate(routeName)} 46 style={styles.tabbarItem} 47 > 48 {_renderIcon(routeName, selectedTab)} 49 </TouchableOpacity> 50 ); 51 }; 52 53 return ( 54 <NavigationContainer> 55 <CurvedBottomBar.Navigator 56 type="UP" 57 style={styles.bottomBar} 58 shadowStyle={styles.shawdow} 59 height={55} 60 circleWidth={50} 61 bgColor="white" 62 initialRouteName="title1" 63 borderTopLeftRight 64 renderCircle={({ selectedTab, navigate }) => ( 65 <Animated.View style={styles.btnCircleUp}> 66 <TouchableOpacity 67 style={styles.button} 68 onPress={() => Alert.alert('Click Action')} 69 > 70 <Ionicons name={'apps-sharp'} color="gray" size={25} /> 71 </TouchableOpacity> 72 </Animated.View> 73 )} 74 tabBar={renderTabBar} 75 > 76 <CurvedBottomBar.Screen 77 name="title1" 78 position="LEFT" 79 component={() => <Screen1 />} 80 /> 81 <CurvedBottomBar.Screen 82 name="title2" 83 component={() => <Screen2 />} 84 position="RIGHT" 85 /> 86 </CurvedBottomBar.Navigator> 87 </NavigationContainer> 88 ); 89} 90 91export const styles = StyleSheet.create({ 92 container: { 93 flex: 1, 94 padding: 20, 95 }, 96 shawdow: { 97 shadowColor: '#DDDDDD', 98 shadowOffset: { 99 width: 0, 100 height: 0, 101 }, 102 shadowOpacity: 1, 103 shadowRadius: 5, 104 }, 105 button: { 106 flex: 1, 107 justifyContent: 'center', 108 }, 109 bottomBar: {}, 110 btnCircleUp: { 111 width: 60, 112 height: 60, 113 borderRadius: 30, 114 alignItems: 'center', 115 justifyContent: 'center', 116 backgroundColor: '#E8E8E8', 117 bottom: 18, 118 shadowColor: '#000', 119 shadowOffset: { 120 width: 0, 121 height: 1, 122 }, 123 shadowOpacity: 0.2, 124 shadowRadius: 1.41, 125 elevation: 1, 126 }, 127 imgCircle: { 128 width: 30, 129 height: 30, 130 tintColor: 'gray', 131 }, 132 tabbarItem: { 133 flex: 1, 134 alignItems: 'center', 135 justifyContent: 'center', 136 }, 137 img: { 138 width: 30, 139 height: 30, 140 }, 141 screen1: { 142 flex: 1, 143 backgroundColor: '#BFEFFF', 144 }, 145 screen2: { 146 flex: 1, 147 backgroundColor: '#FFEBCD', 148 }, 149}); 150
No vulnerabilities found.