@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
JavaScript
;
'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";