UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

1 lines 27.5 kB
{"version":3,"file":"RangeSlider.cjs","names":["createVarsResolver","getSize","getThemeColor","getRadius","rem","factory","useProps","useStyles","useDirection","getPosition","getPrecision","findClosestNumber","getLastMarkValue","getFirstMarkValue","getPreviousMarkValue","getNextMarkValue","getFloatingValue","getChangeValue","getClientPosition","SliderProvider","SliderRoot","Track","Thumb","classes"],"sources":["../../../../src/components/Slider/RangeSlider/RangeSlider.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { clamp, useMergedRef, useMove, useUncontrolled } from '@mantine/hooks';\nimport {\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n findClosestNumber,\n getRadius,\n getSize,\n getThemeColor,\n MantineColor,\n MantineRadius,\n MantineSize,\n rem,\n StylesApiProps,\n useDirection,\n useProps,\n useStyles,\n} from '../../../core';\nimport { TransitionOverride } from '../../Transition';\nimport { SliderCssVariables, SliderProvider, SliderStylesNames } from '../Slider.context';\nimport { SliderMark } from '../SliderMark';\nimport { SliderRoot } from '../SliderRoot/SliderRoot';\nimport { Thumb } from '../Thumb/Thumb';\nimport { Track } from '../Track/Track';\nimport { getChangeValue } from '../utils/get-change-value/get-change-value';\nimport { getClientPosition } from '../utils/get-client-position/get-client-position';\nimport { getFloatingValue } from '../utils/get-floating-value/get-floating-value';\nimport { getPosition } from '../utils/get-position/get-position';\nimport { getPrecision } from '../utils/get-precision/get-precision';\nimport {\n getFirstMarkValue,\n getLastMarkValue,\n getNextMarkValue,\n getPreviousMarkValue,\n} from '../utils/get-step-mark-value/get-step-mark-value';\nimport classes from '../Slider.module.css';\n\nexport type RangeSliderValue = [number, number];\n\nexport interface RangeSliderProps\n extends\n BoxProps,\n StylesApiProps<RangeSliderFactory>,\n ElementProps<'div', 'onChange' | 'value' | 'defaultValue'> {\n /** Key of `theme.colors` or any valid CSS color, controls color of track and thumb @default theme.primaryColor */\n color?: MantineColor;\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius`, numbers are converted to rem @default 'xl' */\n radius?: MantineRadius;\n\n /** Controls size of the track @default 'md' */\n size?: MantineSize | (string & {}) | number;\n\n /** Minimal possible value @default 0 */\n min?: number;\n\n /** Maximum possible value @default 100 */\n max?: number;\n\n /** Domain of the slider, defines the selectable value range independently of min/max. Useful when you want to display a wider track range (min/max) but restrict actual selection to a subset (domain). @default [min, max] */\n domain?: [number, number];\n\n /** Number by which value will be incremented/decremented with thumb drag and arrows @default 1 */\n step?: number;\n\n /** Number of significant digits after the decimal point */\n precision?: number;\n\n /** Controlled component value */\n value?: RangeSliderValue;\n\n /** Uncontrolled component default value */\n defaultValue?: RangeSliderValue;\n\n /** Called when value changes */\n onChange?: (value: RangeSliderValue) => void;\n\n /** Called when user stops dragging slider or changes value with arrows */\n onChangeEnd?: (value: RangeSliderValue) => void;\n\n /** Hidden input name, use with uncontrolled component */\n name?: string;\n\n /** Marks displayed on the track */\n marks?: SliderMark[];\n\n /** Function to generate label or any react node to render instead, set to null to disable label */\n label?: React.ReactNode | ((value: number) => React.ReactNode);\n\n /** Props passed down to the `Transition` component @default { transition: 'fade', duration: 0 } */\n labelTransitionProps?: TransitionOverride;\n\n /** Determines whether the label should be visible when the slider is not being dragged or hovered @default false */\n labelAlwaysOn?: boolean;\n\n /** Determines whether the label should be displayed when the slider is hovered @default true */\n showLabelOnHover?: boolean;\n\n /** Content rendered inside thumb */\n thumbChildren?: React.ReactNode;\n\n /** Disables slider */\n disabled?: boolean;\n\n /** Thumb `width` and `height`, by default value is computed based on `size` prop */\n thumbSize?: number | string;\n\n /** A transformation function to change the scale of the slider */\n scale?: (value: number) => number;\n\n /** Determines whether track values representation should be inverted @default false */\n inverted?: boolean;\n\n /** Slider orientation @default 'horizontal' */\n orientation?: 'horizontal' | 'vertical';\n\n /** Minimal range interval between the two thumbs. Consider this value relative to the total range (max - min). @default 10 */\n minRange?: number;\n\n /** Maximum range interval @default Infinity */\n maxRange?: number;\n\n /** `aria-label` for both thumbs (overridden by thumbFromLabel/thumbToLabel if provided) */\n thumbLabel?: string;\n\n /** First thumb `aria-label` */\n thumbFromLabel?: string;\n\n /** Second thumb `aria-label` */\n thumbToLabel?: string;\n\n /** Props passed down to the hidden input */\n hiddenInputProps?: React.ComponentProps<'input'>;\n\n /** Determines whether the selection should be only allowed from the given marks array @default false */\n restrictToMarks?: boolean;\n\n /** Props passed down to thumb element based on the thumb index */\n thumbProps?: (index: 0 | 1) => React.ComponentProps<'div'>;\n\n /** Determines whether the other thumb should be pushed by the current thumb dragging when `minRange`/`maxRange` is reached @default true */\n pushOnOverlap?: boolean;\n}\n\nexport type RangeSliderFactory = Factory<{\n props: RangeSliderProps;\n ref: HTMLDivElement;\n stylesNames: SliderStylesNames;\n vars: SliderCssVariables;\n}>;\n\nconst varsResolver = createVarsResolver<RangeSliderFactory>(\n (theme, { size, color, thumbSize, radius }) => ({\n root: {\n '--slider-size': getSize(size, 'slider-size'),\n '--slider-color': color ? getThemeColor(color, theme) : undefined,\n '--slider-radius': radius === undefined ? undefined : getRadius(radius),\n '--slider-thumb-size':\n thumbSize !== undefined ? rem(thumbSize) : 'calc(var(--slider-size) * 2)',\n },\n })\n);\n\nconst defaultProps = {\n min: 0,\n max: 100,\n minRange: 10,\n step: 1,\n marks: [],\n label: (f) => f,\n labelTransitionProps: { transition: 'fade', duration: 0 },\n labelAlwaysOn: false,\n showLabelOnHover: true,\n disabled: false,\n pushOnOverlap: true,\n scale: (v) => v,\n size: 'md',\n maxRange: Infinity,\n} satisfies Partial<RangeSliderProps>;\n\nexport const RangeSlider = factory<RangeSliderFactory>((_props) => {\n const props = useProps('RangeSlider', defaultProps, _props);\n const {\n classNames,\n styles,\n value,\n onChange,\n onChangeEnd,\n size,\n min,\n max,\n domain,\n minRange,\n maxRange,\n step,\n precision: _precision,\n defaultValue,\n name,\n marks,\n label,\n labelTransitionProps,\n labelAlwaysOn,\n thumbFromLabel,\n thumbToLabel,\n showLabelOnHover,\n thumbChildren,\n disabled,\n unstyled,\n scale,\n inverted,\n orientation,\n className,\n style,\n vars,\n hiddenInputProps,\n restrictToMarks,\n thumbProps,\n pushOnOverlap,\n attributes,\n ref,\n ...others\n } = props;\n\n const getStyles = useStyles<RangeSliderFactory>({\n name: 'RangeSlider',\n props,\n classes,\n classNames,\n className,\n styles,\n style,\n attributes,\n vars,\n varsResolver,\n unstyled,\n });\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const { dir } = useDirection();\n const [focused, setFocused] = useState(-1);\n const [hovered, setHovered] = useState(false);\n const [_value, setValue] = useUncontrolled<RangeSliderValue>({\n value,\n defaultValue,\n finalValue: [min, max],\n onChange,\n });\n const valueRef = useRef(_value);\n const thumbs = useRef<HTMLDivElement[]>([]);\n const root = useRef<HTMLDivElement>(null);\n const thumbIndex = useRef<number | undefined>(undefined);\n const [domainMin, domainMax] = domain || [min!, max!];\n const positions = [\n getPosition({ value: _value[0], min: domainMin, max: domainMax }),\n getPosition({ value: _value[1], min: domainMin, max: domainMax }),\n ];\n\n const precision = _precision ?? getPrecision(step);\n\n const _setValue = (val: RangeSliderValue) => {\n setValue(val);\n valueRef.current = val;\n };\n\n useEffect(\n () => {\n if (Array.isArray(value)) {\n valueRef.current = value;\n }\n },\n Array.isArray(value) ? [value[0], value[1]] : [null, null]\n );\n\n const setRangedValue = (val: number, index: number, triggerChangeEnd: boolean) => {\n if (index === -1) {\n return;\n }\n\n const clone: RangeSliderValue = [...valueRef.current];\n\n if (restrictToMarks && marks) {\n const closest = findClosestNumber(\n val,\n marks.map((m) => m.value)\n );\n\n const current = clone[index];\n clone[index] = closest;\n const otherIndex = index === 0 ? 1 : 0;\n\n const lastMarkValue = getLastMarkValue(marks);\n const firstMarkValue = getFirstMarkValue(marks);\n\n if (closest === lastMarkValue && clone[otherIndex] === lastMarkValue) {\n clone[index] = current;\n } else if (closest === firstMarkValue && clone[otherIndex] === firstMarkValue) {\n clone[index] = current;\n } else if (closest === clone[otherIndex]) {\n if (current > clone[otherIndex]) {\n clone[otherIndex] = getPreviousMarkValue(closest, marks);\n } else {\n clone[otherIndex] = getNextMarkValue(closest, marks);\n }\n }\n } else {\n const clampedVal = clamp(val, min!, max!);\n clone[index] = clampedVal;\n\n if (index === 0) {\n if (clampedVal > clone[1] - (minRange - 0.000000001)) {\n if (pushOnOverlap) {\n clone[1] = Math.min(val + minRange, max);\n } else {\n clone[index] = valueRef.current[index];\n }\n }\n\n if (clampedVal > (max - (minRange - 0.000000001) || min)) {\n clone[index] = valueRef.current[index];\n }\n\n if (clone[1] - val > maxRange) {\n if (pushOnOverlap) {\n clone[1] = val + maxRange;\n } else {\n clone[index] = valueRef.current[index];\n }\n }\n }\n\n if (index === 1) {\n if (clampedVal < clone[0] + minRange) {\n if (pushOnOverlap) {\n clone[0] = Math.max(val - minRange, min);\n } else {\n clone[index] = valueRef.current[index];\n }\n }\n\n if (clampedVal < clone[0] + minRange) {\n clone[index] = valueRef.current[index];\n }\n\n if (clampedVal - clone[0] > maxRange) {\n if (pushOnOverlap) {\n clone[0] = val - maxRange;\n } else {\n clone[index] = valueRef.current[index];\n }\n }\n }\n }\n\n clone[0] = getFloatingValue(clone[0], precision);\n clone[1] = getFloatingValue(clone[1], precision);\n\n if (clone[0] > clone[1]) {\n const temp = clone[0];\n clone[0] = clone[1];\n clone[1] = temp;\n }\n\n _setValue(clone);\n\n if (triggerChangeEnd) {\n onChangeEnd?.(valueRef.current);\n }\n };\n\n const handleChange = (val: number) => {\n if (!disabled && thumbIndex.current !== undefined) {\n const nextValue = getChangeValue({\n value: val,\n min: domainMin,\n max: domainMax,\n step,\n precision,\n });\n setRangedValue(nextValue, thumbIndex.current, false);\n }\n };\n\n const { ref: useMoveRef, active } = useMove(\n ({ x, y }) => handleChange(orientation === 'vertical' ? 1 - y : x),\n { onScrubEnd: () => !disabled && onChangeEnd?.(valueRef.current) },\n dir\n );\n\n function handleThumbMouseDown(index: number) {\n thumbIndex.current = index;\n }\n\n const handleTrackMouseDownCapture = (\n event: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>\n ) => {\n if (containerRef.current) {\n containerRef.current.focus();\n const rect = containerRef.current.getBoundingClientRect();\n const changePosition = getClientPosition(event.nativeEvent, orientation);\n\n const changeValue =\n orientation === 'vertical'\n ? getChangeValue({\n value: rect.bottom - changePosition,\n max,\n min,\n step,\n containerWidth: rect.height,\n })\n : getChangeValue({\n value: changePosition - rect.left,\n max,\n min,\n step,\n containerWidth: rect.width,\n });\n\n const nearestHandle =\n Math.abs(_value[0] - changeValue) > Math.abs(_value[1] - changeValue) ? 1 : 0;\n const _nearestHandle =\n orientation === 'vertical'\n ? nearestHandle\n : dir === 'ltr'\n ? nearestHandle\n : nearestHandle === 1\n ? 0\n : 1;\n\n thumbIndex.current = _nearestHandle;\n }\n };\n\n const getFocusedThumbIndex = () => {\n if (focused !== 1 && focused !== 0) {\n setFocused(0);\n return 0;\n }\n\n return focused;\n };\n\n const handleTrackKeydownCapture = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!disabled) {\n switch (event.key) {\n case 'ArrowUp': {\n event.preventDefault();\n const focusedIndex = getFocusedThumbIndex();\n thumbs.current[focusedIndex].focus();\n const nextValue =\n restrictToMarks && marks\n ? getNextMarkValue(valueRef.current[focusedIndex], marks)\n : Math.min(Math.max(valueRef.current[focusedIndex] + step, domainMin), domainMax);\n setRangedValue(getFloatingValue(nextValue, precision), focusedIndex, true);\n break;\n }\n\n case 'ArrowRight': {\n event.preventDefault();\n const focusedIndex = getFocusedThumbIndex();\n thumbs.current[focusedIndex].focus();\n\n const nextValue =\n restrictToMarks && marks\n ? (dir === 'rtl' ? getPreviousMarkValue : getNextMarkValue)(\n valueRef.current[focusedIndex],\n marks\n )\n : Math.min(\n Math.max(\n dir === 'rtl'\n ? valueRef.current[focusedIndex] - step\n : valueRef.current[focusedIndex] + step,\n domainMin\n ),\n domainMax\n );\n\n setRangedValue(getFloatingValue(nextValue, precision), focusedIndex, true);\n break;\n }\n\n case 'ArrowDown': {\n event.preventDefault();\n const focusedIndex = getFocusedThumbIndex();\n thumbs.current[focusedIndex].focus();\n const nextValue =\n restrictToMarks && marks\n ? getPreviousMarkValue(valueRef.current[focusedIndex], marks)\n : Math.min(Math.max(valueRef.current[focusedIndex] - step, domainMin), domainMax);\n setRangedValue(getFloatingValue(nextValue, precision), focusedIndex, true);\n break;\n }\n\n case 'ArrowLeft': {\n event.preventDefault();\n const focusedIndex = getFocusedThumbIndex();\n thumbs.current[focusedIndex].focus();\n\n const nextValue =\n restrictToMarks && marks\n ? (dir === 'rtl' ? getNextMarkValue : getPreviousMarkValue)(\n valueRef.current[focusedIndex],\n marks\n )\n : Math.min(\n Math.max(\n dir === 'rtl'\n ? valueRef.current[focusedIndex] + step\n : valueRef.current[focusedIndex] - step,\n domainMin\n ),\n domainMax\n );\n\n setRangedValue(getFloatingValue(nextValue, precision), focusedIndex, true);\n break;\n }\n\n default: {\n break;\n }\n }\n }\n };\n\n const sharedThumbProps = {\n max,\n min,\n size,\n labelTransitionProps,\n labelAlwaysOn,\n orientation,\n onBlur: () => setFocused(-1),\n };\n\n const hasArrayThumbChildren = Array.isArray(thumbChildren);\n\n return (\n <SliderProvider value={{ getStyles }}>\n <SliderRoot\n {...others}\n size={size}\n ref={useMergedRef(ref, root)}\n disabled={disabled}\n orientation={orientation}\n onMouseDownCapture={() => root.current?.focus()}\n onKeyDownCapture={() => {\n if (thumbs.current[0]?.parentElement?.contains(document.activeElement)) {\n return;\n }\n thumbs.current[0]?.focus();\n }}\n >\n <Track\n offset={positions[0]}\n marksOffset={_value[0]}\n filled={positions[1] - positions[0]}\n marks={marks}\n inverted={inverted}\n min={domainMin}\n max={domainMax}\n value={_value[1]}\n disabled={disabled}\n containerProps={{\n ref: useMergedRef(containerRef, useMoveRef) as any,\n onMouseEnter: showLabelOnHover ? () => setHovered(true) : undefined,\n onMouseLeave: showLabelOnHover ? () => setHovered(false) : undefined,\n onTouchStartCapture: handleTrackMouseDownCapture,\n onTouchEndCapture: () => {\n thumbIndex.current = -1;\n },\n onMouseDownCapture: handleTrackMouseDownCapture,\n onMouseUpCapture: () => {\n thumbIndex.current = -1;\n },\n onKeyDownCapture: handleTrackKeydownCapture,\n }}\n >\n <Thumb\n {...sharedThumbProps}\n value={scale(_value[0])}\n position={positions[0]}\n dragging={active}\n label={\n typeof label === 'function'\n ? label(getFloatingValue(scale(_value[0]), precision))\n : label\n }\n ref={(node) => {\n if (node) {\n thumbs.current[0] = node;\n }\n }}\n thumbLabel={thumbFromLabel}\n onMouseDown={() => handleThumbMouseDown(0)}\n onFocus={() => setFocused(0)}\n showLabelOnHover={showLabelOnHover}\n isHovered={hovered}\n disabled={disabled}\n {...thumbProps?.(0)}\n >\n {hasArrayThumbChildren ? thumbChildren[0] : thumbChildren}\n </Thumb>\n\n <Thumb\n {...sharedThumbProps}\n thumbLabel={thumbToLabel}\n value={scale(_value[1])}\n position={positions[1]}\n dragging={active}\n label={\n typeof label === 'function'\n ? label(getFloatingValue(scale(_value[1]), precision))\n : label\n }\n ref={(node) => {\n if (node) {\n thumbs.current[1] = node;\n }\n }}\n onMouseDown={() => handleThumbMouseDown(1)}\n onFocus={() => setFocused(1)}\n showLabelOnHover={showLabelOnHover}\n isHovered={hovered}\n disabled={disabled}\n {...thumbProps?.(1)}\n >\n {hasArrayThumbChildren ? thumbChildren[1] : thumbChildren}\n </Thumb>\n </Track>\n\n <input type=\"hidden\" name={`${name}_from`} value={_value[0]} {...hiddenInputProps} />\n <input type=\"hidden\" name={`${name}_to`} value={_value[1]} {...hiddenInputProps} />\n </SliderRoot>\n </SliderProvider>\n );\n});\n\nRangeSlider.classes = classes;\nRangeSlider.varsResolver = varsResolver;\nRangeSlider.displayName = '@mantine/core/RangeSlider';\n"],"mappings":"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"}