react-native-collapsible-tab-view
Version:
Collapsible tab view component for React Native
98 lines (89 loc) • 2.4 kB
text/typescript
import React from 'react'
import {
LayoutChangeEvent,
PressableProps,
StyleProp,
TextStyle,
ViewStyle,
} from 'react-native'
import Animated from 'react-native-reanimated'
import { TabBarProps, TabName, TabItemProps } from '../types'
type AnimatedStyle = StyleProp<Animated.AnimateStyle<ViewStyle>>
type AnimatedTextStyle = StyleProp<Animated.AnimateStyle<TextStyle>>
export type MaterialTabItemProps<T extends TabName> = TabItemProps<T> & {
onPress: (name: T) => void
onLayout?: (event: LayoutChangeEvent) => void
scrollEnabled?: boolean
style?: StyleProp<ViewStyle>
/**
* Style to apply to the tab item label
*/
labelStyle?: AnimatedTextStyle
inactiveOpacity?: number
pressColor?: string
pressOpacity?: number
/**
* Color applied to the label when active
*/
activeColor?: string
/**
* Color applied to the label when inactive
*/
inactiveColor?: string
} & Omit<PressableProps, 'onPress' | 'children'>
export type MaterialTabBarProps<N extends TabName> = TabBarProps<N> & {
/**
* Indicates whether the tab bar should contain horizontal scroll, when enabled the tab width is dynamic
*/
scrollEnabled?: boolean
/**
* Style to apply to the active indicator.
*/
indicatorStyle?: AnimatedStyle
/**
* React component to render as tab bar item
*/
TabItemComponent?: (props: MaterialTabItemProps<N>) => React.ReactElement
/**
* Function to compute the tab item label text
*/
getLabelText?: (name: N) => string
/**
* Style to apply to the tab bar container.
*/
style?: StyleProp<ViewStyle>
/**
* Style to apply to the inner container for tabs
*/
contentContainerStyle?: StyleProp<ViewStyle>
/**
* Style to apply to the individual tab items in the tab bar.
*/
tabStyle?: StyleProp<ViewStyle>
/**
* Style to apply to the tab item label
*/
labelStyle?: AnimatedTextStyle
/**
* Color applied to the label when active
*/
activeColor?: string
/**
* Color applied to the label when inactive
*/
inactiveColor?: string
/**
* Whether to keep the currently active tab centered in a scrollable tab bar
*/
keepActiveTabCentered?: boolean
}
export type ItemLayout = {
width: number
x: number
}
export type IndicatorProps = {
indexDecimal: Animated.SharedValue<number>
itemsLayout: ItemLayout[]
style?: AnimatedStyle
fadeIn?: boolean
}