import { CSSProperties, ReactNode } from 'react'; import { SlotClassNames, SlotStyles, HtmlProps } from '../types/slots.types.js'; export interface SliderMark { /** Position of the mark, in the same units as `value`. */ value: number; /** Optional label rendered under the mark. */ label?: ReactNode; } export type SliderSlots = 'root' | 'track' | 'range' | 'thumb' | 'mark' | 'markLabel' | 'value'; interface SliderBaseProps extends Omit { /** Minimum value (default `0`). */ min?: number; /** Maximum value (default `100`). */ max?: number; /** Step increment; values snap to it (default `1`). */ step?: number; /** Disable interaction. */ disabled?: boolean; /** Tick marks along the track, optionally labelled. */ marks?: SliderMark[]; /** Show the current value in a bubble above the thumb. */ showValue?: boolean; /** Format the value shown in the bubble and announced to assistive tech. */ formatValue?: (value: number) => ReactNode; /** Thumb diameter, any CSS length. Sets `--slider-thumb-size`, which defaults to `1.125em` of `--default-font-size`, 18px at a 16px base. */ size?: string; /** Tab index of the thumb (default `0`). */ tabIndex?: number; /** Accessible label for the slider. In range mode it names the group. */ 'aria-label'?: string; className?: string; style?: CSSProperties; classNames?: SlotClassNames; styles?: SlotStyles; } export interface SingleSliderProps extends SliderBaseProps { range?: false; /** Controlled value. Omit for uncontrolled. */ value?: number; /** Initial value when uncontrolled (default `min`). */ defaultValue?: number; /** Fires on every value change (drag, keyboard, click). */ onChange?: (value: number) => void; /** Fires once when the value is committed: pointer release or a keyboard step. */ onChangeEnd?: (value: number) => void; } export interface RangeSliderProps extends SliderBaseProps { /** Render two thumbs and work in `[from, to]` pairs. */ range: true; /** Controlled pair. Omit for uncontrolled. */ value?: [number, number]; /** Initial pair when uncontrolled (default `[min, max]`). */ defaultValue?: [number, number]; /** Fires on every change, always with both ends in order. */ onChange?: (value: [number, number]) => void; /** Fires once when a thumb is released or stepped with the keyboard. */ onChangeEnd?: (value: [number, number]) => void; /** Smallest gap the two thumbs may be pushed to (default `0`). */ minRange?: number; /** Accessible label for each thumb, in order. Falls back to `'From'` and `'To'`. */ thumbLabels?: [string, string]; } /** * Discriminated on `range` rather than widening `value`, so an existing * `onChange={(v: number) => …}` keeps compiling. */ export type SliderProps = SingleSliderProps | RangeSliderProps; export {};