Slider

A range control for selecting one value or a pair of values.

SliderExample

Examples

Range

Pass an array to defaultValue to render a range slider with multiple thumbs.

RangeSliderExample

Step

Use step to control the increment between values.

SteppedSliderExample

Disabled

Use the disabled prop to prevent interaction.

DisabledSliderExample

Controlled

Manage the slider value with React state using value and onValueChange.

ControlledSliderExample
Volume: 40

Installation

Copy the source code below into your project:

tsx
import { cn } from "@/lib/utils";
import { Slider as BaseSlider } from "@base-ui/react";
import React from "react";

export default function Slider({
  className,
  value,
  defaultValue,
  min,
  max,
  ...props
}: BaseSlider.Root.Props) {
  const _values = React.useMemo(
    () =>
      Array.isArray(value)
        ? value
        : typeof value === "number"
          ? [value]
          : Array.isArray(defaultValue)
            ? defaultValue
            : typeof defaultValue === "number"
              ? [defaultValue]
              : [min ?? 0],
    [value, defaultValue, min],
  );

  return (
    <BaseSlider.Root
      data-slot="slider"
      defaultValue={defaultValue}
      value={value}
      min={min}
      max={max}
      {...props}
    >
      <BaseSlider.Control
        className={cn("flex w-32 touch-none items-center select-none", className)}
        data-slot="slider-control"
      >
        <BaseSlider.Track
          className={cn("h-1 w-full rounded-full bg-muted inset-ring inset-ring-input select-none")}
          data-slot="slider-track"
        >
          <BaseSlider.Indicator
            className={cn("rounded-full bg-accent select-none data-disabled:opacity-50")}
            data-slot="slider-indicator"
          />
          {Array.from({ length: _values.length }).map((_, index) => (
            <BaseSlider.Thumb
              key={index}
              className={(state) =>
                cn(
                  "h-4 w-5 rounded-full bg-white shadow-xs ring ring-input transition-transform select-none before:hidden data-disabled:cursor-not-allowed data-disabled:bg-muted",
                  state.dragging &&
                    state.activeThumbIndex === index &&
                    "scale-120 opacity-80 backdrop-blur-md",
                )
              }
              data-slot="slider-thumb"
              index={index}
            />
          ))}
        </BaseSlider.Track>
      </BaseSlider.Control>
    </BaseSlider.Root>
  );
}

API Reference

This component does not add any props on top of Base UI Slider.Root. See the Base UI docs for the full API reference.