This commit is contained in:
darenhsu
2022-07-17 13:16:16 +08:00
parent 84759556ff
commit befd344ab0
28070 changed files with 4008428 additions and 1 deletions
+354
View File
@@ -0,0 +1,354 @@
// Mixins
import Colorable from '../../mixins/colorable'; // Utilities
import mixins from '../../util/mixins';
import { genPoints, genBars } from './helpers/core';
import { genPath } from './helpers/path';
export default mixins(Colorable).extend({
name: 'VSparkline',
inheritAttrs: false,
props: {
autoDraw: Boolean,
autoDrawDuration: {
type: Number,
default: 2000
},
autoDrawEasing: {
type: String,
default: 'ease'
},
autoLineWidth: {
type: Boolean,
default: false
},
color: {
type: String,
default: 'primary'
},
fill: {
type: Boolean,
default: false
},
gradient: {
type: Array,
default: () => []
},
gradientDirection: {
type: String,
validator: val => ['top', 'bottom', 'left', 'right'].includes(val),
default: 'top'
},
height: {
type: [String, Number],
default: 75
},
labels: {
type: Array,
default: () => []
},
labelSize: {
type: [Number, String],
default: 7
},
lineWidth: {
type: [String, Number],
default: 4
},
padding: {
type: [String, Number],
default: 8
},
showLabels: Boolean,
smooth: {
type: [Boolean, Number, String],
default: false
},
type: {
type: String,
default: 'trend',
validator: val => ['trend', 'bar'].includes(val)
},
value: {
type: Array,
default: () => []
},
width: {
type: [Number, String],
default: 300
}
},
data: () => ({
lastLength: 0
}),
computed: {
parsedPadding() {
return Number(this.padding);
},
parsedWidth() {
return Number(this.width);
},
parsedHeight() {
return parseInt(this.height, 10);
},
parsedLabelSize() {
return parseInt(this.labelSize, 10) || 7;
},
totalHeight() {
let height = this.parsedHeight;
if (this.hasLabels) height += parseInt(this.labelSize, 10) * 1.5;
return height;
},
totalWidth() {
let width = this.parsedWidth;
if (this.type === 'bar') width = Math.max(this.value.length * this._lineWidth, width);
return width;
},
totalValues() {
return this.value.length;
},
_lineWidth() {
if (this.autoLineWidth && this.type !== 'trend') {
const totalPadding = this.parsedPadding * (this.totalValues + 1);
return (this.parsedWidth - totalPadding) / this.totalValues;
} else {
return parseFloat(this.lineWidth) || 4;
}
},
boundary() {
if (this.type === 'bar') return {
minX: 0,
maxX: this.totalWidth,
minY: 0,
maxY: this.parsedHeight
};
const padding = this.parsedPadding;
return {
minX: padding,
maxX: this.totalWidth - padding,
minY: padding,
maxY: this.parsedHeight - padding
};
},
hasLabels() {
return Boolean(this.showLabels || this.labels.length > 0 || this.$scopedSlots.label);
},
parsedLabels() {
const labels = [];
const points = this._values;
const len = points.length;
for (let i = 0; labels.length < len; i++) {
const item = points[i];
let value = this.labels[i];
if (!value) {
value = typeof item === 'object' ? item.value : item;
}
labels.push({
x: item.x,
value: String(value)
});
}
return labels;
},
normalizedValues() {
return this.value.map(item => typeof item === 'number' ? item : item.value);
},
_values() {
return this.type === 'trend' ? genPoints(this.normalizedValues, this.boundary) : genBars(this.normalizedValues, this.boundary);
},
textY() {
let y = this.parsedHeight;
if (this.type === 'trend') y -= 4;
return y;
},
_radius() {
return this.smooth === true ? 8 : Number(this.smooth);
}
},
watch: {
value: {
immediate: true,
handler() {
this.$nextTick(() => {
if (!this.autoDraw || this.type === 'bar' || !this.$refs.path) return;
const path = this.$refs.path;
const length = path.getTotalLength();
if (!this.fill) {
path.style.transition = 'none';
path.style.strokeDasharray = length + ' ' + length;
path.style.strokeDashoffset = Math.abs(length - (this.lastLength || 0)).toString();
path.getBoundingClientRect();
path.style.transition = `stroke-dashoffset ${this.autoDrawDuration}ms ${this.autoDrawEasing}`;
path.style.strokeDashoffset = '0';
} else {
path.style.transformOrigin = 'bottom center';
path.style.transition = 'none';
path.style.transform = `scaleY(0)`;
path.getBoundingClientRect();
path.style.transition = `transform ${this.autoDrawDuration}ms ${this.autoDrawEasing}`;
path.style.transform = `scaleY(1)`;
}
this.lastLength = length;
});
}
}
},
methods: {
genGradient() {
const gradientDirection = this.gradientDirection;
const gradient = this.gradient.slice(); // Pushes empty string to force
// a fallback to currentColor
if (!gradient.length) gradient.push('');
const len = Math.max(gradient.length - 1, 1);
const stops = gradient.reverse().map((color, index) => this.$createElement('stop', {
attrs: {
offset: index / len,
'stop-color': color || 'currentColor'
}
}));
return this.$createElement('defs', [this.$createElement('linearGradient', {
attrs: {
id: this._uid,
x1: +(gradientDirection === 'left'),
y1: +(gradientDirection === 'top'),
x2: +(gradientDirection === 'right'),
y2: +(gradientDirection === 'bottom')
}
}, stops)]);
},
genG(children) {
return this.$createElement('g', {
style: {
fontSize: '8',
textAnchor: 'middle',
dominantBaseline: 'mathematical',
fill: 'currentColor'
}
}, children);
},
genPath() {
const points = genPoints(this.normalizedValues, this.boundary);
return this.$createElement('path', {
attrs: {
d: genPath(points, this._radius, this.fill, this.parsedHeight),
fill: this.fill ? `url(#${this._uid})` : 'none',
stroke: this.fill ? 'none' : `url(#${this._uid})`
},
ref: 'path'
});
},
genLabels(offsetX) {
const children = this.parsedLabels.map((item, i) => this.$createElement('text', {
attrs: {
x: item.x + offsetX + this._lineWidth / 2,
y: this.textY + this.parsedLabelSize * 0.75,
'font-size': Number(this.labelSize) || 7
}
}, [this.genLabel(item, i)]));
return this.genG(children);
},
genLabel(item, index) {
return this.$scopedSlots.label ? this.$scopedSlots.label({
index,
value: item.value
}) : item.value;
},
genBars() {
if (!this.value || this.totalValues < 2) return undefined;
const bars = genBars(this.normalizedValues, this.boundary);
const offsetX = (Math.abs(bars[0].x - bars[1].x) - this._lineWidth) / 2;
return this.$createElement('svg', {
attrs: {
display: 'block',
viewBox: `0 0 ${this.totalWidth} ${this.totalHeight}`
}
}, [this.genGradient(), this.genClipPath(bars, offsetX, this._lineWidth, 'sparkline-bar-' + this._uid), this.hasLabels ? this.genLabels(offsetX) : undefined, this.$createElement('g', {
attrs: {
'clip-path': `url(#sparkline-bar-${this._uid}-clip)`,
fill: `url(#${this._uid})`
}
}, [this.$createElement('rect', {
attrs: {
x: 0,
y: 0,
width: this.totalWidth,
height: this.height
}
})])]);
},
genClipPath(bars, offsetX, lineWidth, id) {
const rounding = typeof this.smooth === 'number' ? this.smooth : this.smooth ? 2 : 0;
return this.$createElement('clipPath', {
attrs: {
id: `${id}-clip`
}
}, bars.map(item => {
return this.$createElement('rect', {
attrs: {
x: item.x + offsetX,
y: item.y,
width: lineWidth,
height: item.height,
rx: rounding,
ry: rounding
}
}, [this.autoDraw ? this.$createElement('animate', {
attrs: {
attributeName: 'height',
from: 0,
to: item.height,
dur: `${this.autoDrawDuration}ms`,
fill: 'freeze'
}
}) : undefined]);
}));
},
genTrend() {
return this.$createElement('svg', this.setTextColor(this.color, {
attrs: { ...this.$attrs,
display: 'block',
'stroke-width': this._lineWidth || 1,
viewBox: `0 0 ${this.width} ${this.totalHeight}`
}
}), [this.genGradient(), this.hasLabels && this.genLabels(-(this._lineWidth / 2)), this.genPath()]);
}
},
render(h) {
if (this.totalValues < 2) return undefined;
return this.type === 'trend' ? this.genTrend() : this.genBars();
}
});
//# sourceMappingURL=VSparkline.js.map
File diff suppressed because one or more lines are too long
+46
View File
@@ -0,0 +1,46 @@
export function genPoints(values, boundary) {
const {
minX,
maxX,
minY,
maxY
} = boundary;
const totalValues = values.length;
const maxValue = Math.max(...values);
const minValue = Math.min(...values);
const gridX = (maxX - minX) / (totalValues - 1);
const gridY = (maxY - minY) / (maxValue - minValue || 1);
return values.map((value, index) => {
return {
x: minX + index * gridX,
y: maxY - (value - minValue) * gridY + +(index === totalValues - 1) * 0.00001 - +(index === 0) * 0.00001,
value
};
});
}
export function genBars(values, boundary) {
const {
minX,
maxX,
minY,
maxY
} = boundary;
const totalValues = values.length;
let maxValue = Math.max(...values);
let minValue = Math.min(...values);
if (minValue > 0) minValue = 0;
if (maxValue < 0) maxValue = 0;
const gridX = maxX / totalValues;
const gridY = (maxY - minY) / (maxValue - minValue || 1);
const horizonY = maxY - Math.abs(minValue * gridY);
return values.map((value, index) => {
const height = Math.abs(gridY * value);
return {
x: minX + index * gridX,
y: horizonY - height + +(value < 0) * height,
height,
value
};
});
}
//# sourceMappingURL=core.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/components/VSparkline/helpers/core.ts"],"names":[],"mappings":"AAEA,OAAM,SAAU,SAAV,CACJ,MADI,EAEJ,QAFI,EAEc;AAElB,QAAM;AAAE,IAAA,IAAF;AAAQ,IAAA,IAAR;AAAc,IAAA,IAAd;AAAoB,IAAA;AAApB,MAA6B,QAAnC;AACA,QAAM,WAAW,GAAG,MAAM,CAAC,MAA3B;AACA,QAAM,QAAQ,GAAG,IAAI,CAAC,GAAL,CAAS,GAAG,MAAZ,CAAjB;AACA,QAAM,QAAQ,GAAG,IAAI,CAAC,GAAL,CAAS,GAAG,MAAZ,CAAjB;AAEA,QAAM,KAAK,GAAG,CAAC,IAAI,GAAG,IAAR,KAAiB,WAAW,GAAG,CAA/B,CAAd;AACA,QAAM,KAAK,GAAG,CAAC,IAAI,GAAG,IAAR,KAAkB,QAAQ,GAAG,QAAZ,IAAyB,CAA1C,CAAd;AAEA,SAAO,MAAM,CAAC,GAAP,CAAW,CAAC,KAAD,EAAQ,KAAR,KAAiB;AACjC,WAAO;AACL,MAAA,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,KADb;AAEL,MAAA,CAAC,EACC,IAAI,GACJ,CAAC,KAAK,GAAG,QAAT,IAAqB,KADrB,GAEA,EAAE,KAAK,KAAK,WAAW,GAAG,CAA1B,IAA+B,OAF/B,GAGA,EAAE,KAAK,KAAK,CAAZ,IAAiB,OANd;AAOL,MAAA;AAPK,KAAP;AASD,GAVM,CAAP;AAWD;AAED,OAAM,SAAU,OAAV,CACJ,MADI,EAEJ,QAFI,EAEc;AAElB,QAAM;AAAE,IAAA,IAAF;AAAQ,IAAA,IAAR;AAAc,IAAA,IAAd;AAAoB,IAAA;AAApB,MAA6B,QAAnC;AACA,QAAM,WAAW,GAAG,MAAM,CAAC,MAA3B;AACA,MAAI,QAAQ,GAAG,IAAI,CAAC,GAAL,CAAS,GAAG,MAAZ,CAAf;AACA,MAAI,QAAQ,GAAG,IAAI,CAAC,GAAL,CAAS,GAAG,MAAZ,CAAf;AAEA,MAAI,QAAQ,GAAG,CAAf,EAAkB,QAAQ,GAAG,CAAX;AAClB,MAAI,QAAQ,GAAG,CAAf,EAAkB,QAAQ,GAAG,CAAX;AAElB,QAAM,KAAK,GAAG,IAAI,GAAG,WAArB;AACA,QAAM,KAAK,GAAG,CAAC,IAAI,GAAG,IAAR,KAAkB,QAAQ,GAAG,QAAZ,IAAyB,CAA1C,CAAd;AACA,QAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,GAAL,CAAS,QAAQ,GAAG,KAApB,CAAxB;AAEA,SAAO,MAAM,CAAC,GAAP,CAAW,CAAC,KAAD,EAAQ,KAAR,KAAiB;AACjC,UAAM,MAAM,GAAG,IAAI,CAAC,GAAL,CAAS,KAAK,GAAG,KAAjB,CAAf;AAEA,WAAO;AACL,MAAA,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,KADb;AAEL,MAAA,CAAC,EAAE,QAAQ,GAAG,MAAX,GACD,EAAE,KAAK,GAAG,CAAV,IAAe,MAHZ;AAIL,MAAA,MAJK;AAKL,MAAA;AALK,KAAP;AAOD,GAVM,CAAP;AAWD","sourcesContent":["import { Point, Boundary, Bar } from '../VSparkline'\n\nexport function genPoints (\n values: number[],\n boundary: Boundary\n): Point[] {\n const { minX, maxX, minY, maxY } = boundary\n const totalValues = values.length\n const maxValue = Math.max(...values)\n const minValue = Math.min(...values)\n\n const gridX = (maxX - minX) / (totalValues - 1)\n const gridY = (maxY - minY) / ((maxValue - minValue) || 1)\n\n return values.map((value, index) => {\n return {\n x: minX + index * gridX,\n y:\n maxY -\n (value - minValue) * gridY +\n +(index === totalValues - 1) * 0.00001 -\n +(index === 0) * 0.00001,\n value,\n }\n })\n}\n\nexport function genBars (\n values: number[],\n boundary: Boundary\n): Bar[] {\n const { minX, maxX, minY, maxY } = boundary\n const totalValues = values.length\n let maxValue = Math.max(...values)\n let minValue = Math.min(...values)\n\n if (minValue > 0) minValue = 0\n if (maxValue < 0) maxValue = 0\n\n const gridX = maxX / totalValues\n const gridY = (maxY - minY) / ((maxValue - minValue) || 1)\n const horizonY = maxY - Math.abs(minValue * gridY)\n\n return values.map((value, index) => {\n const height = Math.abs(gridY * value)\n\n return {\n x: minX + index * gridX,\n y: horizonY - height +\n +(value < 0) * height,\n height,\n value,\n }\n })\n}\n"],"sourceRoot":"","file":"core.js"}
+32
View File
@@ -0,0 +1,32 @@
function int(value) {
return parseInt(value, 10);
}
/**
* https://en.wikipedia.org/wiki/Collinearity
* x=(x1+x2)/2
* y=(y1+y2)/2
*/
export function checkCollinear(p0, p1, p2) {
return int(p0.x + p2.x) === int(2 * p1.x) && int(p0.y + p2.y) === int(2 * p1.y);
}
export function getDistance(p1, p2) {
return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));
}
export function moveTo(to, from, radius) {
const vector = {
x: to.x - from.x,
y: to.y - from.y
};
const length = Math.sqrt(vector.x * vector.x + vector.y * vector.y);
const unitVector = {
x: vector.x / length,
y: vector.y / length
};
return {
x: from.x + unitVector.x * radius,
y: from.y + unitVector.y * radius
};
}
//# sourceMappingURL=math.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/components/VSparkline/helpers/math.ts"],"names":[],"mappings":"AAEA,SAAS,GAAT,CAAc,KAAd,EAAoC;AAClC,SAAO,QAAQ,CAAC,KAAD,EAAQ,EAAR,CAAf;AACD;AAED;;;;;;;AAKA,OAAM,SAAU,cAAV,CAA0B,EAA1B,EAAqC,EAArC,EAAgD,EAAhD,EAAyD;AAC7D,SAAO,GAAG,CAAC,EAAE,CAAC,CAAH,GAAO,EAAE,CAAC,CAAX,CAAH,KAAqB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAR,CAAxB,IAAsC,GAAG,CAAC,EAAE,CAAC,CAAH,GAAO,EAAE,CAAC,CAAX,CAAH,KAAqB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAR,CAArE;AACD;AAED,OAAM,SAAU,WAAV,CAAuB,EAAvB,EAAkC,EAAlC,EAA2C;AAC/C,SAAO,IAAI,CAAC,IAAL,CACL,IAAI,CAAC,GAAL,CAAS,EAAE,CAAC,CAAH,GAAO,EAAE,CAAC,CAAnB,EAAsB,CAAtB,IAA2B,IAAI,CAAC,GAAL,CAAS,EAAE,CAAC,CAAH,GAAO,EAAE,CAAC,CAAnB,EAAsB,CAAtB,CADtB,CAAP;AAGD;AAED,OAAM,SAAU,MAAV,CAAkB,EAAlB,EAA6B,IAA7B,EAA0C,MAA1C,EAAwD;AAC5D,QAAM,MAAM,GAAG;AAAE,IAAA,CAAC,EAAE,EAAE,CAAC,CAAH,GAAO,IAAI,CAAC,CAAjB;AAAoB,IAAA,CAAC,EAAE,EAAE,CAAC,CAAH,GAAO,IAAI,CAAC;AAAnC,GAAf;AACA,QAAM,MAAM,GAAG,IAAI,CAAC,IAAL,CAAW,MAAM,CAAC,CAAP,GAAW,MAAM,CAAC,CAAnB,GAAyB,MAAM,CAAC,CAAP,GAAW,MAAM,CAAC,CAArD,CAAf;AACA,QAAM,UAAU,GAAG;AAAE,IAAA,CAAC,EAAE,MAAM,CAAC,CAAP,GAAW,MAAhB;AAAwB,IAAA,CAAC,EAAE,MAAM,CAAC,CAAP,GAAW;AAAtC,GAAnB;AAEA,SAAO;AACL,IAAA,CAAC,EAAE,IAAI,CAAC,CAAL,GAAS,UAAU,CAAC,CAAX,GAAe,MADtB;AAEL,IAAA,CAAC,EAAE,IAAI,CAAC,CAAL,GAAS,UAAU,CAAC,CAAX,GAAe;AAFtB,GAAP;AAID","sourcesContent":["import { Point } from '../VSparkline'\n\nfunction int (value: string | number): number {\n return parseInt(value, 10)\n}\n\n/**\n * https://en.wikipedia.org/wiki/Collinearity\n * x=(x1+x2)/2\n * y=(y1+y2)/2\n */\nexport function checkCollinear (p0: Point, p1: Point, p2: Point): boolean {\n return int(p0.x + p2.x) === int(2 * p1.x) && int(p0.y + p2.y) === int(2 * p1.y)\n}\n\nexport function getDistance (p1: Point, p2: Point): number {\n return Math.sqrt(\n Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2)\n )\n}\n\nexport function moveTo (to: Point, from: Point, radius: number) {\n const vector = { x: to.x - from.x, y: to.y - from.y }\n const length = Math.sqrt((vector.x * vector.x) + (vector.y * vector.y))\n const unitVector = { x: vector.x / length, y: vector.y / length }\n\n return {\n x: from.x + unitVector.x * radius,\n y: from.y + unitVector.y * radius,\n }\n}\n"],"sourceRoot":"","file":"math.js"}
+26
View File
@@ -0,0 +1,26 @@
import { checkCollinear, getDistance, moveTo } from './math';
/**
* From https://github.com/unsplash/react-trend/blob/master/src/helpers/DOM.helpers.js#L18
*/
export function genPath(points, radius, fill = false, height = 75) {
const start = points.shift();
const end = points[points.length - 1];
return (fill ? `M${start.x} ${height - start.x + 2} L${start.x} ${start.y}` : `M${start.x} ${start.y}`) + points.map((point, index) => {
const next = points[index + 1];
const prev = points[index - 1] || start;
const isCollinear = next && checkCollinear(next, point, prev);
if (!next || isCollinear) {
return `L${point.x} ${point.y}`;
}
const threshold = Math.min(getDistance(prev, point), getDistance(next, point));
const isTooCloseForRadius = threshold / 2 < radius;
const radiusForPoint = isTooCloseForRadius ? threshold / 2 : radius;
const before = moveTo(prev, point, radiusForPoint);
const after = moveTo(next, point, radiusForPoint);
return `L${before.x} ${before.y}S${point.x} ${point.y} ${after.x} ${after.y}`;
}).join('') + (fill ? `L${end.x} ${height - start.x + 2} Z` : '');
}
//# sourceMappingURL=path.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/components/VSparkline/helpers/path.ts"],"names":[],"mappings":"AACA,SAAS,cAAT,EAAyB,WAAzB,EAAsC,MAAtC,QAAoD,QAApD;AAEA;;;;AAGA,OAAM,SAAU,OAAV,CAAmB,MAAnB,EAAoC,MAApC,EAAoD,IAAI,GAAG,KAA3D,EAAkE,MAAM,GAAG,EAA3E,EAA6E;AACjF,QAAM,KAAK,GAAG,MAAM,CAAC,KAAP,EAAd;AACA,QAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAP,GAAgB,CAAjB,CAAlB;AAEA,SACE,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC,CAAf,GAAmB,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAA7D,GAAkE,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAA7F,IACA,MAAM,CACH,GADH,CACO,CAAC,KAAD,EAAQ,KAAR,KAAiB;AACpB,UAAM,IAAI,GAAG,MAAM,CAAC,KAAK,GAAG,CAAT,CAAnB;AACA,UAAM,IAAI,GAAG,MAAM,CAAC,KAAK,GAAG,CAAT,CAAN,IAAqB,KAAlC;AACA,UAAM,WAAW,GAAG,IAAI,IAAI,cAAc,CAAC,IAAD,EAAO,KAAP,EAAc,IAAd,CAA1C;;AAEA,QAAI,CAAC,IAAD,IAAS,WAAb,EAA0B;AACxB,aAAO,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAA7B;AACD;;AAED,UAAM,SAAS,GAAG,IAAI,CAAC,GAAL,CAChB,WAAW,CAAC,IAAD,EAAO,KAAP,CADK,EAEhB,WAAW,CAAC,IAAD,EAAO,KAAP,CAFK,CAAlB;AAIA,UAAM,mBAAmB,GAAG,SAAS,GAAG,CAAZ,GAAgB,MAA5C;AACA,UAAM,cAAc,GAAG,mBAAmB,GAAG,SAAS,GAAG,CAAf,GAAmB,MAA7D;AAEA,UAAM,MAAM,GAAG,MAAM,CAAC,IAAD,EAAO,KAAP,EAAc,cAAd,CAArB;AACA,UAAM,KAAK,GAAG,MAAM,CAAC,IAAD,EAAO,KAAP,EAAc,cAAd,CAApB;AAEA,WAAO,IAAI,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAA3E;AACD,GArBH,EAsBG,IAtBH,CAsBQ,EAtBR,CADA,IAwBC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC,CAAf,GAAmB,CAAC,IAApC,GAA2C,EAxBhD,CADF;AA2BD","sourcesContent":["import { Point } from '../VSparkline'\nimport { checkCollinear, getDistance, moveTo } from './math'\n\n/**\n * From https://github.com/unsplash/react-trend/blob/master/src/helpers/DOM.helpers.js#L18\n */\nexport function genPath (points: Point[], radius: number, fill = false, height = 75) {\n const start = points.shift()!\n const end = points[points.length - 1]\n\n return (\n (fill ? `M${start.x} ${height - start.x + 2} L${start.x} ${start.y}` : `M${start.x} ${start.y}`) +\n points\n .map((point, index) => {\n const next = points[index + 1]\n const prev = points[index - 1] || start\n const isCollinear = next && checkCollinear(next, point, prev)\n\n if (!next || isCollinear) {\n return `L${point.x} ${point.y}`\n }\n\n const threshold = Math.min(\n getDistance(prev, point),\n getDistance(next, point)\n )\n const isTooCloseForRadius = threshold / 2 < radius\n const radiusForPoint = isTooCloseForRadius ? threshold / 2 : radius\n\n const before = moveTo(prev, point, radiusForPoint)\n const after = moveTo(next, point, radiusForPoint)\n\n return `L${before.x} ${before.y}S${point.x} ${point.y} ${after.x} ${after.y}`\n })\n .join('') +\n (fill ? `L${end.x} ${height - start.x + 2} Z` : '')\n )\n}\n"],"sourceRoot":"","file":"path.js"}
+4
View File
@@ -0,0 +1,4 @@
import VSparkline from './VSparkline';
export { VSparkline };
export default VSparkline;
//# sourceMappingURL=index.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/components/VSparkline/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAP,MAAuB,cAAvB;AAEA,SAAS,UAAT;AAEA,eAAe,UAAf","sourcesContent":["import VSparkline from './VSparkline'\n\nexport { VSparkline }\n\nexport default VSparkline\n"],"sourceRoot":"","file":"index.js"}