UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

121 lines 3.47 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import React from 'react'; import { combineDescribedBy, combineLabelledBy, validateDOMAttributes } from "../../shared/component-helper.js"; import Button from "../button/Button.js"; import Tooltip from "../tooltip/Tooltip.js"; import { useSliderEvents } from "./hooks/useSliderEvents.js"; import { useSliderProps } from "./hooks/useSliderProps.js"; import { clamp, getFormattedNumber } from "./SliderHelpers.js"; export function SliderThumb() { const { values } = useSliderProps(); return React.createElement(React.Fragment, null, values.map((value, i) => { return React.createElement(Thumb, { key: i, value: value, currentIndex: i }); })); } function Thumb({ value, currentIndex }) { const { thumbIndex, isVertical, isReverse, showStatus, attributes, allProps, shouldAnimate } = useSliderProps(); const { id, label, min, max, step, skeleton, disabled, suffix, numberFormat, tooltip, alwaysShowTooltip } = allProps; const index = thumbIndex.current; let percent = clamp((value - min) * 100 / (max - min)); if (isReverse) { percent = 100 - percent; } const style = { zIndex: index === currentIndex ? 4 : 3, [`${isVertical ? 'top' : 'left'}`]: `${percent}%` }; const { onThumbMouseDownHandler, onThumbMouseUpHandler, onHelperChangeHandler, onHelperFocusHandler } = useSliderEvents(); const { number, aria } = getFormattedNumber(value, numberFormat); const helperParams = {}; if (label) { helperParams['aria-labelledby'] = combineLabelledBy(helperParams, label ? id + '-label' : null); } if (showStatus || suffix) { helperParams['aria-describedby'] = combineDescribedBy(helperParams, showStatus ? id + '-status' : null, suffix ? id + '-suffix' : null); } const thumbParams = attributes; const elemRef = React.useRef(); const [forceActive, setForceActive] = React.useState(false); validateDOMAttributes(allProps, thumbParams); return React.createElement("span", { className: "dnb-slider__thumb", style: style }, React.createElement("input", _extends({ id: `${id}-thumb-${currentIndex}`, type: "range", className: "dnb-slider__button-helper", min: min, max: max, step: step, value: value, disabled: disabled, onChange: onHelperChangeHandler, onFocus: event => { onHelperFocusHandler(event); setForceActive(true); }, onBlur: () => setForceActive(false), onMouseDown: onThumbMouseDownHandler, onMouseUp: onThumbMouseUpHandler, "aria-valuemin": min, "aria-valuemax": max, "aria-valuenow": value, "aria-valuetext": aria ? aria : undefined, "aria-orientation": isVertical ? 'vertical' : 'horizontal', "data-index": currentIndex }, helperParams)), React.createElement(Button, _extends({ id: `${id}-button-${currentIndex}`, element: "span", type: "", variant: "secondary", disabled: disabled, skeleton: skeleton, innerRef: elemRef }, thumbParams)), tooltip && React.createElement(Tooltip, { key: `group-${currentIndex}`, targetElement: elemRef, forceActive: Boolean(alwaysShowTooltip || forceActive), targetRefreshKey: value, showDelay: 1, hideDelay: 300, omitDescribedBy: true }, number || value, shouldAnimate)); } //# sourceMappingURL=SliderThumb.js.map