slider component
Drop-in semantic component. See examples, sizes, variants, and source.
Range and single-value slider built from a slider-container
wrapping a slider with slider-track,
slider-fill, and one or two slider-handle
children. Drag, keyboard, and value broadcasting are mounted by
slider.js.
Slider Component
Basic Slider
<div class="stack">
<div class="slider-container">
<div class="slider-header">
<label class="slider-label">Volume</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 50%"></div>
<div
class="slider-handle"
style="left: 50%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="50"
tabindex="0"
>
<div class="slider-tooltip">50%</div>
</div>
</div>
</div>
<div class="slider-value">50%</div>
</div>
<div class="slider-container">
<div class="slider-header">
<label class="slider-label">Brightness</label>
<span class="slider-sublabel">(Optional)</span>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 75%"></div>
<div
class="slider-handle"
style="left: 75%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="75"
tabindex="0"
>
<div class="slider-tooltip">75%</div>
</div>
</div>
</div>
<div class="slider-value">75%</div>
</div>
</div>
Size Variants
<div class="space-y-6">
<div class="slider-container xs">
<div class="slider-header">
<label class="slider-label">Tiny Slider</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 30%"></div>
<div
class="slider-handle"
style="left: 30%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="30"
tabindex="0"
>
<div class="slider-tooltip">30%</div>
</div>
</div>
</div>
<div class="slider-value">30%</div>
</div>
<div class="slider-container sm">
<div class="slider-header">
<label class="slider-label">Small Slider</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 45%"></div>
<div
class="slider-handle"
style="left: 45%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="45"
tabindex="0"
>
<div class="slider-tooltip">45%</div>
</div>
</div>
</div>
<div class="slider-value">45%</div>
</div>
<div class="slider-container">
<div class="slider-header">
<label class="slider-label">Default Slider</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 60%"></div>
<div
class="slider-handle"
style="left: 60%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="60"
tabindex="0"
>
<div class="slider-tooltip">60%</div>
</div>
</div>
</div>
<div class="slider-value">60%</div>
</div>
<div class="slider-container xl">
<div class="slider-header">
<label class="slider-label">Large Slider</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 70%"></div>
<div
class="slider-handle"
style="left: 70%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="70"
tabindex="0"
>
<div class="slider-tooltip">70%</div>
</div>
</div>
</div>
<div class="slider-value">70%</div>
</div>
<div class="slider-container lg">
<div class="slider-header">
<label class="slider-label">Big Slider</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 85%"></div>
<div
class="slider-handle"
style="left: 85%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="85"
tabindex="0"
>
<div class="slider-tooltip">85%</div>
</div>
</div>
</div>
<div class="slider-value">85%</div>
</div>
</div>
Color Variants
<div class="stack">
<div class="slider-container primary">
<div class="slider-header">
<label class="slider-label">Primary</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 40%"></div>
<div
class="slider-handle"
style="left: 40%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="40"
tabindex="0"
>
<div class="slider-tooltip">40%</div>
</div>
</div>
</div>
</div>
<div class="slider-container positive">
<div class="slider-header">
<label class="slider-label">Positive</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 80%"></div>
<div
class="slider-handle"
style="left: 80%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="80"
tabindex="0"
>
<div class="slider-tooltip">80%</div>
</div>
</div>
</div>
</div>
<div class="slider-container negative">
<div class="slider-header">
<label class="slider-label">Negative</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 25%"></div>
<div
class="slider-handle"
style="left: 25%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="25"
tabindex="0"
>
<div class="slider-tooltip">25%</div>
</div>
</div>
</div>
</div>
<div class="slider-container warning">
<div class="slider-header">
<label class="slider-label">Warning</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 60%"></div>
<div
class="slider-handle"
style="left: 60%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="60"
tabindex="0"
>
<div class="slider-tooltip">60%</div>
</div>
</div>
</div>
</div>
<div class="slider-container info">
<div class="slider-header">
<label class="slider-label">Info</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 55%"></div>
<div
class="slider-handle"
style="left: 55%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="55"
tabindex="0"
>
<div class="slider-tooltip">55%</div>
</div>
</div>
</div>
</div>
</div>
Extended Color Palette
<div class="grid grid-cols-2 gap-4">
<div class="slider-container red">
<label class="slider-label">Red</label>
<div class="slider">
<div class="slider-track">
<div class="slider-fill" style="width: 50%"></div>
<div
class="slider-handle"
style="left: 50%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="50"
>
<div class="slider-tooltip">50%</div>
</div>
</div>
</div>
</div>
<div class="slider-container orange">
<label class="slider-label">Orange</label>
<div class="slider">
<div class="slider-track">
<div class="slider-fill" style="width: 50%"></div>
<div
class="slider-handle"
style="left: 50%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="50"
>
<div class="slider-tooltip">50%</div>
</div>
</div>
</div>
</div>
<div class="slider-container yellow">
<label class="slider-label">Yellow</label>
<div class="slider">
<div class="slider-track">
<div class="slider-fill" style="width: 50%"></div>
<div
class="slider-handle"
style="left: 50%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="50"
>
<div class="slider-tooltip">50%</div>
</div>
</div>
</div>
</div>
<div class="slider-container green">
<label class="slider-label">Green</label>
<div class="slider">
<div class="slider-track">
<div class="slider-fill" style="width: 50%"></div>
<div
class="slider-handle"
style="left: 50%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="50"
>
<div class="slider-tooltip">50%</div>
</div>
</div>
</div>
</div>
<div class="slider-container teal">
<label class="slider-label">Teal</label>
<div class="slider">
<div class="slider-track">
<div class="slider-fill" style="width: 50%"></div>
<div
class="slider-handle"
style="left: 50%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="50"
>
<div class="slider-tooltip">50%</div>
</div>
</div>
</div>
</div>
<div class="slider-container blue">
<label class="slider-label">Blue</label>
<div class="slider">
<div class="slider-track">
<div class="slider-fill" style="width: 50%"></div>
<div
class="slider-handle"
style="left: 50%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="50"
>
<div class="slider-tooltip">50%</div>
</div>
</div>
</div>
</div>
<div class="slider-container violet">
<label class="slider-label">Violet</label>
<div class="slider">
<div class="slider-track">
<div class="slider-fill" style="width: 50%"></div>
<div
class="slider-handle"
style="left: 50%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="50"
>
<div class="slider-tooltip">50%</div>
</div>
</div>
</div>
</div>
<div class="slider-container purple">
<label class="slider-label">Purple</label>
<div class="slider">
<div class="slider-track">
<div class="slider-fill" style="width: 50%"></div>
<div
class="slider-handle"
style="left: 50%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="50"
>
<div class="slider-tooltip">50%</div>
</div>
</div>
</div>
</div>
<div class="slider-container pink">
<label class="slider-label">Pink</label>
<div class="slider">
<div class="slider-track">
<div class="slider-fill" style="width: 50%"></div>
<div
class="slider-handle"
style="left: 50%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="50"
>
<div class="slider-tooltip">50%</div>
</div>
</div>
</div>
</div>
</div>
Stepped Slider
<div class="stack">
<div class="slider-container">
<div class="slider-header">
<label class="slider-label">Step by 10</label>
</div>
<div class="slider" data-step="10">
<div class="slider-track">
<div class="slider-fill" style="width: 40%"></div>
<div
class="slider-handle"
style="left: 40%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="40"
tabindex="0"
>
<div class="slider-tooltip">40%</div>
</div>
</div>
<div class="slider-marks">
<span class="slider-mark" style="left: 0%">0</span>
<span class="slider-mark" style="left: 20%">20</span>
<span class="slider-mark" style="left: 40%">40</span>
<span class="slider-mark" style="left: 60%">60</span>
<span class="slider-mark" style="left: 80%">80</span>
<span class="slider-mark" style="left: 100%">100</span>
</div>
</div>
<div class="slider-value">40%</div>
</div>
<div class="slider-container primary">
<div class="slider-header">
<label class="slider-label">Step by 25</label>
</div>
<div class="slider" data-step="25">
<div class="slider-track">
<div class="slider-fill" style="width: 75%"></div>
<div
class="slider-handle"
style="left: 75%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="75"
tabindex="0"
>
<div class="slider-tooltip">75%</div>
</div>
</div>
<div class="slider-marks">
<span class="slider-mark" style="left: 0%">0</span>
<span class="slider-mark" style="left: 25%">25</span>
<span class="slider-mark" style="left: 50%">50</span>
<span class="slider-mark" style="left: 75%">75</span>
<span class="slider-mark" style="left: 100%">100</span>
</div>
</div>
<div class="slider-value">75%</div>
</div>
</div>
Range Slider (Two Handles)
<div class="stack">
<div class="slider-container range primary">
<div class="slider-header">
<label class="slider-label">Price Range</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="left: 25%; width: 35%"></div>
<div
class="slider-handle"
style="left: 25%"
role="slider"
data-handle="min"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="25"
tabindex="0"
>
<div class="slider-tooltip">$25</div>
</div>
<div
class="slider-handle"
style="left: 60%"
role="slider"
data-handle="max"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="60"
tabindex="0"
>
<div class="slider-tooltip">$60</div>
</div>
</div>
</div>
<div class="slider-value">$25 - $60</div>
</div>
<div class="slider-container range positive">
<div class="slider-header">
<label class="slider-label">Time Range</label>
</div>
<div class="slider" data-step="5">
<div class="slider-track">
<div class="slider-fill" style="left: 30%; width: 40%"></div>
<div
class="slider-handle"
style="left: 30%"
role="slider"
data-handle="min"
aria-valuemin="0"
aria-valuemax="24"
aria-valuenow="7.2"
tabindex="0"
>
<div class="slider-tooltip">07:12</div>
</div>
<div
class="slider-handle"
style="left: 70%"
role="slider"
data-handle="max"
aria-valuemin="0"
aria-valuemax="24"
aria-valuenow="16.8"
tabindex="0"
>
<div class="slider-tooltip">16:48</div>
</div>
</div>
</div>
<div class="slider-value">07:12 - 16:48</div>
</div>
</div>
Custom Value Ranges
<div class="stack">
<div class="slider-container warning">
<div class="slider-header">
<label class="slider-label">Temperature</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 55%"></div>
<div
class="slider-handle"
style="left: 55%"
role="slider"
aria-valuemin="0"
aria-valuemax="40"
aria-valuenow="22"
tabindex="0"
>
<div class="slider-tooltip">22°C</div>
</div>
</div>
</div>
<div class="slider-value">22°C</div>
</div>
<div class="slider-container positive">
<div class="slider-header">
<label class="slider-label">Budget</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 35%"></div>
<div
class="slider-handle"
style="left: 35%"
role="slider"
aria-valuemin="0"
aria-valuemax="10000"
aria-valuenow="3500"
tabindex="0"
>
<div class="slider-tooltip">$3,500</div>
</div>
</div>
</div>
<div class="slider-value">$3,500</div>
</div>
</div>
Vertical Orientation
<div class="row spacious">
<div class="slider-container vertical" style="height: 200px">
<label class="slider-label">Volume</label>
<div class="slider vertical" style="height: 150px">
<div class="slider-track">
<div class="slider-fill" style="height: 60%"></div>
<div
class="slider-handle"
style="bottom: 60%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="60"
tabindex="0"
>
<div class="slider-tooltip">60%</div>
</div>
</div>
</div>
<div class="slider-value">60%</div>
</div>
<div class="slider-container vertical primary" style="height: 200px">
<label class="slider-label">Bass</label>
<div class="slider vertical" style="height: 150px">
<div class="slider-track">
<div class="slider-fill" style="height: 40%"></div>
<div
class="slider-handle"
style="bottom: 40%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="40"
tabindex="0"
>
<div class="slider-tooltip">40%</div>
</div>
</div>
</div>
<div class="slider-value">40%</div>
</div>
<div class="slider-container vertical positive" style="height: 200px">
<label class="slider-label">Treble</label>
<div class="slider vertical" style="height: 150px">
<div class="slider-track">
<div class="slider-fill" style="height: 75%"></div>
<div
class="slider-handle"
style="bottom: 75%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="75"
tabindex="0"
>
<div class="slider-tooltip">75%</div>
</div>
</div>
</div>
<div class="slider-value">75%</div>
</div>
</div>
Live Update Example
Live Preview
Drag the slider to change opacity
<div class="stack">
<div class="slider-container primary" data-live-update="true">
<div class="slider-header">
<label class="slider-label">Opacity Control</label>
<span class="live-value text-blue-600 font-semibold ml-auto">70%</span>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 70%"></div>
<div
class="slider-handle"
style="left: 70%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="70"
tabindex="0"
>
<div class="slider-tooltip">70%</div>
</div>
</div>
</div>
</div>
<div
class="preview-box bg-blue-600 text-white p-8 rounded-lg text-center transition-opacity"
style="opacity: 0.7"
>
<p class="text-lg font-semibold">Live Preview</p>
<p>Drag the slider to change opacity</p>
</div>
</div>
Disabled State
<div class="slider-container disabled">
<div class="slider-header">
<label class="slider-label">Disabled Slider</label>
</div>
<div class="slider" data-step="1">
<div class="slider-track">
<div class="slider-fill" style="width: 50%"></div>
<div
class="slider-handle"
style="left: 50%"
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="50"
aria-disabled="true"
tabindex="-1"
>
<div class="slider-tooltip">50%</div>
</div>
</div>
</div>
<div class="slider-value">50%</div>
</div>
Combined Features Example
<div class="space-y-6">
<div class="slider-container range xl purple">
<div class="slider-header">
<label class="slider-label">Weekly Promotion Preferences</label>
<span class="slider-sublabel">(Select range)</span>
</div>
<div class="slider" data-step="10">
<div class="slider-track">
<div class="slider-fill" style="left: 20%; width: 50%"></div>
<div
class="slider-handle"
style="left: 20%"
role="slider"
data-handle="min"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="20"
tabindex="0"
>
<div class="slider-tooltip">20%</div>
</div>
<div
class="slider-handle"
style="left: 70%"
role="slider"
data-handle="max"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="70"
tabindex="0"
>
<div class="slider-tooltip">70%</div>
</div>
</div>
<div class="slider-marks">
<span class="slider-mark" style="left: 0%">Min</span>
<span class="slider-mark" style="left: 50%">50%</span>
<span class="slider-mark" style="left: 100%">Max</span>
</div>
</div>
<div class="slider-value">20% - 70%</div>
</div>
<div class="grid grid-cols-3 gap-4">
<div class="slider-container sm red">
<label class="slider-label text-xs">R</label>
<div class="slider">
<div class="slider-track">
<div class="slider-fill" style="width: 85%"></div>
<div
class="slider-handle"
style="left: 85%"
role="slider"
aria-valuemin="0"
aria-valuemax="255"
aria-valuenow="217"
>
<div class="slider-tooltip">217</div>
</div>
</div>
</div>
</div>
<div class="slider-container sm green">
<label class="slider-label text-xs">G</label>
<div class="slider">
<div class="slider-track">
<div class="slider-fill" style="width: 60%"></div>
<div
class="slider-handle"
style="left: 60%"
role="slider"
aria-valuemin="0"
aria-valuemax="255"
aria-valuenow="153"
>
<div class="slider-tooltip">153</div>
</div>
</div>
</div>
</div>
<div class="slider-container sm blue">
<label class="slider-label text-xs">B</label>
<div class="slider">
<div class="slider-track">
<div class="slider-fill" style="width: 40%"></div>
<div
class="slider-handle"
style="left: 40%"
role="slider"
aria-valuemin="0"
aria-valuemax="255"
aria-valuenow="102"
>
<div class="slider-tooltip">102</div>
</div>
</div>
</div>
</div>
</div>
</div>
Class API Reference
| Type |
Class |
Usage |
Notes |
| Base |
slider-container |
Outer wrapper — owns size, color, layout |
Always required |
slider |
Inner slider element holding track + handles |
Carries data-step for step size |
slider-track |
The bar the handle rides on |
Hosts the fill + handles |
slider-fill |
Filled portion of the track |
Width set inline as a percentage |
slider-handle |
Draggable thumb |
Range sliders use two with data-handle="min|max" |
slider-tooltip |
Floating value bubble on the handle |
Shown on hover/focus/active |
slider-marks / slider-mark |
Tick-mark labels under the track |
Position via inline left: % |
slider-header / slider-label / slider-sublabel / slider-value |
Optional caption pieces |
Place inside slider-container |
| Sizes |
xs |
Tiny — 1px track, 12px handle |
Modifier on slider-container |
sm |
Small — 1.5px track, 16px handle |
Modifier on slider-container |
| (default) |
Medium — 2px track, 20px handle |
No size class needed |
xl |
Large — 2.5px track, 24px handle |
Modifier on slider-container |
lg |
Big — 3px track, 28px handle |
Modifier on slider-container |
| Intents |
primary |
Blue fill + handle |
Modifier on slider-container |
positive |
Green fill + handle |
Modifier on slider-container |
negative |
Red fill + handle |
Modifier on slider-container |
warning |
Yellow fill + handle |
Modifier on slider-container |
info |
Blue (lighter) fill + handle |
Modifier on slider-container |
| Extended Palette |
red / orange / yellow / green / teal / blue / violet / purple / pink |
Direct palette colors |
Use intents (primary/positive/...) when possible |
| States |
disabled |
Greyed out, cannot drag |
Modifier on slider-container |
| Layout |
range |
Two-handle range slider |
Add data-handle="min|max" to each handle |
vertical |
Vertical orientation |
Add to both slider-container and slider; set explicit height |