import { RadiantElement } from '@ecopages/radiant'; import type { EventEmitter } from '@ecopages/radiant/tools/event-emitter'; export type RuiSliderVariant = 'single' | 'range'; export type RuiSliderOrientation = 'horizontal' | 'vertical'; export type RuiSliderThumb = 'value' | 'min' | 'max'; export type RuiSliderProps = { variant?: RuiSliderVariant; orientation?: RuiSliderOrientation; value?: number; rangeMin?: number; rangeMax?: number; min?: number; max?: number; step?: number; minDistance?: number; disabled?: boolean; readOnly?: boolean; label?: string; name?: string; /** Shows the default value readout below the track when no `RuiSliderValue` child is provided. */ showValue?: boolean; /** Mirrors the live value in the control `title` for hover tooltips. */ valueTitle?: boolean; }; export type RuiSliderChangeDetail = { value: number; } | { values: [number, number]; }; type RuiSliderBindings = Record; /** * `` — select a value from a continuous or discrete range. * * Single and range modes use a DOM track and `role="slider"` thumbs styled via CSS * variables — no `` rendering. * * @see https://www.w3.org/WAI/ARIA/apg/patterns/slider/ * @see https://www.w3.org/WAI/ARIA/apg/patterns/slider-multithumb/ * * @element rui-slider * * @attr {('single'|'range')} variant - Single-thumb or dual-thumb range. Default: `single`. * @attr {('horizontal'|'vertical')} orientation - Track axis. Default: `horizontal`. * @attr {number} value - Selected value (single mode). Reflects to markup. Default: `50`. * @attr {number} range-min - Lower thumb value (range mode). Reflects to markup. Default: `25`. * @attr {number} range-max - Upper thumb value (range mode). Reflects to markup. Default: `75`. * @attr {number} min - Range minimum. Default: `0`. * @attr {number} max - Range maximum. Default: `100`. * @attr {number} step - Arrow-key and pointer snap interval. Default: `1`. * @attr {number} min-distance - Minimum gap enforced between range thumbs. Default: `0`. * @attr {boolean} disabled - Disables interaction. Default: `false`. * @attr {boolean} read-only - Blocks value changes while leaving thumbs focusable. Default: `false`. * @attr {string} label - Accessible name for the slider. Default: `''`. * @attr {string} name - Form field name. Range mode also writes `{name}-max`. Default: `''`. * @attr {boolean} show-value - Shows the default value readout below the track. Default: `false`. * @attr {boolean} value-title - Mirrors the live value in control `title` tooltips on hover. Default: `false`. * * @cssprop --rui-slider-track-size - Track thickness. Default: `0.375rem`. * @cssprop --rui-slider-track-length - Track length for vertical sliders and horizontal max length. Default: `12rem`. * @cssprop --rui-slider-width - Root control width. Default: `100%` (`auto` when vertical). * @cssprop --rui-slider-height - Root control height. Default: `auto`. * @cssprop --rui-slider-gap - Spacing between label, track, and value. Default: `--space-inline`. * @cssprop --rui-slider-track-color - Range track background. Default: `--surface`. * @cssprop --rui-slider-fill-color - Range selected fill. Default: `--primary`. * @cssprop --rui-slider-track-radius - Track and fill corner radius. Default: `--radius-control`. * @cssprop --rui-slider-thumb-size - Range thumb diameter. Default: `1.25rem`. * @cssprop --rui-slider-thumb-border-width - Range thumb border width. Default: `2px`. * @cssprop --rui-slider-thumb-border-color - Range thumb border color. Default: `--primary`. * @cssprop --rui-slider-thumb-background - Range thumb fill. Default: `--background`. * @cssprop --rui-slider-thumb-shadow - Range thumb shadow. Default: `0 2px 8px rgb(0 0 0 / 0.12)`. * @cssprop --rui-slider-thumb-radius - Thumb corner radius. Default: `--radius-control`. * @cssprop --rui-slider-value-color - Value readout color. Default: `--on-surface`. * @cssprop --rui-slider-focus-ring - Focus ring color. Default: `--focus-ring`. * @cssprop --rui-slider-focus-ring-width - Focus ring width. Default: `2px`. * * @fires rui-change - Emitted when the committed value changes; `detail.value` (single) or * `detail.values` `[min, max]` (range). Pointer drags emit on each distinct snap. * * @remarks * The composed surface is authored in `RuiSlider` / `RuiSliderValue`. The element * queries `data-ref` targets and updates live values imperatively. */ export declare class RuiSlider extends RadiantElement { variant: RuiSliderVariant; orientation: RuiSliderOrientation; value: number; rangeMin: number; rangeMax: number; min: number; max: number; step: number; minDistance: number; disabled: boolean; readOnly: boolean; label: string; name: string; showValue: boolean; valueTitle: boolean; changeEvent: EventEmitter; inputTarget: HTMLInputElement; maxInputTarget: HTMLInputElement; rootTarget: HTMLElement; headerTarget: HTMLElement; labelTarget: HTMLElement; rangeTrack: HTMLElement; valueTarget: HTMLElement; singleThumb: HTMLButtonElement; rangeMinThumb: HTMLButtonElement; rangeMaxThumb: HTMLButtonElement; private activeThumb; private activePointerId; private pending; private lastEmitted; protected onConnected(): void; onPropsUpdated(): void; private get isRange(); private get isVertical(); private get numericRange(); private get defaultValueTarget(); private thumbFor; private parseThumb; private constrainPair; private committedValues; private liveValues; private changeDetail; private emitIfChanged; private reflectValues; private syncValues; private syncChrome; private paint; private syncInputs; private syncValueTitle; private valueFromPointer; private nearestThumb; private moveThumb; private commit; private revert; private releasePointer; onPointerDown(event: PointerEvent): void; /** * @remarks Pointermove is observed on `document` so drag still tracks when * testing-library dispatches move events off the thumb/track (no capture retarget). */ onPointerMove(event: PointerEvent): void; onPointerUp(event: PointerEvent): void; onPointerCancel(event: PointerEvent): void; onThumbKeydown(event: KeyboardEvent): void; } export {};