Slider

Selects one value from a range. 2px track, 14px thumb, 24px hit area.

Ink

Density

Use it for

  • A number inside a known range where the position matters more than the digits.
  • Volume, opacity, zoom, and similar live values.

Not for

  • Exact values; use Input type="number".
  • Ranges with two thumbs; the component has one.

Three ways in. They share one source, so the pixels match whichever you pick.

1. Import the package

npm install @noorddev/vlak-react

// once, next to your app's root
import "@noorddev/vlak-react/css";

import { Slider } from "@noorddev/vlak-react";

Precompiled React and one stylesheet. No compiler to configure. Per-component imports work too: @noorddev/vlak-react/components/slider.

2. Vendor the source

npx @noorddev/vlak-cli add slider

The StyleX leaf lands in components/vlak/, for your own compiler to own. See StyleX.

3. Through shadcn

npx shadcn add https://vlak.dev/r/slider.json

The same registry item, installed by shadcn's CLI.

CSS only

<link rel="stylesheet" href="node_modules/@noorddev/vlak/css/vlak.css" />

No React. Link vlak.css and use the markup and classes below.

import { useState } from "react";
import { Slider } from "@noorddev/vlak-react";

const [volume, setVolume] = useState(62);

<Slider value={volume} onValueChange={setVolume} min={0} max={100} step={1} aria-label="Volume" />

Slider

A native range input drives the ink track.

PropTypeDefaultDescription
valuenumber
defaultValuenumber50
minnumber0
maxnumber100
stepnumber1
onValueChange(value: number) => void

Also accepts Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "value" | "defaultValue" | "onChange">.

KeysDoes
TabMoves focus to the slider
Arrow right, Arrow upIncreases by step
Arrow left, Arrow downDecreases by step
Home, EndJumps to min or max
<div class="rs-slider"><span class="rs-slider-fill" style="width:62%"></span><span class="rs-slider-thumb" style="left:62%"></span></div>
.rs-slider.rs-slider-fill.rs-slider-thumb.rs-slider-thumb-focused.rs-slider-range