UNPKG

@base-ui-components/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.

94 lines (92 loc) 3.59 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 _useOnMount = require("@base-ui-components/utils/useOnMount"); var _valueToPercent = require("../../utils/valueToPercent"); var _useRenderElement = require("../../utils/useRenderElement"); var _SliderRootContext = require("../root/SliderRootContext"); var _stateAttributesMapping = require("../root/stateAttributesMapping"); function getInsetStyles(vertical, range, start, end, renderBeforeHydration, mounted) { const visibility = start === undefined || range && end === undefined ? 'hidden' : undefined; const startEdge = vertical ? 'bottom' : 'insetInlineStart'; const mainSide = vertical ? 'height' : 'width'; const crossSide = vertical ? 'width' : 'height'; const styles = { visibility: renderBeforeHydration && !mounted ? 'hidden' : visibility, position: vertical ? 'absolute' : 'relative', [crossSide]: 'inherit' }; styles['--start-position'] = `${start ?? 0}%`; if (!range) { styles[startEdge] = 0; styles[mainSide] = 'var(--start-position)'; return styles; } styles['--relative-size'] = `${(end ?? 0) - (start ?? 0)}%`; styles[startEdge] = 'var(--start-position)'; styles[mainSide] = 'var(--relative-size)'; return styles; } function getCenteredStyles(vertical, range, start, end) { const startEdge = vertical ? 'bottom' : 'insetInlineStart'; const mainSide = vertical ? 'height' : 'width'; const crossSide = vertical ? 'width' : 'height'; const styles = { position: vertical ? 'absolute' : 'relative', [crossSide]: 'inherit' }; if (!range) { styles[startEdge] = 0; styles[mainSide] = `${start}%`; return styles; } const size = end - start; styles[startEdge] = `${start}%`; styles[mainSide] = `${size}%`; 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, ...elementProps } = componentProps; const { indicatorPosition, inset, max, min, orientation, renderBeforeHydration, state, values } = (0, _SliderRootContext.useSliderRootContext)(); const [isMounted, setIsMounted] = React.useState(false); (0, _useOnMount.useOnMount)(() => setIsMounted(true)); const vertical = orientation === 'vertical'; const range = values.length > 1; const style = inset ? getInsetStyles(vertical, range, indicatorPosition[0], indicatorPosition[1], renderBeforeHydration, isMounted) : getCenteredStyles(vertical, range, (0, _valueToPercent.valueToPercent)(values[0], min, max), (0, _valueToPercent.valueToPercent)(values[values.length - 1], min, max)); 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";