Slider
An input component that allows users to select a value or range from a continuous or discrete set of values by dragging a thumb along a track.
Anatomy
<script>
import {
Slider,
SliderRoot,
SliderControl,
SliderTrack,
SliderRange,
SliderThumb,
SliderLabel,
SliderValueText,
SliderMarkerGroup,
SliderMarker,
} from "@saas-ui/svelte/components/slider";
</script>
<Slider.Root defaultValue={[50]}>
<Slider.Label>Volume</Slider.Label>
<Slider.ValueText />
<Slider.Control>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb index={0} />
</Slider.Control>
<Slider.MarkerGroup>
<Slider.Marker value={25}>25%</Slider.Marker>
<Slider.Marker value={50}>50%</Slider.Marker>
<Slider.Marker value={75}>75%</Slider.Marker>
</Slider.MarkerGroup>
</Slider.Root>Examples
Basic Accessibility
<Slider.Root defaultValue={[40]} class="w-[200px]" aria-label="Slider">
<Slider.Control>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb index={0} />
</Slider.Control>
</Slider.Root> Change End Accessibility
onValueChangeEnd to capture the final value after dragging.
<Stack gap={3} class="w-[240px]">
<Slider.Root
value={changeValue}
onValueChange={(details) => (changeValue = details.value)}
onValueChangeEnd={(details) => (changeEndValue = details.value)}
aria-label="Slider"
>
<Slider.Control>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb index={0} />
</Slider.Control>
</Slider.Root>
<Stack gap={1}>
<Code size="sm">onChange: <strong>{changeValue[0]}</strong></Code>
<Code size="sm"
>onChangeEnd: <strong>{changeEndValue[0]}</strong></Code>
</Stack>
</Stack> Colours Accessibility
colour prop to change the colour theme.
<VStack gap={4}>
{#each colours as colour}
<HStack gap={4} class="items-center">
<Text size="xs" class="w-16">{colour}</Text>
<Slider.Root
defaultValue={[40]}
{colour}
variant="outline"
class="w-[160px]"
aria-label="Slider {colour} outline"
>
<Slider.Control>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb index={0} />
</Slider.Control>
</Slider.Root>
<Slider.Root
defaultValue={[40]}
{colour}
variant="solid"
class="w-[160px]"
aria-label="Slider {colour} solid"
>
<Slider.Control>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb index={0} />
</Slider.Control>
</Slider.Root>
</HStack>
{/each}
</VStack> Controlled Accessibility
value and onValueChange props for controlled sliders.
<Stack gap={4} class="items-start">
<Slider.Root
bind:value={controlledValue}
onValueChange={(details) => (controlledValue = details.value)}
class="w-[200px]"
>
<Slider.Label>Value: {controlledValue[0]}</Slider.Label>
<Slider.Control>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb index={0} />
</Slider.Control>
</Slider.Root>
<Text size="sm" class="text-fg-muted"
>Current value: {controlledValue[0]}</Text>
</Stack> Disabled Accessibility
disabled prop to disable the slider.
<Slider.Root
defaultValue={[40]}
disabled
class="w-[200px]"
aria-label="Disabled slider"
>
<Slider.Control>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb index={0} />
</Slider.Control>
</Slider.Root> Label Accessibility
Slider.Label component to add a label to the slider.
<Slider.Root defaultValue={[40]} class="w-[200px]">
<Slider.Label>Quantity</Slider.Label>
<Slider.Control>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb index={0} />
</Slider.Control>
</Slider.Root> Marks Accessibility
Slider.MarkerGroup and Slider.Marker components to display value markers.
<Stack gap={4}>
{#each sliderSizes as size}
<Stack gap={2} class="items-start">
<Slider.Root
defaultValue={[40]}
{size}
colour="pink"
class="w-[200px]"
aria-label="Slider {size}"
>
<Slider.Control>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb index={0} />
</Slider.Control>
<Slider.MarkerGroup>
<Slider.Marker value={0} />
<Slider.Marker value={50} />
<Slider.Marker value={100} />
</Slider.MarkerGroup>
</Slider.Root>
<Text>size = {size}</Text>
</Stack>
{/each}
</Stack> Range Accessibility
<Slider.Root
defaultValue={[30, 60]}
class="w-[200px]"
aria-label="Range slider"
>
<Slider.Control>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb index={0} />
<Slider.Thumb index={1} />
</Slider.Control>
</Slider.Root> Sizes Accessibility
size prop to change the size of the slider.
<Stack gap={6} class="w-[200px]">
{#each sliderSizes as size}
<Slider.Root defaultValue={[40]} {size}>
<Slider.Label>slider - {size}</Slider.Label>
<Slider.Control>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb index={0} />
</Slider.Control>
</Slider.Root>
{/each}
</Stack> Steps Accessibility
step prop to set increment values.
<Slider.Root defaultValue={[40]} step={10} class="w-[200px]">
<Slider.Label>Step: 10</Slider.Label>
<Slider.Control>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb index={0} />
</Slider.Control>
</Slider.Root> Variants Accessibility
variant prop to change the visual style.
<Stack gap={6} class="w-[200px]">
{#each sliderVariants as variant}
<Slider.Root defaultValue={[40]} {variant}>
<Slider.Label>slider - {variant}</Slider.Label>
<Slider.Control>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb index={0} />
</Slider.Control>
</Slider.Root>
{/each}
</Stack> Vertical Accessibility
orientation="vertical" for vertical sliders.
<Slider.Root
defaultValue={[40]}
orientation="vertical"
class="h-[200px]"
aria-label="Vertical slider"
>
<Slider.Control>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb index={0} />
</Slider.Control>
</Slider.Root>Props
Slider.Root
The slider container that provides context to all child components.
| Prop | Type | Default | Description |
|---|---|---|---|
children | Snippet | - | Content to render inside the slider (composition API). |
class | string | - | Additional CSS classes to apply. |
size | "sm" | "md" | "lg" | "md" | The size of the slider. |
variant | "outline" | "solid" | "outline" | The visual variant of the slider. |
orientation | "horizontal" | "vertical" | "horizontal" | The orientation of the slider. |
colour | ColourName | "gray" | The colour palette. |
disabled | boolean | false | Whether the slider is disabled. |
value | number[] | - | The controlled value of the slider. |
defaultValue | number[] | - | The initial value of the slider. |
min | number | 0 | The minimum value of the slider. |
max | number | 100 | The maximum value of the slider. |
step | number | 1 | The step value of the slider. |
name | string | - | The name for the hidden input. |
onValueChange | (details: { value: number[] }) => void | - | Function invoked when the value changes. |
onValueChangeEnd | (details: { value: number[] }) => void | - | Function invoked when the value change ends. |
Slider.Control
The control container that holds the track and thumb.
| Prop | Type | Default | Description |
|---|---|---|---|
children | Snippet | - | Content to render inside the control (typically Track and Thumb). |
class | string | - | Additional CSS classes to apply. |
Slider.Track
The track that shows the slider's range.
| Prop | Type | Default | Description |
|---|---|---|---|
children | Snippet | - | Content to render inside the track (typically Range). |
class | string | - | Additional CSS classes to apply. |
Slider.Range
The filled range portion of the track.
| Prop | Type | Default | Description |
|---|---|---|---|
class | string | - | Additional CSS classes to apply. |
Slider.Thumb
The draggable thumb element.
| Prop | Type | Default | Description |
|---|---|---|---|
index | number | - | The index of the thumb (for range sliders, 0 for first thumb, 1 for second, etc). |
children | Snippet | - | Content to render inside the thumb. |
class | string | - | Additional CSS classes to apply. |
name | string | - | The name for the hidden input. |
Slider.Label
The label for the slider.
| Prop | Type | Default | Description |
|---|---|---|---|
children | Snippet | - | Content to render as the label. |
class | string | - | Additional CSS classes to apply. |
Slider.ValueText
Displays the current slider value.
| Prop | Type | Default | Description |
|---|---|---|---|
children | Snippet | - | Content to render as the value text. |
class | string | - | Additional CSS classes to apply. |
Slider.MarkerGroup
Container for slider markers.
| Prop | Type | Default | Description |
|---|---|---|---|
children | Snippet | - | Content to render inside the marker group (typically Marker components). |
class | string | - | Additional CSS classes to apply. |
Slider.Marker
Individual marker for indicating specific values on the slider.
| Prop | Type | Default | Description |
|---|---|---|---|
value | number | - | The value at which to place the marker. |
children | Snippet | - | Content to render inside the marker. |
class | string | - | Additional CSS classes to apply. |
showDot | boolean | true | Whether to show a dot indicator. |