Skip to content

Commit 66e6fab

Browse files
authored
Add inputRef support for RAC SliderThumb (#6392)
Add inputRef support for RAC SliderThumb
1 parent c667db2 commit 66e6fab

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

packages/react-aria-components/src/Slider.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,13 +210,22 @@ export interface SliderThumbRenderProps {
210210
isDisabled: boolean
211211
}
212212

213-
export interface SliderThumbProps extends Omit<AriaSliderThumbProps, 'label' | 'validationState'>, HoverEvents, RenderProps<SliderThumbRenderProps> {}
213+
export interface SliderThumbProps extends Omit<AriaSliderThumbProps, 'label' | 'validationState'>, HoverEvents, RenderProps<SliderThumbRenderProps> {
214+
/**
215+
* A ref for the HTML input element.
216+
*/
217+
inputRef?: RefObject<HTMLInputElement>
218+
}
214219

215220
function SliderThumb(props: SliderThumbProps, ref: ForwardedRef<HTMLDivElement>) {
221+
let {
222+
inputRef: userInputRef = null
223+
} = props;
216224
let state = useContext(SliderStateContext)!;
217225
let {ref: trackRef} = useSlottedContext(SliderTrackContext)!;
218226
let {index = 0} = props;
219-
let inputRef = useRef<HTMLInputElement>(null);
227+
let defaultInputRef = useRef<HTMLInputElement>(null);
228+
let inputRef = userInputRef || defaultInputRef;
220229
let [labelRef, label] = useSlot();
221230
let {thumbProps, inputProps, labelProps, isDragging, isFocused, isDisabled} = useSliderThumb({
222231
...props,

packages/react-aria-components/test/Slider.test.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,3 +275,21 @@ describe('Slider', () => {
275275
expect(onChange).toHaveBeenCalled();
276276
});
277277
});
278+
279+
it('should support input ref', () => {
280+
let inputRef = React.createRef();
281+
282+
let {getByRole} = render(
283+
<Slider>
284+
<Label>Test</Label>
285+
<SliderOutput />
286+
<SliderTrack>
287+
<SliderThumb inputRef={inputRef} />
288+
</SliderTrack>
289+
</Slider>
290+
);
291+
292+
let group = getByRole('group');
293+
let thumbInput = group.querySelector('input');
294+
expect(inputRef.current).toBe(thumbInput);
295+
});

0 commit comments

Comments
 (0)