Usage
min and max.label, aria-label or aria-labelledby; the thumbs need startLabel and endLabel.
value, defaultValue and onValueChange use a [start, end] tuple. An uncontrolled range starts at [min, max].minStepsBetweenThumbs keeps them apart by that many steps.min, max, step, orientation, disabled, name and form behave as they do on Slider. name submits the start and then the end (FormData.getAll(name)), and a form reset restores defaultValue.orientation uses SliderOrientation from the Slider entry point.label, showValue, formatValue, locale and ticks work as they do on Slider. The header's readout shows both ends, start then end, joined with an en dash (20; 80); each thumb's aria-valuetext is its own formatted value, and each thumb has its own value bubble while you drag it or step it with the keyboard. The bubble rolls its digits with the default format and shows formatValue text as plain text.
showInput is not part of RangeSlider (contract RS-5; Chris approved with Slider SL-4). Compose two NumberFields beside the track and keep min, max, step and the tuple in sync; see the Slider usage doc for a single-value composition example.
The slider fills the width of its container. Its track is 6px and its thumbs are 20px, which sets the height of the control; a header row sits above it with a label or showValue, and marks sit below it with ticks. Pointer presses register in a 24px band across the track (44px on coarse pointers); a press on the track moves the nearest thumb.