You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
4.5 KiB

"use strict";
exports.__esModule = true;
exports.default = void 0;
var _utils = require("../utils");
var _raf = require("../utils/dom/raf");
var _createNamespace = (0, _utils.createNamespace)('circle'),
createComponent = _createNamespace[0],
bem = _createNamespace[1];
var PERIMETER = 3140;
var uid = 0;
function format(rate) {
return Math.min(Math.max(rate, 0), 100);
}
function getPath(clockwise, viewBoxSize) {
var sweepFlag = clockwise ? 1 : 0;
return "M " + viewBoxSize / 2 + " " + viewBoxSize / 2 + " m 0, -500 a 500, 500 0 1, " + sweepFlag + " 0, 1000 a 500, 500 0 1, " + sweepFlag + " 0, -1000";
}
var _default = createComponent({
props: {
text: String,
size: [Number, String],
color: [String, Object],
layerColor: String,
strokeLinecap: String,
value: {
type: Number,
default: 0
},
speed: {
type: [Number, String],
default: 0
},
fill: {
type: String,
default: 'none'
},
rate: {
type: [Number, String],
default: 100
},
strokeWidth: {
type: [Number, String],
default: 40
},
clockwise: {
type: Boolean,
default: true
}
},
beforeCreate: function beforeCreate() {
this.uid = "van-circle-gradient-" + uid++;
},
computed: {
style: function style() {
var size = (0, _utils.addUnit)(this.size);
return {
width: size,
height: size
};
},
path: function path() {
return getPath(this.clockwise, this.viewBoxSize);
},
viewBoxSize: function viewBoxSize() {
return +this.strokeWidth + 1000;
},
layerStyle: function layerStyle() {
return {
fill: "" + this.fill,
stroke: "" + this.layerColor,
strokeWidth: this.strokeWidth + "px"
};
},
hoverStyle: function hoverStyle() {
var offset = PERIMETER * this.value / 100;
return {
stroke: "" + this.color,
strokeWidth: +this.strokeWidth + 1 + "px",
strokeLinecap: this.strokeLinecap,
strokeDasharray: offset + "px " + PERIMETER + "px"
};
},
gradient: function gradient() {
return (0, _utils.isObject)(this.color);
},
LinearGradient: function LinearGradient() {
var _this = this;
var h = this.$createElement;
if (!this.gradient) {
return;
}
var Stops = Object.keys(this.color).sort(function (a, b) {
return parseFloat(a) - parseFloat(b);
}).map(function (key, index) {
return h("stop", {
"key": index,
"attrs": {
"offset": key,
"stop-color": _this.color[key]
}
});
});
return h("defs", [h("linearGradient", {
"attrs": {
"id": this.uid,
"x1": "100%",
"y1": "0%",
"x2": "0%",
"y2": "0%"
}
}, [Stops])]);
}
},
watch: {
rate: {
handler: function handler(rate) {
this.startTime = Date.now();
this.startRate = this.value;
this.endRate = format(rate);
this.increase = this.endRate > this.startRate;
this.duration = Math.abs((this.startRate - this.endRate) * 1000 / this.speed);
if (this.speed) {
(0, _raf.cancelRaf)(this.rafId);
this.rafId = (0, _raf.raf)(this.animate);
} else {
this.$emit('input', this.endRate);
}
},
immediate: true
}
},
methods: {
animate: function animate() {
var now = Date.now();
var progress = Math.min((now - this.startTime) / this.duration, 1);
var rate = progress * (this.endRate - this.startRate) + this.startRate;
this.$emit('input', format(parseFloat(rate.toFixed(1))));
if (this.increase ? rate < this.endRate : rate > this.endRate) {
this.rafId = (0, _raf.raf)(this.animate);
}
}
},
render: function render() {
var h = arguments[0];
return h("div", {
"class": bem(),
"style": this.style
}, [h("svg", {
"attrs": {
"viewBox": "0 0 " + this.viewBoxSize + " " + this.viewBoxSize
}
}, [this.LinearGradient, h("path", {
"class": bem('layer'),
"style": this.layerStyle,
"attrs": {
"d": this.path
}
}), h("path", {
"attrs": {
"d": this.path,
"stroke": this.gradient ? "url(#" + this.uid + ")" : this.color
},
"class": bem('hover'),
"style": this.hoverStyle
})]), this.slots() || this.text && h("div", {
"class": bem('text')
}, [this.text])]);
}
});
exports.default = _default;