'use client' import { type CSSProperties, forwardRef, memo } from 'react' import * as React from 'react' import * as SliderPrimitive from '@radix-ui/react-slider' import classNames from 'classnames' import { cssDimension } from '~/src/utils/style' import { Tooltip } from '~/src/components/Tooltip' import { type SliderProps } from './Slider.types' import styles from './Slider.module.scss' export const SLIDER_TEST_ID = 'bezier-slider' const SliderGuide = memo>( function SliderGuide({ min, max, value }) { return (
) } ) /* NOTE: Props are injected at runtime by `SliderPrimitive.Thumb`. */ const SliderThumb = forwardRef< HTMLDivElement, Pick & React.HTMLAttributes >(function SliderThumb({ disableTooltip, ...rest }, forwardedRef) { const value = rest?.['aria-valuenow'] if (disableTooltip) { return (
) } return ( e.preventDefault()} >
) }) /** * An input component where the user selects a value from within a given range. * The value of the slider is shown in a tooltip, and in some cases you can add a guide scale. * @example * * ```tsx * const [value, setValue] = useState([1]) * // Controlled * * // Uncontrolled * * ``` */ export const Slider = forwardRef(function Slider( { className, style, width = 36, guide, defaultValue = [0], value, disabled = false, min = 0, max = 10, step = 1, minStepsBetweenThumbs = 0, dir = 'ltr', disableTooltip = false, ...rest }, forwardedRef ) { const targetValue = value || defaultValue return ( {guide && (
{guide.map((guideValue) => ( ))}
)}
{targetValue.map((_, i) => ( ))}
) })