Skip to main content
AdjustmentSlider provides a compact, touch-friendly slider with a built-in label, optional icon, and animated value display. The filled portion of the track animates smoothly as the value changes.

Installation

npm install @soft-ui/react

Usage

import { AdjustmentSlider } from "@soft-ui/react/adjustment-slider"
import { RiVolumeMuteLine } from "@soft-ui/icons"

function Example() {
  const [volume, setVolume] = useState(50)

  return (
    <AdjustmentSlider
      label="Volume"
      icon={<RiVolumeMuteLine />}
      value={volume}
      onValueChange={(value) => setVolume(value as number)}
      min={0}
      max={100}
    />
  )
}

API Reference

Props

label
string
required
Label text displayed next to the icon
icon
React.ReactNode
Icon displayed at the start of the slider
size
's' | 'm' | 'l'
default:"'m'"
Size variant matching input component sizes:
  • s: 32px height
  • m: 36px height (default)
  • l: 40px height
showValue
boolean
default:"true"
Whether to show the current value
renderValue
(value: number) => React.ReactNode
Custom render function for the value display. Overrides the default numeric display.
animated
boolean
default:"true"
Whether to animate the value changes using NumberFlow
value
number | readonly number[]
Controlled value of the slider
defaultValue
number | readonly number[]
Uncontrolled default value
onValueChange
(value: number | readonly number[], details: ChangeEventDetails) => void
Callback fired when the value changes
min
number
default:"0"
Minimum value
max
number
default:"100"
Maximum value
step
number
Step increment for value changes
disabled
boolean
Whether the slider is disabled
className
string
Additional CSS classes for the root element
unsafeClassName
string
Explicit escape hatch for intentional structural overrides

Examples

With Icon

import { RiVolumeMuteLine } from "@soft-ui/icons"

<AdjustmentSlider
  label="Volume"
  icon={<RiVolumeMuteLine />}
  defaultValue={75}
  min={0}
  max={100}
/>

Without Value Display

<AdjustmentSlider
  label="Brightness"
  defaultValue={50}
  showValue={false}
/>

Custom Value Renderer

<AdjustmentSlider
  label="Temperature"
  defaultValue={72}
  min={60}
  max={85}
  renderValue={(value) => `${value}°F`}
/>

Different Sizes

<div className="flex flex-col gap-4">
  <AdjustmentSlider label="Small" size="s" defaultValue={30} />
  <AdjustmentSlider label="Medium" size="m" defaultValue={50} />
  <AdjustmentSlider label="Large" size="l" defaultValue={70} />
</div>

Disabled State

<AdjustmentSlider
  label="Volume"
  icon={<RiVolumeMuteLine />}
  defaultValue={50}
  disabled
/>

Controlled

function ControlledExample() {
  const [value, setValue] = useState(50)

  return (
    <div className="flex flex-col gap-4">
      <AdjustmentSlider
        label="Volume"
        value={value}
        onValueChange={(v) => setValue(v as number)}
      />
      <p>Current value: {value}</p>
    </div>
  )
}

Build docs developers (and LLMs) love