UNPKG

6.37 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
6
7Object.defineProperty(exports, "__esModule", {
8 value: true
9});
10exports.default = void 0;
11
12var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
14var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
16var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
17
18var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
19
20var React = _interopRequireWildcard(require("react"));
21
22var _classnames = _interopRequireDefault(require("classnames"));
23
24var _common = require("./common");
25
26var _useId = _interopRequireDefault(require("./hooks/useId"));
27
28var _excluded = ["id", "prefixCls", "strokeWidth", "trailWidth", "gapDegree", "gapPosition", "trailColor", "strokeLinecap", "style", "className", "strokeColor", "percent"];
29
30function stripPercentToNumber(percent) {
31 return +percent.replace('%', '');
32}
33
34function toArray(value) {
35 var mergedValue = value !== null && value !== void 0 ? value : [];
36 return Array.isArray(mergedValue) ? mergedValue : [mergedValue];
37}
38
39var VIEW_BOX_SIZE = 100;
40
41var getCircleStyle = function getCircleStyle(radius, offset, percent, strokeColor) {
42 var gapDegree = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
43 var gapPosition = arguments.length > 5 ? arguments[5] : undefined;
44 var strokeLinecap = arguments.length > 6 ? arguments[6] : undefined;
45 var strokeWidth = arguments.length > 7 ? arguments[7] : undefined;
46 var rotateDeg = gapDegree > 0 ? 90 + gapDegree / 2 : -90;
47 var perimeter = Math.PI * 2 * radius;
48 var perimeterWithoutGap = perimeter * ((360 - gapDegree) / 360);
49 var offsetDeg = offset / 100 * 360 * ((360 - gapDegree) / 360);
50 var positionDeg = gapDegree === 0 ? 0 : {
51 bottom: 0,
52 top: 180,
53 left: 90,
54 right: -90
55 }[gapPosition];
56 var strokeDashoffset = (100 - percent) / 100 * perimeterWithoutGap; // Fix percent accuracy when strokeLinecap is round
57 // https://github.com/ant-design/ant-design/issues/35009
58
59 if (strokeLinecap === 'round' && percent !== 100) {
60 strokeDashoffset += strokeWidth / 2; // when percent is small enough (<= 1%), keep smallest value to avoid it's disapperance
61
62 if (strokeDashoffset >= perimeterWithoutGap) {
63 strokeDashoffset = perimeterWithoutGap - 0.01;
64 }
65 }
66
67 return {
68 stroke: typeof strokeColor === 'string' ? strokeColor : undefined,
69 strokeDasharray: "".concat(perimeterWithoutGap, "px ").concat(perimeter),
70 strokeDashoffset: strokeDashoffset,
71 transform: percent === 100 ? undefined : "rotate(".concat(rotateDeg + offsetDeg + positionDeg, "deg)"),
72 transformOrigin: '50% 50%',
73 transition: 'stroke-dashoffset .3s ease 0s, stroke-dasharray .3s ease 0s, stroke .3s, stroke-width .06s ease .3s, opacity .3s ease 0s',
74 fillOpacity: 0
75 };
76};
77
78var Circle = function Circle(_ref) {
79 var id = _ref.id,
80 prefixCls = _ref.prefixCls,
81 strokeWidth = _ref.strokeWidth,
82 trailWidth = _ref.trailWidth,
83 gapDegree = _ref.gapDegree,
84 gapPosition = _ref.gapPosition,
85 trailColor = _ref.trailColor,
86 strokeLinecap = _ref.strokeLinecap,
87 style = _ref.style,
88 className = _ref.className,
89 strokeColor = _ref.strokeColor,
90 percent = _ref.percent,
91 restProps = (0, _objectWithoutProperties2.default)(_ref, _excluded);
92 var mergedId = (0, _useId.default)(id);
93 var gradientId = "".concat(mergedId, "-gradient");
94 var radius = VIEW_BOX_SIZE / 2 - strokeWidth / 2;
95 var circleStyle = getCircleStyle(radius, 0, 100, trailColor, gapDegree, gapPosition, strokeLinecap, strokeWidth);
96 var percentList = toArray(percent);
97 var strokeColorList = toArray(strokeColor);
98 var gradient = strokeColorList.find(function (color) {
99 return color && (0, _typeof2.default)(color) === 'object';
100 });
101
102 var _useTransitionDuratio = (0, _common.useTransitionDuration)(percentList),
103 _useTransitionDuratio2 = (0, _slicedToArray2.default)(_useTransitionDuratio, 1),
104 paths = _useTransitionDuratio2[0];
105
106 var getStokeList = function getStokeList() {
107 var stackPtg = 0;
108 return percentList.map(function (ptg, index) {
109 var color = strokeColorList[index] || strokeColorList[strokeColorList.length - 1];
110 var stroke = color && (0, _typeof2.default)(color) === 'object' ? "url(#".concat(gradientId, ")") : undefined;
111 var circleStyleForStack = getCircleStyle(radius, stackPtg, ptg, color, gapDegree, gapPosition, strokeLinecap, strokeWidth);
112 stackPtg += ptg;
113 return /*#__PURE__*/React.createElement("circle", {
114 key: index,
115 className: "".concat(prefixCls, "-circle-path"),
116 r: radius,
117 cx: VIEW_BOX_SIZE / 2,
118 cy: VIEW_BOX_SIZE / 2,
119 stroke: stroke,
120 strokeLinecap: strokeLinecap,
121 strokeWidth: strokeWidth,
122 opacity: ptg === 0 ? 0 : 1,
123 style: circleStyleForStack,
124 ref: paths[index]
125 });
126 }).reverse();
127 };
128
129 return /*#__PURE__*/React.createElement("svg", (0, _extends2.default)({
130 className: (0, _classnames.default)("".concat(prefixCls, "-circle"), className),
131 viewBox: "0 0 ".concat(VIEW_BOX_SIZE, " ").concat(VIEW_BOX_SIZE),
132 style: style,
133 id: id
134 }, restProps), gradient && /*#__PURE__*/React.createElement("defs", null, /*#__PURE__*/React.createElement("linearGradient", {
135 id: gradientId,
136 x1: "100%",
137 y1: "0%",
138 x2: "0%",
139 y2: "0%"
140 }, Object.keys(gradient).sort(function (a, b) {
141 return stripPercentToNumber(a) - stripPercentToNumber(b);
142 }).map(function (key, index) {
143 return /*#__PURE__*/React.createElement("stop", {
144 key: index,
145 offset: key,
146 stopColor: gradient[key]
147 });
148 }))), /*#__PURE__*/React.createElement("circle", {
149 className: "".concat(prefixCls, "-circle-trail"),
150 r: radius,
151 cx: VIEW_BOX_SIZE / 2,
152 cy: VIEW_BOX_SIZE / 2,
153 stroke: trailColor,
154 strokeLinecap: strokeLinecap,
155 strokeWidth: trailWidth || strokeWidth,
156 style: circleStyle
157 }), getStokeList());
158};
159
160Circle.defaultProps = _common.defaultProps;
161Circle.displayName = 'Circle';
162var _default = Circle;
163exports.default = _default;
\No newline at end of file