UNPKG

mdc-react

Version:

Material Components for the web implemented in React

65 lines (54 loc) 2 kB
import { forwardRef } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import { cssClasses } from './constants'; const LinearProgress = forwardRef(({ value = 0, buffer = 0, indeterminate = false, closed = false, className, ...props }, ref) => { const classNames = classnames(cssClasses.ROOT, { [cssClasses.INDETERMINATE]: indeterminate, [cssClasses.ANIMATION_READY]: indeterminate, [cssClasses.CLOSED]: closed }, className); const primaryBarStyle = { transform: `scaleX(${indeterminate ? 1 : (value > 1 ? (value * 0.01) : value)})` }; const bufferStyle = { flexBasis: buffer ? `${indeterminate ? 1 : (buffer < 1 ? (buffer * 100) : buffer)}%` : undefined }; return ( <div ref={ref} className={classNames} role="progressbar" aria-valuemin="0" aria-valuemax="1" aria-valuenow={value > 1 ? (value * 0.01) : value} {...props} > <div className={cssClasses.BUFFER}> <div className={cssClasses.BUFFER_BAR} style={bufferStyle} /> <div className={cssClasses.BUFFER_DOTS} /> </div> <div className={`${cssClasses.BAR} ${cssClasses.PRIMARY_BAR}`} style={primaryBarStyle}> <span className={cssClasses.BAR_INNER} /> </div> <div className={`${cssClasses.BAR} ${cssClasses.SECONDARY_BAR}`}> <span className={cssClasses.BAR_INNER} /> </div> </div> ); }); LinearProgress.displayName = 'MDCLinearProgress'; LinearProgress.propTypes = { value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), buffer: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), indeterminate: PropTypes.bool, closed: PropTypes.bool }; export default LinearProgress;