UNPKG

@base-ui/react

Version:

Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.

75 lines (73 loc) 2.94 kB
"use strict"; 'use client'; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.SliderIndicator = void 0; var React = _interopRequireWildcard(require("react")); var _valueToPercent = require("../../utils/valueToPercent"); var _useIsHydrating = require("../../utils/useIsHydrating"); var _useRenderElement = require("../../internals/useRenderElement"); var _SliderRootContext = require("../root/SliderRootContext"); var _stateAttributesMapping = require("../root/stateAttributesMapping"); function getIndicatorStyles(vertical, range, inset, start, end, forceHidden) { const styles = { visibility: forceHidden || inset && (start === undefined || range && end === undefined) ? 'hidden' : undefined, position: vertical ? 'absolute' : 'relative', [vertical ? 'width' : 'height']: 'inherit' }; let startValue = `${start ?? 0}%`; let sizeValue = `${(end ?? 0) - (start ?? 0)}%`; if (inset) { styles['--start-position'] = startValue; startValue = 'var(--start-position)'; if (range) { styles['--relative-size'] = sizeValue; sizeValue = 'var(--relative-size)'; } } styles[vertical ? 'bottom' : 'insetInlineStart'] = range ? startValue : 0; styles[vertical ? 'height' : 'width'] = range ? sizeValue : startValue; return styles; } /** * Visualizes the current value of the slider. * Renders a `<div>` element. * * Documentation: [Base UI Slider](https://base-ui.com/react/components/slider) */ const SliderIndicator = exports.SliderIndicator = /*#__PURE__*/React.forwardRef(function SliderIndicator(componentProps, forwardedRef) { const { render, className, style: styleProp, ...elementProps } = componentProps; const { indicatorPosition, inset, max, min, orientation, renderBeforeHydration, state, values } = (0, _SliderRootContext.useSliderRootContext)(); const isHydrating = (0, _useIsHydrating.useIsHydrating)(); const vertical = orientation === 'vertical'; const range = values.length > 1; const style = getIndicatorStyles(vertical, range, inset, inset ? indicatorPosition[0] : (0, _valueToPercent.valueToPercent)(values[0], min, max), inset ? indicatorPosition[1] : (0, _valueToPercent.valueToPercent)(values[values.length - 1], min, max), inset && renderBeforeHydration && isHydrating); const element = (0, _useRenderElement.useRenderElement)('div', componentProps, { state, ref: forwardedRef, props: [{ ['data-base-ui-slider-indicator']: renderBeforeHydration ? '' : undefined, style, suppressHydrationWarning: renderBeforeHydration || undefined }, elementProps], stateAttributesMapping: _stateAttributesMapping.sliderStateAttributesMapping }); return element; }); if (process.env.NODE_ENV !== "production") SliderIndicator.displayName = "SliderIndicator";