Slider

An input where the user selects a value or range from within a given range, with full keyboard, touch, and RTL support.

Default

The slider renders one thumb per entry in value or defaultValue.

tsx

import { Slider } from "@hummingbirdui/react";

export default function SliderDefault() {
  return (
    <Slider
      defaultValue={[50]}
      aria-label="Volume"
      className="mx-auto max-w-sm"
    />
  );
}

Range

Multiple values create a range slider; minStepsBetweenThumbs keeps the thumbs from overlapping.

tsx

import { Slider } from "@hummingbirdui/react";

export default function SliderRange() {
  return (
    <Slider
      defaultValue={[25, 75]}
      minStepsBetweenThumbs={10}
      aria-label="Price range"
      className="mx-auto max-w-sm"
    />
  );
}

Colors

The color prop switches the slider's color scheme.

tsx

import { Slider } from "@hummingbirdui/react";

const colors = [
  "primary",
  "secondary",
  "info",
  "success",
  "warning",
  "danger",
  "neutral",
] as const;

export default function SliderColors() {
  return (
    <div className="mx-auto flex max-w-sm flex-col gap-4">
      {colors.map((color) => (
        <Slider
          key={color}
          color={color}
          defaultValue={[50]}
          aria-label={`${color} slider`}
        />
      ))}
    </div>
  );
}

Sizes

The size prop scales the track and thumb.

tsx

import { Slider } from "@hummingbirdui/react";

export default function SliderSizes() {
  return (
    <div className="mx-auto flex max-w-sm flex-col gap-4">
      <Slider size="sm" defaultValue={[50]} aria-label="Small slider" />
      <Slider defaultValue={[50]} aria-label="Default slider" />
      <Slider size="lg" defaultValue={[50]} aria-label="Large slider" />
    </div>
  );
}

Vertical

orientation="vertical" renders a vertical slider; the height comes from the container.

tsx

import { Slider } from "@hummingbirdui/react";

export default function SliderVertical() {
  return (
    <div className="flex h-56 justify-center gap-10">
      <Slider
        orientation="vertical"
        defaultValue={[50]}
        aria-label="Volume"
      />
      <Slider
        orientation="vertical"
        defaultValue={[25, 75]}
        color="success"
        aria-label="Range"
      />
    </div>
  );
}

Controlled

value with onValueChange controls the slider, for displaying or syncing the current value.

Budget$250

tsx

import * as React from "react";
import { Slider } from "@hummingbirdui/react";

export default function SliderControlled() {
  const [value, setValue] = React.useState([250]);

  return (
    <div className="mx-auto max-w-sm">
      <div className="mb-2 flex items-center justify-between text-sm">
        <span className="font-medium">Budget</span>
        <span className="text-muted">${value[0]}</span>
      </div>
      <Slider
        value={value}
        onValueChange={setValue}
        max={500}
        step={10}
        aria-label="Budget"
      />
    </div>
  );
}

Disabled

The disabled prop prevents interaction and mutes the colors.

tsx

import { Slider } from "@hummingbirdui/react";

export default function SliderDisabled() {
  return (
    <Slider
      defaultValue={[50]}
      disabled
      aria-label="Disabled slider"
      className="mx-auto max-w-sm"
    />
  );
}

API Reference

Built on the Radix UI Slider primitive. All props are forwarded to the Radix root.

Slider

PropTypeDefault
defaultValuenumber[]
valuenumber[]
onValueChangefunction
onValueCommitfunction
colorenum"primary"
sizeenum"md"
namestring
disabledbooleanfalse
orientationenum"horizontal"
direnum
invertedbooleanfalse
minnumber0
maxnumber100
stepnumber1
minStepsBetweenThumbsnumber0
formstring
classNamestring

Data attributeValues
[data-disabled]Present when disabled
[data-orientation]vertical | horizontal

Keyboard Interactions

The slider follows the WAI-ARIA slider pattern: arrow keys move the focused thumb by a step, Page Up/Page Down move by larger steps, and Home/End jump to the minimum and maximum.

Styling

The slider component utilizes several CSS variables for customization, defined on the root's slider class. The track tint is derived from --slider-color automatically.

.slider {
  --slider-color: var(--color-primary);
  --slider-height: --spacing(6);
  --slider-thumb-width: --spacing(5);
  --slider-thumb-height: --spacing(5);
  --slider-thumb-border-radius: calc(infinity * 1px);
  --slider-thumb-box-shadow: --alpha(var(--slider-color) / 16%) 0px 0px 0px 8px;
  --slider-track-height: --spacing(1.5);
  --slider-track-border-radius: var(--radius-sm);
}