import React, { HTMLAttributes } from 'react'; import styled from 'styled-components'; export interface ProgressProps extends HTMLAttributes { percent: number; finishColor?: string; undoneColor?: string; format?: (num: number) => string; children?: React.ReactNode; type?: 'line' | 'circle'; dot?: boolean; statistic?: boolean; } const Wrap = styled.div` position: relative; > .inner { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 10; } `; type ProgressStyledProp = { percent: number; finishColor: string; undoneColor: string; }; const ProgressStyled = styled.div` display: inline-block; > .shadow { width: 100px; height: 100px; position: relative; border-radius: 50%; background: ${(props: ProgressStyledProp) => `conic-gradient(${props.finishColor} 0%, ${props.finishColor} ${props.percent}%, ${props.undoneColor} ${props.percent}%, ${props.undoneColor} 100%)`}; mask: radial-gradient(transparent 40px, #000 41px); } `; const LineWrap = styled.div` align-items: center; gap: 10px; height: 8px; `; const LineProgress = styled.div` position: relative; width: 100%; height: 100%; border-radius: 5px; background: ${(props: ProgressStyledProp) => `linear-gradient(90deg,${props.finishColor} 0%, ${props.finishColor} ${props.percent}%, ${props.undoneColor} ${props.percent}%, ${props.undoneColor} 100%)`}; > .dot { width: 16px; height: 16px; outline: none; border-radius: 50%; background-color: white; border: 1px solid #91d5ff; position: absolute; top: 0; left: ${(props: ProgressStyledProp) => `${props.percent}%`}; transform: translate(-50%, -4px); cursor: pointer; &:active { box-shadow: 0 0 4px 4px rgba(105, 192, 255, 0.5); } &.dotFocus { box-shadow: 0 0 4px 4px rgba(105, 192, 255, 0.5); } } `; const Progress: React.FC = (props) => { const { children, type, percent, finishColor, statistic, undoneColor, format, dot, ...rest } = props; return (
{format!(percent)}
{dot ? ( // eslint-disable-next-line jsx-a11y/control-has-associated-label
); }; Progress.defaultProps = { children: '', finishColor: '#1890ff', undoneColor: '#52c41a', format: (num: number) => `${num}%`, type: 'line', dot: false, statistic: true }; export default Progress;