import * as React from 'react'; import { cn } from '@/lib/utils'; /** * SliderProps - Propriétés du composant Slider * * @interface SliderProps * @extends Omit, 'type' | 'value' | 'onChange'> */ export interface SliderProps extends Omit< React.InputHTMLAttributes, 'type' | 'value' | 'onChange' > { /** * Valeur du slider (tableau avec une valeur pour un slider simple) * * @default [0] * * @example * ```tsx * setValue(val)} /> * ``` */ value?: number[]; /** * Fonction appelée lorsque la valeur change * * @param {number[]} value - Nouvelle valeur (tableau) * * @example * ```tsx * console.log('Value:', value[0])} /> * ``` */ onValueChange?: (value: number[]) => void; /** * Valeur minimale * * @default 0 */ min?: number; /** * Valeur maximale * * @default 100 */ max?: number; /** * Pas d'incrémentation * * @default 1 */ step?: number; /** * CRITIQUE FIX #43: Label accessible pour le slider (aria-label) */ 'aria-label'?: string; /** * CRITIQUE FIX #43: ID d'un élément qui décrit le slider (aria-labelledby) */ 'aria-labelledby'?: string; } /** * Slider - Composant de curseur avec design system Kodo * * Composant de curseur (slider) pour sélectionner une valeur dans une plage. * Utilise le design system Kodo avec une barre cyan et un indicateur visuel. * * @example * ```tsx * // Slider simple * setValue(val[0])} /> * * // Slider avec plage personnalisée * setValue(val[0])} * /> * * // Slider désactivé * * ``` * * @component * @param {SliderProps} props - Propriétés du composant * @returns {JSX.Element} Élément div contenant un slider stylisé */ const Slider = React.forwardRef( ( { className, value = [0], onValueChange, min = 0, max = 100, step = 1, disabled, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, ...props }, ref, ) => { const handleChange = (e: React.ChangeEvent) => { const newValue = [Number(e.target.value)]; if (onValueChange) { onValueChange(newValue); } }; const percentage = ((value[0] - min) / (max - min)) * 100; return (
); }, ); Slider.displayName = 'Slider'; export { Slider };