A useful interval
Project search
Set the lower and upper budget. Neither endpoint can cross the other.
Sets an ordered numeric interval with two named native range controls and visible endpoint values.
Project search
Set the lower and upper budget. Neither endpoint can cross the other.
Three ways in. They share one source, so the pixels match whichever you pick.
npm install @noorddev/vlak-react
// once, next to your app's root
import "@noorddev/vlak-react/css";
import { RangeSlider } from "@noorddev/vlak-react";Precompiled React and one stylesheet. No compiler to configure. Per-component imports work too: @noorddev/vlak-react/components/range-slider.
npx @noorddev/vlak-cli add range-slider
The StyleX leaf lands in components/vlak/ with its dependencies, for your own compiler to own. See StyleX.
npx shadcn add https://vlak.dev/r/range-slider.json
The same registry item, installed by shadcn's CLI.
<link rel="stylesheet" href="node_modules/@noorddev/vlak/css/vlak.css" />
No React. Link vlak.css and use the markup and classes below.
import { RangeSlider } from "@noorddev/vlak-react";
<RangeSlider label="Budget" name="budget" defaultValue={[120, 420]} min={0} max={800} step={20} formatValue={(value) => `€${value}`} />| Prop | Type | Default | Description |
|---|---|---|---|
value | [number, number] | ||
defaultValue | [number, number] | ||
onValueChange | (value: [number, number]) => void | ||
min | number | 0 | |
max | number | 100 | |
step | number | 1 | |
label | ReactNode | "Range" | |
lowerLabel | string | "From" | |
upperLabel | string | "To" | |
name | string | ||
disabled | boolean | ||
formatValue | (value: number) => string | String |
Also accepts Omit<HTMLAttributes<HTMLFieldSetElement>, "onChange" | "defaultValue">.
| Keys | Does |
|---|---|
| Tab | Moves between the lower and upper native range inputs. |
| Arrow keys, Home, End | Uses the browser's native range stepping within the other endpoint's bounds. |
<fieldset class="rs-range-slider"><legend class="rs-range-slider-legend">Budget</legend><div class="rs-range-slider-row"><label class="rs-range-slider-label" for="budget-from">From</label><input class="rs-range-slider-input" id="budget-from" type="range" min="0" max="800" value="120" /><output class="rs-range-slider-output" for="budget-from">120</output></div><div class="rs-range-slider-row"><label class="rs-range-slider-label" for="budget-to">To</label><input class="rs-range-slider-input" id="budget-to" type="range" min="120" max="800" value="420" /><output class="rs-range-slider-output" for="budget-to">420</output></div></fieldset>