Slider
The Slider component allows users to select a value from a continuous or stepped range by dragging a thumb.
Installation
$ cbui-cli install slidercbui-cli globally and authenticated your account. This will ensure you can access all the necessary features.Import
1import { Slider } from '@/crossbuildui/slider';
2// import Icon from 'react-native-vector-icons/MaterialIcons'; // Or your preferred icon library for start/end contentSlider Component
Basic Usage
A simple slider with a default value and a label.
1<Slider defaultValue={50} label="Volume" />Sizes
Adjust slider track and thumb size with sm, md (default), or lg.
1<View style={{gap: 24}}>
2 <Slider defaultValue={30} size="sm" label="Small Slider" />
3 <Slider defaultValue={50} size="md" label="Medium Slider (Default)" />
4 <Slider defaultValue={70} size="lg" label="Large Slider" />
5</View>Colors
Set the thematic color of the slider's filled track and thumb using the color prop.
1<View style={{gap: 16}}>
2 <Slider defaultValue={25} color="primary" label="Primary" />
3 <Slider defaultValue={40} color="secondary" label="Secondary" />
4 <Slider defaultValue={55} color="success" label="Success" />
5 <Slider defaultValue={70} color="warning" label="Warning" />
6 <Slider defaultValue={85} color="danger" label="Danger" />
7 <Slider defaultValue={50} color="foreground" label="Foreground" />
8</View>Radius
Control the border radius of the track and thumb with none, sm, md (default), lg, or full.
1<View style={{gap: 16}}>
2 <Slider defaultValue={50} radius="none" label="No Radius" />
3 <Slider defaultValue={50} radius="sm" label="Small Radius" />
4 <Slider defaultValue={50} radius="md" label="Medium Radius (Default)" />
5 <Slider defaultValue={50} radius="lg" label="Large Radius" />
6 <Slider defaultValue={50} radius="full" label="Full Radius" />
7</View>Orientation
Sliders can be horizontal (default) or vertical.
1<View style={{flexDirection: 'row', gap: 40, alignItems: 'center', height: 250}}>
2 <Slider defaultValue={60} label="Horizontal (Default)" />
3 <Slider
4 orientation="vertical"
5 defaultValue={75}
6 label="Vertical Slider"
7 minValue={0}
8 maxValue={100}
9 />
10</View>Step, Min & Max Values
Define the range and increment of the slider using minValue, maxValue, and step.
1<View style={{gap: 16}}>
2 <Slider
3 label="Temperature"
4 defaultValue={20}
5 minValue={0}
6 maxValue={40}
7 step={0.5}
8 formatOptions={{ style: 'unit', unit: 'celsius' }}
9 />
10 <Slider
11 label="Brightness"
12 defaultValue={75}
13 minValue={0}
14 maxValue={100}
15 step={5}
16 />
17</View>Controlled and Uncontrolled
Manage slider state externally using value and onChange, or use defaultValue for an uncontrolled component. onChangeEnd fires when the gesture ends.
1function ControlledSlider() {
2 const [value, setValue] = React.useState(60);
3
4 return (
5 <View style={{gap: 8}}>
6 <Slider
7 label="Controlled Slider"
8 value={value}
9 onChange={setValue}
10 minValue={0}
11 maxValue={100}
12 />
13 <Text>Current Value: {value}</Text>
14 </View>
15 );
16}
17
18// Uncontrolled (uses defaultValue)
19// <Slider label="Uncontrolled" defaultValue={30} />
20Label and Value Display
Provide a label, control value visibility with hideValue, and format the displayed value with formatOptions.
1<View style={{gap: 16}}>
2 <Slider defaultValue={50} label="Slider with Label" />
3 <Slider defaultValue={70} label="Hide Value" hideValue />
4 <Slider
5 defaultValue={25}
6 label="Custom Format"
7 formatOptions={{ style: 'currency', currency: 'USD' }}
8 />
9</View>Tooltip
Enable showTooltip to display the current value above the thumb while dragging.
1<Slider
2 defaultValue={65}
3 label="Drag to see Tooltip"
4 showTooltip
5/>Show Steps
Display visual indicators for each step on the track by enabling showSteps.
1<Slider
2 defaultValue={50}
3 label="Slider with Steps"
4 minValue={0}
5 maxValue={100}
6 step={10}
7 showSteps
8/>Marks
Provide an array of marks to display custom labels and indicators at specific values along the track.
1const marks = [
2 { value: 0, label: '0°C' },
3 { value: 20, label: '20°C' },
4 { value: 37, label: '37°C' },
5 { value: 100, label: '100°C' },
6];
7
8<Slider
9 label="Temperature with Marks"
10 defaultValue={20}
11 minValue={0}
12 maxValue={100}
13 marks={marks}
14 step={1}
15/>Fill Offset
Use fillOffset to change the starting point of the filled portion of the track. Useful for sliders representing a range that doesn't start from the minimum value (e.g., a balance slider centered at 0).
1<View style={{gap: 24}}>
2 <Slider
3 label="Balance (-50 to 50, fill from 0)"
4 defaultValue={10}
5 minValue={-50}
6 maxValue={50}
7 fillOffset={0}
8 step={1}
9 />
10 <Slider
11 label="Range (0 to 100, fill from 50)"
12 defaultValue={75}
13 minValue={0}
14 maxValue={100}
15 fillOffset={50}
16 />
17</View>Start and End Content
Add decorative or informative elements like icons or text at the beginning and end of the slider using startContent and endContent.
1<View style={{gap: 16}}>
2 <Slider
3 label="Volume"
4 defaultValue={40}
5 startContent={<Icon name="volume-mute" size={20} color="gray" />}
6 endContent={<Icon name="volume-high" size={20} color="gray" />}
7 />
8 <Slider
9 label="Rating"
10 defaultValue={3}
11 minValue={1}
12 maxValue={5}
13 step={1}
14 startContent={<Text style={{fontSize: 12, color: 'gray'}}>Min</Text>}
15 endContent={<Text style={{fontSize: 12, color: 'gray'}}>Max</Text>}
16 />
17</View>Disabled State
Disable the slider interaction using the isDisabled prop.
1<Slider
2 defaultValue={50}
3 label="Disabled Slider"
4 isDisabled
5/>Thumb Customization
Customize the thumb's appearance and behavior with hideThumb, showOutline, and disableThumbScale.
1<View style={{gap: 16}}>
2 <Slider
3 defaultValue={50}
4 label="Hidden Thumb"
5 hideThumb
6 />
7 <Slider
8 defaultValue={60}
9 label="Thumb with Outline"
10 showOutline
11 />
12 <Slider
13 defaultValue={70}
14 label="Thumb Scale Animation Disabled"
15 disableThumbScale
16 />
17</View>Glass Track Effect
Apply a frosted glass effect to the slider's track (background) using isGlass. Customize it with glassIntensity (0-100) and glassTint ('light', 'dark', 'default'). When isGlass is true, the track's direct background color becomes transparent, and a BlurView provides the visual effect. Label and value text colors default to the theme's foreground color. For dark glass tints, you might need to manually set label/value colors via the styles prop.
1<View style={{gap: 24, padding: 10, backgroundColor: 'rgba(0,0,0,0.1)' /* Example background */}}>
2 <Slider
3 label="Light Glass Track"
4 defaultValue={60}
5 isGlass
6 glassIntensity={80}
7 glassTint="light"
8 />
9 <Slider
10 label="Dark Glass Track"
11 defaultValue={40}
12 isGlass
13 glassIntensity={50}
14 glassTint="dark"
15 styles={{ label: { color: 'white' }, valueText: { color: 'white' } }} // Adjust text for dark glass
16 />
17</View>Props Overview
| PROP | TYPE | DEFAULT | DESCRIPTION |
|---|---|---|---|
label | ReactNode | - | Label for the slider. |
size | SliderSize | 'md' | Size of the slider. |
color | SliderColor | 'primary' | Thematic color. |
radius | SliderRadius | 'md' | Border radius. |
step | number | 1 | Increment value. |
value | number | - | Controlled value. |
defaultValue | number | 0 | Uncontrolled initial value. |
onChange | (val: number) => void | - | Callback on value change. |
onChangeEnd | (val: number) => void | - | Callback on gesture end. |
minValue | number | 0 | Minimum value. |
maxValue | number | 100 | Maximum value. |
orientation | SliderOrientation | 'horizontal' | Orientation. |
fillOffset | number | minValue | Start point for the fill. |
showSteps | boolean | false | Show step indicators. |
showTooltip | boolean | false | Show tooltip on drag. |
marks | SliderMark[] | - | Marks to display on the track. |
startContent | ReactNode | - | Content at the start of the slider. |
endContent | ReactNode | - | Content at the end of the slider. |
formatOptions | Intl.NumberFormatOptions | - | Options for formatting the displayed value. |
tooltipProps | any | - | Props for the tooltip (e.g., style). |
showOutline | boolean | false | Show outline around thumb. |
hideValue | boolean | false | Hide displayed value. |
hideThumb | boolean | false | Hide the thumb. |
disableThumbScale | boolean | false | Disable thumb scale animation. |
isDisabled | boolean | false | Disable the slider. |
styles | SliderSlotsStyles | - | Custom styles for slider slots. |
style | StyleProp<ViewStyle> | - | Style for the base container. |
isGlass | boolean | false | Apply glassmorphism effect to the track background. |
glassTint | 'default' | 'light' | 'dark' | Theme-derived | Tint for the glass effect on the track. |
glassIntensity | number | 30 | Intensity (0-100) for the glass effect on the track. |
Styling
Customize the Slider appearance using the style prop for the main wrapper or the styles prop for more granular control over internal slots:
style: Applied to the outermost container (View) of the entire slider component.styles.base: Styles for the outermost container.styles.label: Styles for the label text.styles.sliderWrapper: Styles for the container of the track, thumb, and content.styles.track: Styles for the slider track.styles.filler: Styles for the filled part of the track.styles.thumb: Styles for the draggable thumb.styles.thumbOutline: Styles for the thumb's outline.styles.step: Styles for step indicators.styles.markLabel: Styles for mark labels.styles.markIndicator: Styles for mark indicator lines.styles.tooltip: Styles for the tooltip.styles.tooltipText: Styles for text inside the tooltip.styles.startContentWrapper: Styles for the start content container.styles.endContentWrapper: Styles for the end content container.styles.valueText: Styles for the displayed value text.- When
isGlassis true, aBlurViewis rendered as the background for thetrack. Thetrackstyle'sbackgroundColorwill be set to transparent.
1<Slider
2 label="Custom Styled Slider"
3 defaultValue={45}
4 style={{ marginVertical: 20, padding: 10, backgroundColor: '#e6e6fa' }} // Styles the outermost 'base' container
5 styles={{
6 base: { borderWidth: 1, borderColor: 'purple' },
7 label: { color: 'navy', fontWeight: 'bold', fontStyle: 'italic' },
8 sliderWrapper: { marginTop: 15 },
9 track: { backgroundColor: 'lightgray', height: 10 },
10 filler: { backgroundColor: 'teal' },
11 thumb: {
12 width: 28,
13 height: 28,
14 borderRadius: 6, // Square-ish thumb
15 backgroundColor: 'darkorange',
16 borderWidth: 2,
17 borderColor: 'maroon'
18 },
19 valueText: { color: 'green', fontSize: 16 },
20 tooltip: { backgroundColor: 'black', borderRadius: 8 },
21 tooltipText: { color: 'white', fontWeight: 'bold' }
22 }}
23 showTooltip
24/>Accessibility
The Slider component aims to be accessible:
- The component is built using
GestureDetectorfor touch interactions. - The
labelprop provides context for the slider. - When
isDisabled, interactions are prevented and opacity is reduced. - Consider providing
accessibilityLabel,accessibilityValue, andaccessibilityHintprops directly to the rootViewor via thestyle/styles.baseif further customization is needed for screen readers, although these are not explicitly handled by the component itself. Standard React Native accessibility props can be applied to the root element.