diff --git a/packages/@react-spectrum/s2/src/RangeSlider.tsx b/packages/@react-spectrum/s2/src/RangeSlider.tsx index af06d58df34..dadb9c31865 100644 --- a/packages/@react-spectrum/s2/src/RangeSlider.tsx +++ b/packages/@react-spectrum/s2/src/RangeSlider.tsx @@ -11,7 +11,6 @@ */ import {ContextValue} from 'react-aria-components/slots'; - import {createContext, forwardRef, useContext, useRef} from 'react'; import { filledTrack, @@ -25,12 +24,11 @@ import { } from './Slider'; import {FocusableRef, FocusableRefValue, RangeValue} from '@react-types/shared'; import {FormContext, useFormProps} from './Form'; -import intlMessages from '../intl/*.json'; // @ts-ignore +import intlMessages from '../intl/*.json'; import {pressScale} from './pressScale'; -import {SliderThumb, SliderTrack} from 'react-aria-components/Slider'; +import {SliderFill, SliderThumb, SliderTrack} from 'react-aria-components/Slider'; import {useFocusableRef} from './useDOMRef'; -import {useLocale} from 'react-aria/I18nProvider'; import {useLocalizedStringFormatter} from 'react-aria/useLocalizedStringFormatter'; import {useSpectrumContextProps} from './useSpectrumContextProps'; @@ -77,8 +75,6 @@ export const RangeSlider = /*#__PURE__*/ forwardRef(function RangeSlider( let inputRef = useRef(null); // TODO: need to pass inputRef to SliderThumb when we release the next version of RAC 1.3.0 let domRef = useFocusableRef(ref, inputRef); - let {direction} = useLocale(); - let cssDirection = direction === 'rtl' ? 'right' : 'left'; let defaultThumbValues: number[] | undefined = undefined; if (props.defaultValue != null) { defaultThumbValues = [props.defaultValue.start, props.defaultValue.end]; @@ -98,14 +94,9 @@ export const RangeSlider = /*#__PURE__*/ forwardRef(function RangeSlider( {({state, isDisabled}) => ( <> -
-
+
+ +
@@ -318,9 +316,10 @@ export let upperTrack = style<{ translateY: '-50%', width: 'full', boxSizing: 'border-box', - borderStyle: 'solid', - borderWidth: '[.5px]', - borderColor: { + outlineStyle: 'solid', + outlineWidth: '[.5px]', + outlineOffset: -0.5, + outlineColor: { default: 'transparent', forcedColors: { default: 'ButtonText', @@ -369,10 +368,8 @@ export function SliderBase( labelAlign = 'start', size = 'M', minValue = 0, - maxValue = 100, - formatOptions + maxValue = 100 } = props; - let formatter = useNumberFormatter(formatOptions); let {direction} = useLocale(); return ( @@ -387,26 +384,19 @@ export function SliderBase( ) }> {({state}) => { - let maxLabelLength = Math.max( - [...formatter.format(minValue)].length, - [...formatter.format(maxValue)].length - ); + let maxLabelLength = 0; switch (state.values.length) { case 1: + maxLabelLength = Math.max( + [...state.getFormattedValue(minValue)].length, + [...state.getFormattedValue(maxValue)].length + ); break; case 2: - // This should really use the NumberFormat#formatRange proposal... - // https://github.com/tc39/ecma402/issues/393 - // https://github.com/tc39/proposal-intl-numberformat-v3#formatrange-ecma-402-393 - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/formatRange - maxLabelLength = - 3 + - 2 * - Math.max( - maxLabelLength, - [...formatter.format(minValue)].length, - [...formatter.format(maxValue)].length - ); + maxLabelLength = Math.max( + [...state.getFormattedValue([minValue, minValue + (props.step || 1)])].length, + [...state.getFormattedValue([maxValue - (props.step || 1), maxValue])].length + ); break; default: throw new Error('Only sliders with 1 or 2 handles are supported!'); @@ -419,9 +409,8 @@ export function SliderBase( minWidth: `${maxLabelLength}ch`, fontVariantNumeric: 'tabular-nums' }} - className={output({direction, labelPosition, isInForm: !!formContext})}> - {({state}) => state.values.map((_, i) => state.getThumbValueLabel(i)).join(' – ')} - + className={output({direction, labelPosition, isInForm: !!formContext})} + /> ); return ( @@ -475,32 +464,20 @@ export const Slider = /*#__PURE__*/ forwardRef(function Slider( let thumbRef = useRef(null); let inputRef = useRef(null); // TODO: need to pass inputRef to SliderThumb when we release the next version of RAC 1.3.0 let domRef = useFocusableRef(ref, inputRef); - let {direction} = useLocale(); - let cssDirection = direction === 'rtl' ? 'right' : 'left'; let isStaticColor = props['PRIVATE_staticColor']; return ( - {({state, isDisabled}) => { - fillOffset = - fillOffset !== undefined - ? clamp(fillOffset, state.getThumbMinValue(0), state.getThumbMaxValue(0)) - : state.getThumbMinValue(0); - - let fillWidth = state.getThumbPercent(0) - state.getValuePercent(fillOffset); - let isRightOfOffset = fillWidth > 0; - let offset = isRightOfOffset - ? state.getValuePercent(fillOffset) - : state.getThumbPercent(0); - + {({isDisabled}) => { return ( <> -
-
+
+ +
## Examples @@ -105,11 +107,12 @@ By default, slider values are percentages between 0 and 100. Use the `minValue`, -```tsx links={{Slider: '#slider', SliderOutput: '#slideroutput', SliderTrack: '#slidertrack', SliderThumb: '#sliderthumb'}} +```tsx links={{Slider: '#slider', SliderOutput: '#slideroutput', SliderTrack: '#slidertrack', SliderFill: '#sliderfill', SliderThumb: '#sliderthumb'}}