Skip to main content
You are viewing Pre-Alpha documentation.
Vuetify0 Logo
Theme
Mode
Palettes
Accessibility
Vuetify One

Sign in to Vuetify One

Access premium tools across the Vuetify ecosystem — Bin, Play, Studio, and more.

Not a subscriber? See what's included

createSlider

A composable for managing slider state: value math, step snapping, percentage conversion, and multi-thumb value operations. Designed for single-thumb, range, and multi-thumb sliders.


IntermediateMar 10, 2026

Usage

The createSlider composable manages a number[] of thumb values with configurable min/max/step bounds. It provides pure math functions (snap, fromValue, fromPercent) and index-based thumb operations (set, up, down).

ts
import { createSlider } from '@vuetify/v0'

const slider = createSlider({ min: 0, max: 100, step: 5 })

// Each thumb is a registered ticket with a shallowRef<number> value
const thumb = slider.register({ value: 50 })

slider.up(0)               // values: [55]
slider.fromValue(50)       // 50
slider.snap(47)            // 45 (nearest step of 5)

// Range — register two thumbs
const slider2 = createSlider({ min: 0, max: 100, step: 1 })
slider2.register({ value: 25 })
slider2.register({ value: 75 })

slider2.set(0, 30)         // values: [30, 75]
slider2.set(1, 60)         // values: [30, 60]

Reactivity

Slider state is always reactive. Values and derived properties update automatically.

Property/MethodReactiveNotes
valuesRef — all thumb values
disabledRef — accepts MaybeRefOrGetter
orientationRef — accepts MaybeRefOrGetter
invertedRef — accepts MaybeRefOrGetter
snapPure function — rounds to nearest step
fromValuePure function — value to percentage
fromPercentPure function — percentage to value
Tip

Value constraints set automatically clamps to min/max, snaps to the nearest step, and enforces minimum distance between adjacent thumbs via minStepsBetweenThumbs.

Examples

Media Scrubber

A music player scrubber built entirely with createSlider — no Slider.* components needed. Demonstrates how the composable’s math functions power custom pointer interactions.

Every pointer interaction follows the same loop: pointer → fromPercent()set()fromValue() → UI. The provider converts raw clientX into a track percentage, fromPercent snaps it to the nearest 0.1-second step, and the consumer reads values[0] back through fromValue() to position the playhead and color the waveform bars.

FileRole
context.tsTyped context with createContext, shared constants
ScrubberProvider.vueCreates slider, owns pointer logic, provides via slot
ScrubberConsumer.vueInjects context, renders waveform and playhead
scrubber.vueEntry point wiring provider to consumer

Key patterns:

  • Provider owns all pointer math — the consumer never touches PointerEvent

  • fromPercent + set handle step snapping and clamping automatically

  • scrubbing ref drives CSS transitions — instant updates while dragging, smooth otherwise

Click and drag across the waveform to scrub through the track.

0:00-3:37

Theme Comparison

A before/after theme comparison tool — the same fromPercentset pointer math as the scrubber, applied to a completely different visual metaphor. The slider never renders as a traditional slider control.

Tip

Same math, different metaphor This uses the exact same fromPercentsetfromValue loop as the scrubber above, proving createSlider is a reusable math primitive — not a UI widget.

Two identical UI panels are stacked with position: absolute. The bottom layer has data-theme="light", the top has data-theme="dark" with clip-path: inset(0 0 0 X%) where X comes from slider.fromValue(). Dragging the handle clips the dark panel from the left, revealing the light panel underneath.

FileRole
useCompare.tsCreates slider, exposes reactive split and pointer handlers
CompareDisplay.vueRenders light/dark panels with clip-path driven by split
compare.vueEntry point wiring the composable to the display

Key patterns:

  • createSlider as a math primitive — no form input, no Slider.* components

  • data-theme scoping — two theme contexts coexist in the same DOM tree

  • Same pointer math pattern as the scrubber, proving the composable is reusable across visual metaphors

Drag the divider handle left and right to compare themes.

Theme Preview
Primary
Secondary
Error
JD
Jane Doe
jane@example.com
Active
Progress
Storage
Theme Preview
Primary
Secondary
Error
JD
Jane Doe
jane@example.com
Active
Progress
Storage

API Reference

The following API details are for the createSlider composable.

Functions

createSlider

(options?: SliderOptions) => SliderContext

Creates slider state with value math, step snapping, and multi-thumb support. Extends createModel for useProxyModel compatibility. Each thumb is a model ticket with a shallowRef<number> value. Values are derived from the ordered tickets, enabling proper registration/unregistration lifecycle.

Options

min

number | undefined

Minimum value.

Default: 0

max

number | undefined

Maximum value.

Default: 100

step

number | undefined

Step increment. Values are snapped to the nearest multiple of `step` above `min`.

Default: 1

disabled

MaybeRefOrGetter<boolean> | undefined

Whether the slider is disabled.

readonly

MaybeRefOrGetter<boolean> | undefined

Whether the slider is readonly (focusable but not editable).

orientation

MaybeRefOrGetter<"horizontal" | "vertical"> | undefined

Slider orientation.

inverted

MaybeRefOrGetter<boolean> | undefined

Flip the percent axis.

minStepsBetweenThumbs

number | undefined

Minimum steps required between adjacent thumbs.

Default: 0

crossover

boolean | undefined

Allow thumbs to pass through each other.

Default: false

range

boolean | undefined

Range mode — expects two thumbs.

Default: false

Properties

values

ComputedRef<number[]>

Ordered thumb values derived from model tickets.

selectedValues

ComputedRef<number[]>

Alias for `values` — provides useProxyModel compatibility.

disabled

Readonly<Ref<boolean, boolean>>

Whether disabled. Reactive ref derived from the `disabled` option.

readonly

Readonly<Ref<boolean, boolean>>

Whether readonly. Reactive ref derived from the `readonly` option.

orientation

Readonly<Ref<"horizontal" | "vertical", "horizontal" | "vertical">>

Slider orientation. Reactive ref derived from the `orientation` option.

inverted

Readonly<Ref<boolean, boolean>>

Whether inverted. Reactive ref derived from the `inverted` option.

min

number

Minimum value.

max

number

Maximum value.

step

number

Step increment.

minStepsBetweenThumbs

number

Minimum steps required between adjacent thumbs.

crossover

boolean

Whether thumbs can cross each other.

range

boolean

Whether this is a range slider.

Methods

apply

(values: unknown[], options?: { multiple?) => void

Apply external values — snaps, constrains, and writes to ticket refs.

register

(input?: number | { value) => ModelTicket<SliderTicketInput>

Register a new thumb and return its ticket.

unregister

(id: ID) => void

Unregister a thumb by ticket ID.

snap

(value: number) => number

Round a value to the nearest step, clamped to min/max.

fromValue

(value: number) => number

Convert a value to a 0–100 percentage.

fromPercent

(percent: number) => number

Convert a 0–100 percentage to a snapped value.

set

(index: number, value: number) => void

Set the value at a thumb index with step snapping and neighbor constraints.

up

(index: number, multiplier?: number) => void

Increment a thumb's value by `step × multiplier`.

down

(index: number, multiplier?: number) => void

Decrement a thumb's value by `step × multiplier`.

floor

(index: number) => void

Set a thumb to the minimum value.

ceil

(index: number) => void

Set a thumb to the maximum value.

Was this page helpful?

© 2016-1970 Vuetify, LLC
Ctrl+/