Skip to content

Slider

An input component that allows users to select a value from a range by dragging a thumb along a track.

---
import { Slider, SliderRange, SliderThumb, SliderTrack } from '@bejamas/ui/components/slider';
---
<Slider class="w-full max-w-sm" defaultValue={[50]} max={100}>
<SliderTrack>
<SliderRange />
</SliderTrack>
<SliderThumb />
</Slider>
Terminal window
bunx bejamas add slider
---
import { Slider, SliderTrack, SliderRange, SliderThumb } from '@bejamas/ui/components/slider';
---
<Slider defaultValue={[50]} max={100}>
<SliderTrack>
<SliderRange />
</SliderTrack>
<SliderThumb />
</Slider>

Use two thumbs to create a range slider for selecting a min and max value.

---
import { Slider, SliderRange, SliderThumb, SliderTrack } from '@bejamas/ui/components/slider';
---
<Slider class="w-full max-w-sm" defaultValue={[25, 75]} max={100}>
<SliderTrack>
<SliderRange />
</SliderTrack>
<SliderThumb />
<SliderThumb />
</Slider>

Set orientation to vertical for a vertical slider.

---
import { Slider, SliderRange, SliderThumb, SliderTrack } from '@bejamas/ui/components/slider';
---
<div class="h-48">
<Slider class="h-full" orientation="vertical" defaultValue={[50]} max={100}>
<SliderTrack>
<SliderRange />
</SliderTrack>
<SliderThumb />
</Slider>
</div>

Disable the slider to prevent interaction.

---
import { Slider, SliderRange, SliderThumb, SliderTrack } from '@bejamas/ui/components/slider';
---
<Slider class="w-full max-w-sm" defaultValue={[50]} max={100} disabled>
<SliderTrack>
<SliderRange />
</SliderTrack>
<SliderThumb />
</Slider>

Set a custom step increment.

---
import { Slider, SliderRange, SliderThumb, SliderTrack } from '@bejamas/ui/components/slider';
---
<Slider class="w-full max-w-sm" defaultValue={[50]} max={100} step={10}>
<SliderTrack>
<SliderRange />
</SliderTrack>
<SliderThumb />
</Slider>

The slider emits custom events that you can listen to:

EventDetailDescription
slider:change{ value: number | [number, number] }Fired on every value change (during drag)
slider:commit{ value: number | [number, number] }Fired when value is committed (pointer up or keyboard blur)
<Slider id="my-slider" defaultValue={[50]} max={100}>
<SliderTrack>
<SliderRange />
</SliderTrack>
<SliderThumb />
</Slider>
<script>
const slider = document.getElementById('my-slider');
slider.addEventListener('slider:change', (e) => {
console.log('Value changing:', e.detail.value);
});
slider.addEventListener('slider:commit', (e) => {
console.log('Value committed:', e.detail.value);
});
</script>

You can set the slider value programmatically by dispatching a slider:set event:

// Set single value
slider.dispatchEvent(new CustomEvent('slider:set', {
detail: { value: 75 }
}));
// Set range values
slider.dispatchEvent(new CustomEvent('slider:set', {
detail: { value: [25, 75] }
}));

The slider sets these data attributes that you can use for styling or querying state:

AttributeElementDescription
data-orientationsliderCurrent orientation (horizontal or vertical)
data-disabledsliderPresent when slider is disabled
data-draggingslider, thumbPresent during drag interaction
data-valuesliderCurrent value(s) as string (e.g., "50" or "25,75")