"use client" import * as React from 'react'; import * as SliderPrimitive from '@radix-ui/react-slider'; import { useStoredValue, type StorageType, type UseStoredValueOptions } from '../../../hooks'; import { cn } from '../../../lib/utils'; export interface SliderProps extends React.ComponentPropsWithoutRef { /** * When provided, the slider value is persisted under this key. * Works with both controlled (`value`) and uncontrolled (`defaultValue`) modes. * @example storageKey="volume-level" */ storageKey?: string /** @default 'local' */ storageType?: StorageType /** TTL in ms */ storageTtl?: number } const Slider = React.forwardRef< React.ElementRef, SliderProps >(({ className, orientation = 'horizontal', storageKey, storageType, storageTtl, onValueChange, ...props }, ref) => { const isVertical = orientation === 'vertical'; const storageOptions: UseStoredValueOptions | undefined = storageKey ? { storage: storageType ?? 'local', ttl: storageTtl } : undefined; const [storedValue, setStoredValue] = useStoredValue( storageKey, (props.defaultValue as number[] | undefined) ?? (props.value as number[] | undefined) ?? [], storageOptions, ); const handleValueChange = React.useCallback( (newValue: number[]) => { if (storageKey) setStoredValue(newValue); onValueChange?.(newValue); }, [storageKey, setStoredValue, onValueChange], ); const sliderProps = { ...props, onValueChange: storageKey ? handleValueChange : onValueChange, // Inject stored defaultValue only in uncontrolled mode ...(storageKey && props.value === undefined && storedValue.length > 0 ? { defaultValue: storedValue } : {}), }; return ( ); }) Slider.displayName = SliderPrimitive.Root.displayName export { Slider }