UNPKG

@itwin/itwinui-react

Version:

A react component library for iTwinUI

118 lines (117 loc) 3.39 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true, }); Object.defineProperty(exports, 'Thumb', { enumerable: true, get: function () { return Thumb; }, }); const _interop_require_default = require('@swc/helpers/_/_interop_require_default'); const _interop_require_wildcard = require('@swc/helpers/_/_interop_require_wildcard'); const _react = /*#__PURE__*/ _interop_require_wildcard._(require('react')); const _classnames = /*#__PURE__*/ _interop_require_default._( require('classnames'), ); const _Tooltip = require('../Tooltip/Tooltip.js'); const _index = require('../../utils/index.js'); const Thumb = (props) => { let { value, index, minVal, maxVal, step, sliderMin, sliderMax, isActive, onThumbActivated, onThumbValueChanged, tooltipProps, thumbProps, disabled, } = props; let thumbRef = _react.useRef(null); let handleOnKeyboardEvent = _react.useCallback( (event, keyboardReleased) => { if (disabled || event.altKey) return; switch (event.key) { case 'ArrowLeft': case 'ArrowDown': onThumbValueChanged( index, Math.max(value - step, minVal), keyboardReleased, ); break; case 'ArrowRight': case 'ArrowUp': onThumbValueChanged( index, Math.min(value + step, maxVal), keyboardReleased, ); break; case 'Home': onThumbValueChanged(index, minVal, keyboardReleased); break; case 'End': onThumbValueChanged(index, maxVal, keyboardReleased); break; default: return; } event.preventDefault(); }, [disabled, onThumbValueChanged, index, value, step, minVal, maxVal], ); let handlePointerDownOnThumb = _react.useCallback(() => { disabled || onThumbActivated(index); }, [disabled, index, onThumbActivated]); let adjustedValue = _react.useMemo(() => { if (value < sliderMin) return sliderMin; if (value > sliderMax) return sliderMax; return value; }, [sliderMax, sliderMin, value]); let lowPercent = _react.useMemo(() => { if (sliderMax === sliderMin) return 0; return (100.0 * (adjustedValue - sliderMin)) / (sliderMax - sliderMin); }, [adjustedValue, sliderMax, sliderMin]); let { style, className, ...rest } = thumbProps || {}; return _react.createElement( _Tooltip.Tooltip, { placement: 'top', autoUpdateOptions: { animationFrame: true, }, ariaStrategy: 'none', ...tooltipProps, }, _react.createElement(_index.Box, { ...rest, ref: (0, _index.useMergedRefs)(thumbRef, thumbProps?.ref), style: { ...style, '--iui-slider-thumb-position': `${lowPercent}%`, }, className: (0, _classnames.default)( 'iui-slider-thumb', { 'iui-active': isActive, }, className, ), role: 'slider', tabIndex: disabled ? void 0 : 0, 'aria-valuemin': minVal, 'aria-valuenow': value, 'aria-valuemax': maxVal, 'aria-disabled': disabled, onPointerDown: handlePointerDownOnThumb, onKeyDown: (event) => handleOnKeyboardEvent(event, false), onKeyUp: (event) => handleOnKeyboardEvent(event, true), }), ); };