Headless range controls
Build the slider your product actually needs.
Ranger provides headless primitives for range and multi-range sliders, leaving the track, thumbs, labels, ticks, and product UI completely under your control.
00.0 MillionTotal Downloads000,000,000Weekly Downloads0GitHub StarsHeadless track
bring your own UI and semantics
Multi-thumb
ranges, bounds, steps, constraints
React hooks
range math without a slider skin
useRanger({ getRangerElement: () => rangerRef.current,
min: 0, max: 1000,
stepSize: 10, values: [120, 310, 640],
onChange: instance => setValues(instance.sortedValues) })
Why Ranger
Once a slider needs multiple thumbs, custom labels, controlled values, meaningful ticks, and a design system skin, a prebuilt UI becomes the wrong abstraction. Ranger keeps the hard math below your component.
Ranger gives interaction state and range math without rendering the track, thumbs, labels, or layout for you.
Build price filters, timelines, editors, split ranges, or multi-thumb controls with bounds and steps handled predictably.
Display percentages, dates, currency, logarithmic labels, marks, or custom annotations from the same headless primitives.
Ranger is useful precisely because it does not become your design system. It stays under the component you actually need.
Start with one value, two bounds, or a set of range handles.
Map percentages and segments into your own track UI.
Render handles with labels, tooltips, constraints, and focus state.
Send final values into filters, charts, editors, or forms.
Slider lifecycle
Ranger helps translate values into interactive geometry. Your app decides what those values mean and how the user should see them.
Example
The example stays simple on purpose: hooks provide the behavior, and the component owns the rendered slider.
Open source ecosystem
Maintainers, examples, partners, and GitHub sponsors keep the headless range primitive useful without turning it into a UI kit.