Skip to content

Slider

Range selector with single or dual thumbs, step snapping, marks, and keyboard arrow support.

Forms & Inputs·Available inReactVueAngular·View as Markdown

Preview

tsx

Value: 40

Switch the framework picker (top-right of the panel) to render the same demo live in React, Vue, or Angular — same class names, ARIA, and visual output across all three.

Playground

Flip props to see how the component responds. The snippet below updates as you change options.

Value: 50

Installation

Sisyphos UI ships unified packages for React, Vue, and Angular. Pick the one that matches your stack — every framework exports the same component classes, ARIA semantics, and CSS tokens.

$ pnpm add @sisyphos-ui/react

Then import the bundled stylesheet once at app entry: import "@sisyphos-ui/react/styles.css";

Usage

Idiomatic usage in each supported framework
import { useState } from "react";
import { Slider } from "@sisyphos-ui/react";

export const Volume = () => {
  const [v, setV] = useState(50);
  return <Slider value={v} onChange={setV} ariaLabel="Volume" showValue />;
};

Range

Pass two thumbs by adding `range` and a tuple value.

tsx

Range: 2080

Show value labels

Render live value bubbles above the thumbs via `showValue`.

tsx
60

Formatted values

`formatValue` lets you add currency, units, or locale formatting.

tsx
$120$480

Disabled

Works for both single and range modes.

tsx

Semantic colors

Reuse the 5-color palette shared across the library.

tsx

API

PropTypeDefaultDescription
valuenumber | [number, number]Current value (controlled); a tuple when `range` is set. Use `defaultValue` for uncontrolled.
onChange(value: number | [number, number]) => voidCalled with the next value on drag, track click, keyboard, or input edit.
minnumber0Lower bound of the track.
maxnumber100Upper bound of the track.
stepnumber1Snap increment for all interactions.
rangebooleanfalseTwo-thumb mode; `value` / `defaultValue` / `onChange` become tuples.
minGapnumber0Minimum gap kept between the two thumbs in range mode.
showValuebooleanfalseShow value labels above the thumbs.
formatValue(value: number) => stringStringFormats the value labels shown by `showValue`.
withInputsbooleanfalseIn range mode, render editable number inputs alongside the track for precise entry.
ariaLabelstring | [string, string]Accessible label(s) — a single string, or a tuple for the two range thumbs.
disabledbooleanfalseDisables all pointer and keyboard interaction.

The full API including refs, ARIA attributes, and HTML passthroughs lives in the package README on npm.

Accessibility

Adheres to the Slider WAI-ARIA design pattern.

  • Each thumb is a focusable <button> with role="slider" exposing aria-valuemin, aria-valuemax, and aria-valuenow.
  • In range mode aria-valuemin / aria-valuemax of each thumb are clamped to the other thumb (± minGap), so AT announces the real movable range.
  • Accessible names come from ariaLabel; range thumbs fall back to "Minimum" / "Maximum".
  • aria-disabled mirrors disabled and disabled thumbs are removed from the tab order (tabIndex={-1}).

Keyboard interactions

KeyAction
ArrowRightthenArrowUpIncreases the value by `step`.
ArrowLeftthenArrowDownDecreases the value by `step`.
PageUpIncreases the value by `step × 10`.
PageDownDecreases the value by `step × 10`.
HomeSets the thumb to its minimum (respects `minGap` in range mode).
EndSets the thumb to its maximum (respects `minGap` in range mode).
Need more?View on npm →
Was this page helpful?