---
title: Slider
description: A control for selecting a value from a range by dragging a thumb.
links:
  doc: https://base-ui.com/react/components/slider
  api: https://base-ui.com/react/components/slider#api-reference
---

```tsx
'use client';

import { Slider } from '@/components/ui/slider';

export function SliderDefault() {
  return <Slider defaultValue={50} className='w-full max-w-xs' />;
}
```

## Installation

```bash
npx shadcn@latest add @fab-ui/slider
```

**Install the following dependencies:**

```bash
npm install @base-ui/react
```

**Copy and paste the following code into your project.**

```tsx
'use client';

import * as React from 'react';

import { Slider as SliderPrimitive } from '@base-ui/react/slider';

import { cn } from '@/lib/utils';

function Slider({
  className,
  defaultValue,
  value,
  min = 0,
  max = 100,
  ...props
}: SliderPrimitive.Root.Props) {
  const _values = React.useMemo(
    () =>
      Array.isArray(value)
        ? value
        : Array.isArray(defaultValue)
          ? defaultValue
          : [min, max],
    [value, defaultValue, min, max]
  );

  return (
    <SliderPrimitive.Root
      className={cn(
        'data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full',
        className
      )}
      data-slot='slider'
      defaultValue={defaultValue}
      value={value}
      min={min}
      max={max}
      thumbAlignment='edge'
      {...props}
    >
      <SliderPrimitive.Control className='ddata-[orientation=vertical]:flex-col relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-auto'>
        <SliderPrimitive.Track
          data-slot='slider-track'
          className='relative grow overflow-hidden rounded-full bg-muted select-none data-[orientation=horizontal]:h-1 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1'
        >
          <SliderPrimitive.Indicator
            data-slot='slider-range'
            className='data-[orientation=horizontal]::h-full bg-primary select-none data-[orientation=vertical]:w-full'
          />
        </SliderPrimitive.Track>
        {Array.from({ length: _values.length }, (_, index) => (
          <SliderPrimitive.Thumb
            data-slot='slider-thumb'
            key={index}
            className='relative block size-3 shrink-0 rounded-full border border-ring bg-white ring-ring/50 transition-[color,box-shadow] select-none after:absolute after:-inset-2 hover:ring-[3px] focus-visible:ring-[3px] focus-visible:outline-hidden active:ring-[3px] disabled:pointer-events-none disabled:opacity-50'
          />
        ))}
      </SliderPrimitive.Control>
    </SliderPrimitive.Root>
  );
}

export { Slider };
```

**Update the import paths to match your project setup.**

## Usage

```tsx
import { Slider, SliderValue } from "@/components/ui/slider"
```

```tsx
<Slider defaultValue={50} />
```

## Examples

### With Value

```tsx
'use client';

import { Slider } from '@/components/ui/slider';

export function SliderWithValue() {
  return (
    <Slider
      defaultValue={[75]}
      max={100}
      step={1}
      className='mx-auto w-full max-w-xs'
    />
  );
}
```
