@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.
90 lines (88 loc) • 2.95 kB
JavaScript
;
'use client';
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ProgressRoot = void 0;
var React = _interopRequireWildcard(require("react"));
var _useValueAsRef = require("@base-ui-components/utils/useValueAsRef");
var _formatNumber = require("../../utils/formatNumber");
var _useRenderElement = require("../../utils/useRenderElement");
var _ProgressRootContext = require("./ProgressRootContext");
var _stateAttributesMapping = require("./stateAttributesMapping");
var _jsxRuntime = require("react/jsx-runtime");
function formatValue(value, locale, format) {
if (value == null) {
return '';
}
if (!format) {
return (0, _formatNumber.formatNumber)(value / 100, locale, {
style: 'percent'
});
}
return (0, _formatNumber.formatNumber)(value, locale, format);
}
function getDefaultAriaValueText(formattedValue, value) {
if (value == null) {
return 'indeterminate progress';
}
return formattedValue || `${value}%`;
}
/**
* Groups all parts of the progress bar and provides the task completion status to screen readers.
* Renders a `<div>` element.
*
* Documentation: [Base UI Progress](https://base-ui.com/react/components/progress)
*/
const ProgressRoot = exports.ProgressRoot = /*#__PURE__*/React.forwardRef(function ProgressRoot(componentProps, forwardedRef) {
const {
format,
getAriaValueText = getDefaultAriaValueText,
locale,
max = 100,
min = 0,
value,
render,
className,
...elementProps
} = componentProps;
const [labelId, setLabelId] = React.useState();
const formatOptionsRef = (0, _useValueAsRef.useValueAsRef)(format);
let status = 'indeterminate';
if (Number.isFinite(value)) {
status = value === max ? 'complete' : 'progressing';
}
const formattedValue = formatValue(value, locale, formatOptionsRef.current);
const state = React.useMemo(() => ({
status
}), [status]);
const defaultProps = {
'aria-labelledby': labelId,
'aria-valuemax': max,
'aria-valuemin': min,
'aria-valuenow': value ?? undefined,
'aria-valuetext': getAriaValueText(formattedValue, value),
role: 'progressbar'
};
const contextValue = React.useMemo(() => ({
formattedValue,
max,
min,
setLabelId,
state,
status,
value
}), [formattedValue, max, min, setLabelId, state, status, value]);
const element = (0, _useRenderElement.useRenderElement)('div', componentProps, {
state,
ref: forwardedRef,
props: [defaultProps, elementProps],
stateAttributesMapping: _stateAttributesMapping.progressStateAttributesMapping
});
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ProgressRootContext.ProgressRootContext.Provider, {
value: contextValue,
children: element
});
});
if (process.env.NODE_ENV !== "production") ProgressRoot.displayName = "ProgressRoot";