Slider

An input where the user selects a value from within a given range.

Installation

Install the primitive and Copy-Paste the component code in a .tsx file.

npm install @radix-ui/react-slider
import * as SliderPrimitive from "@radix-ui/react-slider";
import React from "react";
import { createContext, useContext } from "react";
import { slider, type SliderProps, type SliderTrackProps } from "@tailus/themer";

const SliderContext = createContext<SliderProps>({})

const SliderRoot = React.forwardRef<
  React.ElementRef<typeof SliderPrimitive.Root>,
  React.ComponentProps<typeof SliderPrimitive.Root> & Omit<SliderProps, "variant">
  >(({ intent="primary", size="md", className, ...props }, forwardedRef) => {
    const { root } = slider()
    return (
      <SliderContext.Provider value={{intent, size}}>
        <SliderPrimitive.Root
          {...props}
          ref={forwardedRef}
          className={root({ size, intent, className})}
        />
      </SliderContext.Provider>
    )
});

const SliderThumb = React.forwardRef<
  React.ElementRef<typeof SliderPrimitive.SliderThumb>,
  React.ComponentProps<typeof SliderPrimitive.SliderThumb> & Omit<SliderProps, "intent">
  >(({ variant="raised", size="md", className, ...props }, forwardedRef) => {

    const { thumb } = slider()

    const { intent, size: contextSize, variant: contextVariant } = useContext(SliderContext)
    
    size = size || contextSize
    variant = variant || contextVariant
    return (
      <SliderPrimitive.SliderThumb
        {...props}
        ref={forwardedRef}
        className={thumb({ variant, size, intent, className})}
      />
    )
  });

const SliderTrack = React.forwardRef<
  React.ElementRef<typeof SliderPrimitive.Track>,
  React.ComponentProps<typeof SliderPrimitive.Track> & SliderTrackProps
  >(({ className, variant="soft", ...props }, forwardedRef) => {

    const { track } = slider()

    return (
      <SliderPrimitive.Track
        {...props}
        ref={forwardedRef}
        className={track({trackVariant:variant, className })}
      />
    )
});

const SliderRange = React.forwardRef<
  React.ElementRef<typeof SliderPrimitive.Range>,
  React.ComponentProps<typeof SliderPrimitive.Range> & SliderProps 
  >(({ intent, className, ...props }, forwardedRef) => {

    const { range } = slider()
    const { intent: contextIntent } = useContext(SliderContext)
    
    intent = intent || contextIntent

    return (
      <SliderPrimitive.Range
        {...props}
        ref={forwardedRef}
        className={range({ intent, className})}
      />
    )
  });

const Slider = {
  Root: SliderRoot,
  Thumb: SliderThumb,
  Track: SliderTrack,
  Range: SliderRange,
};

export default Slider;

export {
  SliderRoot,
  SliderThumb,
  SliderTrack,
  SliderRange,
}

Usage

Import all the parts and build your Slider.

import Slider from "@react-ui/Slider";
const MyComponent = () => (
    <Slider.Root
        className="w-72"
        defaultValue={[50]}
        max={100}
        step={1}
    >
        <Slider.Track>
            <Slider.Range />
        </Slider.Track>
        <Slider.Thumb aria-label="Volume"/>
    </Slider.Root>
)

Reference

Root

The Slider <Root /> has the following additional props.

Prop
Type
Default
size
enum
md
intent
enum
primary

Track

The Slider <Track /> has the following additional props.

Prop
Type
Default
variant
enum
soft

Thumb

The Slider <Thumb /> has the following additional props.

Prop
Type
Default
size
enum
md
variant
enum
soft

Examples