Slider
Slider composes Base UI’s slider primitives with Density size attributes on the root and component-local styling for the track, active range, thumb, and value.
import { useState } from "react";
import { Slider } from "density-base-ui";
export default function SliderExample() {
const [zoom, setZoom] = useState(65);
const updateZoom = (value: number | readonly number[]) => {
setZoom(Array.isArray(value) ? value[0] : value);
};
return <Slider value={zoom} onValueChange={updateZoom} aria-label="Zoom" />;
}Label and hint
Changes preview scale.
import { useState } from "react";
import { Slider } from "density-base-ui";
export default function SliderFieldExample() {
const [zoom, setZoom] = useState(65);
const updateZoom = (value: number | readonly number[]) => {
setZoom(Array.isArray(value) ? value[0] : value);
};
return (
<Slider
label="Zoom"
hint="Changes preview scale."
onValueChange={updateZoom}
value={zoom}
/>
);
}Error
Set the zoom between 25% and 75%.
import { useState } from "react";
import { Slider } from "density-base-ui";
export default function SliderErrorExample() {
const [zoom, setZoom] = useState(90);
const updateZoom = (value: number | readonly number[]) => {
setZoom(Array.isArray(value) ? value[0] : value);
};
return (
<Slider
errorMessage="Set the zoom between 25% and 75%."
hint="Changes preview scale."
label="Zoom"
onValueChange={updateZoom}
value={zoom}
/>
);
}Orientation
Use orientation="vertical" to change the slider axis. Give a vertical slider a height so its rail has room to render.
import { useState } from "react";
import { Slider, View } from "density-base-ui";
export default function SliderOrientationExample() {
const [zoom, setZoom] = useState(40);
const updateZoom = (value: number | readonly number[]) => {
setZoom(Array.isArray(value) ? value[0] : value);
};
return (
<View
align="stretch"
orientation="horizontal"
padding={false}
style={{ height: "12rem" }}
>
<Slider
aria-label="Vertical zoom"
onValueChange={updateZoom}
orientation="vertical"
value={zoom}
/>
</View>
);
}Field orientation
fieldOrientation changes the label and control layout without changing the slider axis.
import { useState } from "react";
import { Slider, View } from "density-base-ui";
export default function SliderFieldOrientationExample() {
const [verticalZoom, setVerticalZoom] = useState(40);
const [horizontalZoom, setHorizontalZoom] = useState(60);
const updateVerticalZoom = (value: number | readonly number[]) => {
setVerticalZoom(Array.isArray(value) ? value[0] : value);
};
const updateHorizontalZoom = (value: number | readonly number[]) => {
setHorizontalZoom(Array.isArray(value) ? value[0] : value);
};
return (
<View>
<Slider
fieldOrientation="vertical"
label="Vertical"
onValueChange={updateVerticalZoom}
value={verticalZoom}
/>
<Slider
fieldOrientation="horizontal"
label="Horizontal"
onValueChange={updateHorizontalZoom}
value={horizontalZoom}
/>
</View>
);
}Show value
import { useState } from "react";
import { Slider, View } from "density-base-ui";
export default function SliderShowValueExample() {
const [hiddenValue, setHiddenValue] = useState(40);
const [visibleValue, setVisibleValue] = useState(60);
const updateHiddenValue = (value: number | readonly number[]) => {
setHiddenValue(Array.isArray(value) ? value[0] : value);
};
const updateVisibleValue = (value: number | readonly number[]) => {
setVisibleValue(Array.isArray(value) ? value[0] : value);
};
return (
<View>
<Slider
aria-label="Hidden value"
onValueChange={updateHiddenValue}
showValue={false}
value={hiddenValue}
/>
<Slider
aria-label="Visible value"
onValueChange={updateVisibleValue}
showValue
value={visibleValue}
/>
</View>
);
}Value label
import { useState } from "react";
import { Slider } from "density-base-ui";
export default function SliderValueLabelExample() {
const [opacity, setOpacity] = useState(72);
const updateOpacity = (value: number | readonly number[]) => {
setOpacity(Array.isArray(value) ? value[0] : value);
};
return (
<Slider
aria-label="Opacity"
onValueChange={updateOpacity}
showValue
value={opacity}
valueLabel={`${opacity}%`}
/>
);
}Size
import { useState, type ComponentProps } from "react";
import { Slider, View } from "density-base-ui";
function SizeSlider({ size }: { size: ComponentProps<typeof Slider>["size"] }) {
const [value, setValue] = useState(50);
const updateValue = (nextValue: number | readonly number[]) => {
setValue(Array.isArray(nextValue) ? nextValue[0] : nextValue);
};
return (
<Slider
aria-label={size}
onValueChange={updateValue}
size={size}
value={value}
/>
);
}
export default function SliderSizeExample() {
return (
<View>
<SizeSlider size="2xs" />
<SizeSlider size="xs" />
<SizeSlider size="sm" />
<SizeSlider size="md" />
<SizeSlider size="lg" />
<SizeSlider size="xl" />
<SizeSlider size="2xl" />
<SizeSlider size="3xl" />
</View>
);
}| Prop | Values | Required | Default | Behavior | Description |
|---|---|---|---|---|---|
errorMessage | React.ReactNode | Not required | — | — | — |
fieldOrientation | vertical, horizontal | Not required | — | — | — |
hint | React.ReactNode | Not required | — | — | — |
label | React.ReactNode | Not required | — | — | — |
showValue | false, true | Not required | false | — | — |
size | 2xs, xs, sm, md, lg, xl, 2xl, 3xl | Not required | — | Attribute: data-dn-size | — |
valueLabel | React.ReactNode | Not required | — | — | — |
This component also accepts props from native APIs. They are passed through and intentionally kept out of this focused Density API table.