An input to select a numeric value within a range.

Usage

Use the v-model directive to control the value of the Slider.

<script setup lang="ts">
const value = ref(50)
</script>

<template>
  <USlider v-model="value" />
</template>

Use the default-value prop to set the initial value when you do not need to control its state.

<template>
  <USlider :default-value="50" />
</template>

Min / Max

Use the min and max props to set the minimum and maximum values of the Slider. Defaults to 0 and 100.

<template>
  <USlider :min="0" :max="50" :default-value="50" />
</template>

Step

Use the step prop to set the increment value of the Slider. Defaults to 1.

<template>
  <USlider :step="10" :default-value="50" />
</template>

Multiple

Use the v-model directive or the default-value prop with an array of values to create a range Slider.

<script setup lang="ts">
const value = ref([
  25,
  75
])
</script>

<template>
  <USlider v-model="value" />
</template>

Use the min-steps-between-thumbs prop to limit the minimum distance between the thumbs.

<script setup lang="ts">
const value = ref([
  25,
  50,
  75
])
</script>

<template>
  <USlider v-model="value" :min-steps-between-thumbs="10" />
</template>

Orientation

Use the orientation prop to change the orientation of the Slider. Defaults to horizontal.

<template>
  <USlider orientation="vertical" :default-value="50" class="h-48" />
</template>

Color

Use the color prop to change the color of the Slider.

<template>
  <USlider color="neutral" :default-value="50" />
</template>

Size

Use the size prop to change the size of the Slider.

<template>
  <USlider size="xl" :default-value="50" />
</template>

Disabled

Use the disabled prop to disable the Slider.

<template>
  <USlider disabled :default-value="50" />
</template>

Inverted

Use the inverted prop to visually invert the Slider.

<template>
  <USlider inverted :default-value="25" />
</template>

API

Props

Prop Default Type
as

'div'

any

The element or component this component should render as.

modelValue

number | number[]

size

md

"md" | "xs" | "sm" | "lg" | "xl"

color

primary

"error" | "primary" | "secondary" | "success" | "info" | "warning" | "neutral"

orientation

"horizontal"

"vertical" | "horizontal"

The orientation of the slider.

defaultValue

number | number[]

The value of the slider when initially rendered. Use when you do not need to control the state of the slider.

max

100

number

The maximum value for the range.

disabled

boolean

When true, prevents the user from interacting with the slider.

name

string

step

1

number

The stepping interval.

min

0

number

The minimum value for the range.

inverted

boolean

Whether the slider is visually inverted.

minStepsBetweenThumbs

number

The minimum permitted steps between multiple thumbs.

ui

Partial<{ root: string; track: string; range: string; thumb: string; }>

Emits

Event Type
change

[payload: Event]

update:modelValue

[value: number | number[]]

Theme

app.config.ts
export default defineAppConfig({
  ui: {
    slider: {
      slots: {
        root: 'relative flex items-center select-none touch-none',
        track: 'relative bg-[var(--ui-bg-accented)] overflow-hidden rounded-full grow',
        range: 'absolute rounded-full',
        thumb: 'rounded-full bg-[var(--ui-bg)] ring-2 focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2'
      },
      variants: {
        color: {
          primary: {
            range: 'bg-[var(--ui-primary)]',
            thumb: 'ring-[var(--ui-primary)] focus-visible:outline-[var(--ui-primary)]'
          },
          secondary: {
            range: 'bg-[var(--ui-secondary)]',
            thumb: 'ring-[var(--ui-secondary)] focus-visible:outline-[var(--ui-secondary)]'
          },
          success: {
            range: 'bg-[var(--ui-success)]',
            thumb: 'ring-[var(--ui-success)] focus-visible:outline-[var(--ui-success)]'
          },
          info: {
            range: 'bg-[var(--ui-info)]',
            thumb: 'ring-[var(--ui-info)] focus-visible:outline-[var(--ui-info)]'
          },
          warning: {
            range: 'bg-[var(--ui-warning)]',
            thumb: 'ring-[var(--ui-warning)] focus-visible:outline-[var(--ui-warning)]'
          },
          error: {
            range: 'bg-[var(--ui-error)]',
            thumb: 'ring-[var(--ui-error)] focus-visible:outline-[var(--ui-error)]'
          },
          neutral: {
            range: 'bg-[var(--ui-bg-inverted)]',
            thumb: 'ring-[var(--ui-border-inverted)] focus-visible:outline-[var(--ui-border-inverted)]/50'
          }
        },
        size: {
          xs: {
            thumb: 'size-3'
          },
          sm: {
            thumb: 'size-3.5'
          },
          md: {
            thumb: 'size-4'
          },
          lg: {
            thumb: 'size-4.5'
          },
          xl: {
            thumb: 'size-5'
          }
        },
        orientation: {
          horizontal: {
            root: 'w-full',
            range: 'h-full'
          },
          vertical: {
            root: 'flex-col h-full',
            range: 'w-full'
          }
        },
        disabled: {
          true: {
            root: 'opacity-75 cursor-not-allowed'
          }
        }
      },
      compoundVariants: [
        {
          orientation: 'horizontal',
          size: 'xs',
          class: {
            track: 'h-[6px]'
          }
        },
        {
          orientation: 'horizontal',
          size: 'sm',
          class: {
            track: 'h-[7px]'
          }
        },
        {
          orientation: 'horizontal',
          size: 'md',
          class: {
            track: 'h-[8px]'
          }
        },
        {
          orientation: 'horizontal',
          size: 'lg',
          class: {
            track: 'h-[9px]'
          }
        },
        {
          orientation: 'horizontal',
          size: 'xl',
          class: {
            track: 'h-[10px]'
          }
        },
        {
          orientation: 'vertical',
          size: 'xs',
          class: {
            track: 'w-[6px]'
          }
        },
        {
          orientation: 'vertical',
          size: 'sm',
          class: {
            track: 'w-[7px]'
          }
        },
        {
          orientation: 'vertical',
          size: 'md',
          class: {
            track: 'w-[8px]'
          }
        },
        {
          orientation: 'vertical',
          size: 'lg',
          class: {
            track: 'w-[9px]'
          }
        },
        {
          orientation: 'vertical',
          size: 'xl',
          class: {
            track: 'w-[10px]'
          }
        }
      ],
      defaultVariants: {
        size: 'md',
        color: 'primary'
      }
    }
  }
})