Range Slider

Five slider designs on one shared engine: stepped dots, a thumbless liquid fill, equalizer bars, a speed-reactive value bubble and a scrolling ruler. All handle dragging, arrow, Page and Home/End keys and controlled values, with 44px touch targets on coarse pointers.

Range Slider

range-slider.tsx

The base RangeSlider: a dot marks every step and the bar-shaped thumb gives a small hop each time it snaps to a new one; the dots can be turned off.

Range Slider Range Slider preview width

Install

$ bunx --bun shadcn add @karaui/range-slider
@karaui not found? Add it to components.json
{
  "registries": {
    "@karaui": "https://karaui.kamisama-v0.my.id/r/{name}.json"
  }
}

@karaui is in shadcn's public registry directory, so the latest CLI needs no setup. On an older CLI, merge this into the existing file once and every @karaui/… install resolves.

API Reference

showTicks?
boolean

Render a tick dot at each step.

true
className?
string
—
value?
number
—
defaultValue?
number
—
onValueChange?
((value: number) => void)
—
min?
number
—
max?
number
—
step?
number
—
disabled?
boolean
—
aria-label?
string
—
formatValueText?
((value: number) => string)

Announced instead of the raw number — pass one when the value carries a unit or a suffix ("72.5 kg", "35%"); a bare number needs no valueText.

—

Fluid Slider

range-slider-fluid.tsx

The whole pill is the control. A fill with a rounded cap flows to the value and the label text inverts where the fill sits under it; format controls the readout.

Range Slider Fluid Slider preview width

Install

$ bunx --bun shadcn add @karaui/range-slider-fluid

API Reference

label?
string

Text shown on the left of the track.

—
format?
((value: number) => string)

Formats the value shown on the right.

(v) => `${v}%`
className?
string
—
value?
number
—
defaultValue?
number
—
onValueChange?
((value: number) => void)
—
min?
number
—
max?
number
—
step?
number
—
disabled?
boolean
—
aria-label?
string
—
formatValueText?
((value: number) => string)

Announced instead of the raw number — pass one when the value carries a unit or a suffix ("72.5 kg", "35%"); a bare number needs no valueText.

—

Wave Slider

range-slider-wave.tsx

A row of bars swells into a crest centred on the value and sinks back as it moves on; bars before the value are filled, so the level reads at a glance.

Range Slider Wave Slider preview width

Install

$ bunx --bun shadcn add @karaui/range-slider-wave

API Reference

bars?
number

Number of bars drawn across the track.

32
className?
string
—
value?
number
—
defaultValue?
number
—
onValueChange?
((value: number) => void)
—
min?
number
—
max?
number
—
step?
number
—
disabled?
boolean
—
aria-label?
string
—
formatValueText?
((value: number) => string)

Announced instead of the raw number — pass one when the value carries a unit or a suffix ("72.5 kg", "35%"); a bare number needs no valueText.

—

Bubble Slider

range-slider-bubble.tsx

Pressing the thumb pops up a bubble with the current value that leans toward the direction of travel and flattens the faster you drag, straightening once you let go.

Range Slider Bubble Slider preview width

Install

$ bunx --bun shadcn add @karaui/range-slider-bubble

API Reference

format?
((value: number) => string)

Formats the value shown in the bubble.

—
className?
string
—
value?
number
—
defaultValue?
number
—
onValueChange?
((value: number) => void)
—
min?
number
—
max?
number
—
step?
number
—
disabled?
boolean
—
aria-label?
string
—
formatValueText?
((value: number) => string)

Announced instead of the raw number — pass one when the value carries a unit or a suffix ("72.5 kg", "35%"); a bare number needs no valueText.

—

Ruler Slider

range-slider-ruler.tsx

A fixed needle over a moving scale instead of a thumb: flick it and it coasts before resting on a tick. Major ticks carry labels, a unit can follow the number, and decimal steps keep their precision.

Range Slider Ruler Slider preview width

Install

$ bunx --bun shadcn add @karaui/range-slider-ruler

API Reference

gap?
number

Pixels between two steps.

14
majorEvery?
number

Label every Nth step; those ticks are drawn tall.

5
unit?
string

Unit shown next to the value.

—
className?
string
—
value?
number
—
defaultValue?
number
—
onValueChange?
((value: number) => void)
—
min?
number
—
max?
number
—
step?
number
—
disabled?
boolean
—
aria-label?
string
—
formatValueText?
((value: number) => string)

Announced instead of the raw number — pass one when the value carries a unit or a suffix ("72.5 kg", "35%"); a bare number needs no valueText.

—

Updated